Help us understand the problem. What is going on with this article?

kerasを使って簡単にCNNネットワークを実装・学習する方法

More than 1 year has passed since last update.

この記事は

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/

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away