Mugichoko's blog

Mugichoko’s blog

プログラミングを中心としたメモ書き.

Caffeを通してCNNを理解する #1

目標と現状

大局的目標

機械学習に関しては全くの初心者なので分からないことだらけだ.それでもConvolutional Neural Network (CNN) を学ぶ時が来た!実装もしないといけないので,Caffeを通して学んでいきたい.本シリーズの目標はCNNのことを全く知らない人間が少し理解することにある.

今回の目標

さて,最初の目標は良い教科書を揃え,自分が何が理解できていないのかを理解するところからだ!

現状

Caffeのサンプルを動かした(過去記事参照)程度.尚,画像処理や線形代数の基礎知識は備えているつもりです.

mugichoko.hatenablog.com

良質な教材

Caffeを使ったCNNによる手書き文字分類

このサイトに4つの記事があるが,これを読んで,私の基本的な疑問は全て解消された.構造的に,かつ適切な日本語で説明されており,これを読まないと損すると思ってしまうくらいだ.

li.nu

4つの記事の各項目を勝手ながら抜粋させて頂くと,ここから何が学べるか把握できると思う.いくつかのサイトを眺めたが,これがベストであり,これ以外は読まなくてもよいのではないかと思う.半日もあれば全て読めます.

  1. CNNの概要、データセットの準備
  2. CNNの構造と学習の仕組み
    • CNNの構造
    • 特徴抽出部
    • 畳み込みフィルタ
    • 畳み込み層
    • プーリング層
    • 識別部
    • 全結合層
    • 活性化関数
    • ここまでのまとめ
    • 誤差関数
    • 勾配降下法 (GD)
    • 確率的勾配降下法 (SGD)
    • 今回のまとめ
  3. prototxtの作成
    • prototxtとは
    • prototxtの基本文法
    • 4つのprototext
    • train.prototext / test.prototxt の作成
    • 各層の基本的な記述方法
    • 入力層 (Data)
    • 畳み込み層 (Convolution)
    • プーリング層 (Pooling)
    • 全結合層 (InnerProduct)
    • 活性化関数 (ReLU)
    • 誤差関数 (SoftmaxWithLoss)
    • solver.prototxtの書き方
    • 今回のまとめ
  4. ネットワークの訓練方法
    • フォルダ構成の確認
    • 訓練の方法
    • 訓練誤差とテスト誤差
    • 正答率の算出
    • 今回のまとめ

最終回のまとめに,

次は、訓練により出来上がった caffemodel を使って、実際の一般データを識別させる方法、つまり、deploy.prototxtの書き方とPyCaffeでの使い方について見ていきます。

とあるのですが,残念ながら5つ目の記事を見つけられませんでした... 残念.

更なる学習のために

英語教材

書籍

便利ツール

さて,概要を把握したところで,Caffeは,基本的にprototxtを編集して動かせることが分かった.ということで,これを編集するための便利ツールを探した.

Sublime Text 3

これ自体はただのテキストエディタですが,パッケージをインストールすることで,様々な拡張子のファイルを見やすいようにカラーリングしてくれるところが嬉しいのです.早速,proto buffやprototxtが見やすいようにパッケージをインストールした.

パッケージのインストール方法は以下の通り.

  1. Tools/Command Palette... Ctrl+Shift+Pを開いてinstallと入力(下図)
  2. Package Control: Install Packageを選択
  3. Proto等と入力してパッケージをインストール

f:id:Mugichoko:20171122001002p:plain

尚,私は以下の2つをインストールした.

  • Protobuf Syntax Highliting
  • Caffe Prototxt Syntax

Netscope

prototxtの内容を可視化してくれるオンラインサービス.手順は以下の通り.

  1. "Launch Editor"からエディタを開く
  2. 左画面のテキストメニューに自身のprototxtファイルの内容をコピペ
  3. Shift + Enterで右画面に可視化

CaffeのMNISTのサンプルにあるlenet_train_test.prototxtを可視化すると以下の様になる.ブロックにマウスオーバーすると,その詳細が見られる.

f:id:Mugichoko:20171121234217p:plain

まとめ

  • CNNに関わる処理の流れと専門用語をWebサイトを読んで把握した
  • Caffeで必要な処理を把握した(ただし,学習データを使って認識させる処理は不明)
  • 現状,講義を受けた学生状態(理解したつもりだが実践できるかどうか分からない状態)なので,次回は,prototxtを実際に編集してCaffeを実行する予定