Kerasを使ったCNNモデル(MNIST)
初投稿なのでDeepLearningチュートリアルでよくやる、MNISTをCNNで認識するモデルを書きました。Github
開発環境
- Python 3.6.4
- Keras 2.1.2
- tensorflow 1.4.1 (backend)
CPUでも十分学習動きます。
モデル構造
モデルは5層の畳み込みと2層のMaxPoolingとなっています。
特に名前のついたモデルではなくニュアンスで作りました。
def prepare_simple_CNN_model(input_shape=(28, 28, 1), class_num=10):
input = Input(input_shape)
kernel_size = (3, 3)
max_pool_size = (2, 2)
cnn = Conv2D(64, kernel_size, padding='same', activation='relu')(input)
cnn = Dropout(0.1)(cnn)
cnn = Conv2D(64, kernel_size, padding='same', activation='relu')(cnn)
cnn = Dropout(0.1)(cnn)
cnn = Conv2D(64, kernel_size, padding='same', activation='relu')(cnn)
cnn = Dropout(0.1)(cnn)
cnn = MaxPooling2D(pool_size=max_pool_size, strides=(2, 2))(cnn)
cnn = Conv2D(64, kernel_size, padding='same', activation='relu')(cnn)
cnn = Dropout(0.1)(cnn)
cnn = Conv2D(64, kernel_size, padding='same', activation='relu')(cnn)
cnn = Dropout(0.1)(cnn)
cnn = Conv2D(64, kernel_size, padding='same', activation='relu')(cnn)
cnn = MaxPooling2D(pool_size=max_pool_size, strides=(2, 2))(cnn)
fc = Flatten()(cnn)
fc = Dense(1024, activation='relu')(fc)
softmax = Dense(class_num, activation='softmax')(fc)
model = Model(input=input, output=softmax)
return model
model.pyを実行するとモデルの構造を画像として保存します。
python model.py
学習
train.pyを実行すると学習が始まります。
バッチサイズやエポック数などをオプションで選択できます。
学習のエポックごとに学習したモデルが保存されます。(デフォルトでは'model/'配下)
python train.py
検証
model_path変数に学習済みモデルを指定し、predict.pyを実行すると認識率が表示されます。
model_path = 'model/MNIST_test_epoch_01_model.hdf5'
2エポック学習させると認識率は98.83%となりました。
適当に作った割には少しの学習でそこそこの認識率になりました。
学習時間はCPUで20分くらい。
まとめ
DeepLearningのライブラリには必ず入っているMNISTのチュートリアルコードですが
モデルの保存や学習済みモデルでの検証など最初にやってみたくなることを盛り込んだつもりです。
興味あるモデルを気が向いた時に実装しようと思ってます。
最近はドメイン学習やMulti task学習に興味があるのでMNISTでの自己符号化器とクラス分類を組み合わせたモデルを書こうと思っています。→ 書きました
コードや文章の間違い等ありましたらコメントお願いします。