#最初に
とりあえずKeras経由のDLに慣れるために、なんでも良いので動かすことを目的に下記URLで紹介されているデモコードを実行してみる。そしてコードに解らない点があったら調査&メモとして記録する。
Kerasによる、ものすごくシンプルな画像分類(りんごとオレンジ)
#事前準備
◯識別する画像の収集
Google画像検索で、リンゴとオレンジの画像をDLしてローカルのフォルダに配置する。
Training:20個、Test:5個
train/apple/…
/orange/…
test/apple/…
/orange/…
◯追加ライブラリの導入
・numpy
(ナムパイ/ナンパイ)は、数値計算を効率的に行うためのライブラリで多次元配列(ベクトル・行列)の演算が可能
・pillow
画像処理ライブラリで、Python Imaging Library (PIL)の fork プロジェクト
#画像識別 〜処理の大まかな流れ
①学習用データ作成
②モデル生成・ニューラルネット構築
③学習の実行
④モデル予測と正解との比較 →正解率
#①学習用データ作成
・クラスラベル(正解)は、ディレクトリ配置から取得
・画像を25 x25ピクセルに変換
・[R,G,B]3要素のnumpy配列化する
1画像:25x25ピクセル分の配列
1ピクセル:[244 245 250]のような感じ
・Transpose→Reshapeで一次元配列に。
[ 244. 244. 244. ..., 238. 240. 241.]
要素数は、25x25個
#②モデル生成
model = Sequential() #Sequentialモデル(系列) の定義。層を積み重ねたもの
model.add(Dense(200, input_dim=1875)) #addメソッドで層を追加
#Denseは、通常の全結合ニューラルネットワークレイヤー。
#モデルは(*, 1875)次元の入力配列となり,(*, 200)次元の出力配列となる
model.add(Activation(“relu”))
model.add(Dropout(0.2)) #入力にドロップアウトを適用.訓練時のそれぞれの更新において入力ユニットのpをランダムに0にセットすることであり過学習を防ぐのを助ける
model.add(Dense(200))
model.add(Activation("relu"))
model.add(Dropout(0.2))
model.add(Dense(2))
model.add(Activation(“softmax”)) #Softmaxは入力の最後の次元に適用
ReLU (Rectified Linear Unit)で活性化関数を追加
参考:http://www.procrasist.com/entry/
#③学習の実行
◯モデルをコンパイル
→モデルの最適化(勾配法)には、Adamを使用。(重み付けの手法)
参考:http://qiita.com/tokkuman/items/1944c00415d129ca0ee9
→目的関数(ロス関数や最適スコア関数)は、categorical_crossentropy
categorical_crossentropy: マルチクラスlogloss
◯学習の実行(fit)
→引数
batch_size: 勾配更新毎のサンプル数を示す整数.
nb_epoch: 学習データ配列の反復回数を示す整数.
validation_split: バリデーションデータとして使われる学習データの割合。モデルはこの割合の学習データを区別しそれらでは学習を行わず,各試行の終わりにこのデータにおける損失とモデルメトリクスを評価
#④モデル予測と正解との比較 →正解率
◯テストデータ作成
・トレーニングデータと同じ加工
◯モデル予測と正解との比較 →正解率
・model.predict_classesで、クラスラベルを予想
・クラスラベル(正解)は、ディレクトリ配置から取得
・予想と正解の一致を集計
##まとめ
今回は殆どデモコードに沿って実行してみたに過ぎないが、Kerasでとてもコンパクトに画像分類が実装できることを実体験した。ただし今回、分類のための方法はかなり単純なものとなっているので、より複雑な分類を行うには前処理としてのデータ加工にパワーを掛ける必要がありそうに思った。