DeepLearning
Keras
TensorFlow

Kerasを触ってみた その①「りんごとオレンジの画像判別」(2017/5/23)

More than 1 year has passed since last update.

最初に

 とりあえず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でとてもコンパクトに画像分類が実装できることを実体験した。ただし今回、分類のための方法はかなり単純なものとなっているので、より複雑な分類を行うには前処理としてのデータ加工にパワーを掛ける必要がありそうに思った。