この記事は
udemyの「【画像判定AI自作にチャレンジ!】TensorFlow・Keras・Python・Flaskで作る機械学習アプリ開発入門」を受講して、学んだこと+αを自分なりにまとめたものです。
環境
以下の環境で実行しました。
- python 3.6.4
- keras 2.2.4
- tensorflow 1.10.0
必要なモジュールのインポート
import keras
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.utils import np_utils
簡単に解説を加えます。
keras.modelsについて
まず、インポートしているのは、Sequenceクラスです。
これは、ニューラルネットワークの各レイヤーの入れ物になるようなクラスです。
kerasでは、SequentialとModel の2つの入れ物クラスが用意されています。
比較的単純なネットワークならSequentialを、分岐があるような複雑なネットワークならModelを使えば良いようです。
keras.layersについて
次に、ニューラルネットワークの各層を構成するためのクラスをインポートしています。
- Conv2D : 2次元のConvolution層
- MaxPooling2D : 2次元のPooling層(Max Pooling)
- Activation : 活性化関数の層。reluとかsigmoidとかsoftmaxとかを指定できます。
- Dropout : ドロップアウト層。挿入すると、自動でドロップアウトしてくれます。
- Flatten : 多次元の配列を1次元の配列に変換します。
- Dense : 全結合層
これらのクラスのインスタンスをSequenceクラスのインスタンスに加えていくことで、層を構成していきます。具体的には後述。
学習用のネットワークの生成
以下のようにして、学習モデルに層を追加していきます。
この例では、modelという名前のSequentialクラスのインスタンスを作り、model.add(layerのインスタンス)を繰り返すことで層を積み重ねています。
最初の層のみ、入力データの次元を指定する必要があります。
X.shape[1:]としているのは、本記事には書いていない前段で
- X.shape[0] : 学習データの枚数
- X.shape[1] : 学習データの横幅
- X.shape[2] : 学習データの縦幅
となるようにデータを生成しているため、X.shape[1:]で、学習データの横幅、縦幅が指定できることになります。
model = Sequential()
model.add(Conv2D(32,(3,3), padding = "same", input_shape = X.shape[1:]))
model.add(Activation("relu"))
model.add(Conv2D(32,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(.25))
model.add(Conv2D(64,(3,3), padding = "same"))
model.add(Activation("relu"))
model.add(Conv2D(64,(3,3), padding = "same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation("relu"))
model.add(Dropout(.50))
model.add(Dense(4))
model.add(Activation("softmax"))
最後に、オプティマイザーを定義して、compileします。
以下の例では、rmspropオプティマイザーを使っていますが、Adam等も指定できます。
model.compile でモデルの完成です。
ここでは、引数として、損失関数、オプティマイザー、評価関数が渡されています。
opt = keras.optimizers.rmsprop(lr = 0.0001, decay=1e-6)
model.compile(
loss = "categorical_crossentropy",
optimizer = opt,
metrics = ["accuracy"],
)
学習
学習は、scikit-learnライクで、model.fit()
で実行できます。
引数にcallbacks
でオプションを入れることでEarly Stopping等を有効にして学習を実施できます。
model.save()で、学習済モデルをファイルとして保存できます。
model.fit(X_train, y_train, batch_size = 128, epochs = 100)
model.save("./animal_cnn_aug.h5")
参考
・udemy
【画像判定AI自作にチャレンジ!】TensorFlow・Keras・Python・Flaskで作る機械学習アプリ開発入門
https://www.udemy.com/tensorflow-advanced/
・Keras Documentation
https://keras.io/ja/models/about-keras-models/
https://keras.io/ja/