こんにちは。
GMOアドマーケティング、機械学習入門者のT.Mです。
はじめに
ゼロから作るDeep Learningを読み終え、
実際に何か作るにあたって何をしたらよいか調べていたところ
ニューラルネットワークのライブラリであるKerasを知り触ってみました。
いきなりKerasのサンプルソースを見てもさっぱり分からなかったので、
ゼロから作るDeep Learningで学習した内容とKerasドキュメントを参照しながら
見ていきたいと思います。
Kerasについて
Kerasについては公式ドキュメントを参照ください。
TensorFlow上で動く、ニューラルネットワークをより簡単に書けるようにした
ライブラリという認識です。
サンプルソース
Keras公式のサンプルソースから、
ゼロから作るDeep Learningでも5章までガッツリと書かれていたMLP(マルチレイヤーパーセプトロン)のサンプルを見ていきます。
サンプルソースを読む
サンプルソースから引用しながら見ていきます。
Kerasのライセンス表記です。
Copyright (c) 2015, François Chollet.
Copyright (c) 2015, Google, Inc.
Copyright (c) 2017, Microsoft, Inc.
Copyright (c) 2015 – 2017, the respective contributors.
Released under the MIT license
https://github.com/fchollet/keras/blob/master/LICENSE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
batch_size = 128 num_classes = 10 epochs = 20 # the data, shuffled and split between train and test sets (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train = x_train.reshape(60000, 784) x_test = x_test.reshape(10000, 784) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 print(x_train.shape[0], 'train samples') print(x_test.shape[0], 'test samples') # convert class vectors to binary class matrices y_train = keras.utils.to_categorical(y_train, num_classes) y_test = keras.utils.to_categorical(y_test, num_classes) |
最初の部分ですが、MNISTのデータをロードし、ニューラルネットワークに取り込めるようにデータを変換しています。
1 |
model = Sequential() |
どのようなニューラルネットワークなのかを定義しています。
Sequentialモデルはニューラルネットワークの各層を順番につなげたモデルを表します。
add()で層を追加していきます。
https://keras.io/ja/getting-started/sequential-model-guide/
1 |
model.add(Dense(512, activation='relu', input_shape=(784,))) |
最初の層として追加しています。
どんな層かというと、Dense()で定義されています。
このDenseは、全結合ニューラルネットワークになります。
この1行だけで1つのニューラルネットワークを表しています。
https://keras.io/ja/layers/core/#dense
Kerasのソースの方にも、
https://github.com/fchollet/keras/blob/master/keras/layers/core.py#L729
Just your regular densely-connected NN layer.
とあり、
Dense
implements the operation:
output = activation(dot(input, kernel) + bias)
と、ゼロから作るDeep Learningにも出てきたA・W+Bというニューラルネットワークになります。
このDenseの引数を見ると、下記の通りになっています。
- units・・・出力の数
- activation・・・活性化関数。reluを指定しています。
https://keras.io/ja/activations/#relu
活性化関数については、この記事も参照ください。 - input_shape・・・最初の層のときにだけ指定します。入力層の形を指定します。MNISTで扱う28×28=784のデータのことを表しています。
1 |
model.add(Dropout(0.2)) |
ドロップアウトの層になります。
ドロップアウトは、ゼロから作るDeep Learningの6章にも出てきました。
過学習を避けるために出力結果を間引くようになります。
引数はレートを指定します。
1 |
model.add(Dense(512, activation='relu')) |
第2層目のニューラルネットワークです。
出力の次元数は512、活性化関数は前回と同じくreluです。
1 |
model.add(Dropout(0.2)) |
またドロップアウトを指定しています。
1 |
model.add(Dense(10, activation='softmax')) |
最後に出力層として、次元数10(0〜9の数字なので)、活性化関数はSoftmaxを指定しています。
ここまでがSequentialモデルで定義したニューラルネットワークになります。
1 2 3 |
model.compile(loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy']) |
次に、compileメソッドは訓練の定義をします。
https://keras.io/ja/models/sequential/#compile
- loss・・・損失関数を指定します。ここでは、categorical_crossentropyが指定されています。
MNISTのような多クラス分類では、categorical_crossentropyを使用します。 - optimizer・・・最適化アルゴリズムを指定します。RMSpropを指定しています。
https://keras.io/ja/optimizers/#rmsprop
ゼロから作るDeep Learningには出てこない最適化アルゴリズムです。
書籍で出てきた内容としては、SGD、Adagrad、Adamがあります。 - metrics・・・評価関数を指定します。通常はmetrics=[‘accuracy’]を指定するとのこと。
https://keras.io/ja/metrics/
1 2 3 4 5 |
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test)) |
fitは、ニューラルネットワークの訓練を行います。
https://keras.io/ja/models/sequential/#fit
- 第1引数、第2引数・・・入力データとなります。
- batch_size・・・バッチサイズを指定します。
- epochs・・・訓練を行う回数を指定します。
- verbose・・・指定する数値により実行ログの出す内容が変わります。
- validation_data・・・評価用のデータを指定します。
- 戻り値・・・訓練の損失値と評価関数値が返ってきます。
1 |
score = model.evaluate(x_test, y_test, verbose=0) |
evaluateは、損失値を計算します。
https://keras.io/ja/models/sequential/#evaluate
- 第1引数、第2引数・・・評価用の入力データを指定します。
- verbose・・・進行状況の表示を指定します。0は出しません。
- 戻り値・・・テストデータの損失値を返します。
まとめ
いかがだったでしょうか?
最初はどこから手を付けたらよいか分かりませんでしたが、
ゼロから作るDeep Learningで学習した知識をベースに
Kerasのドキュメントを参照することでほんの少し読めるようになったと思います。
次は自分でニューラルネットワークを作っていきたいです。