今回から、いよいよKeras のexample を見ていきます。

まずは、Deep Learning のチュートリアルでおなじみ、mnist をシンプルな3層ニューラルネットでモデル化するコードを見ていきます。今回対象のコードは下記です。

https://github.com/fchollet/keras/blob/master/examples/mnist_mlp.py

mnistとは、Mixed National Institute of Standards and Technology database」の略で、手書きの数字「0~9」に正解ラベルが与えられているデータセットです。

まずは、データの読み込みを行います。

60000枚のデータが学習用のデータとして提供され、10000枚のデータがモデルの検証用として提供されています。x_ が説明変数、y_ が目的変数です。x_ は一枚の画像について、28×28=784点のデータで提供されるので、x_train は 60000×784の配列データとなります。このままでは扱いづらいので、reshape 関数により、画像ごと×データの2次元配列に置き換えます。また、x_ の値は0から255の値が格納されており、Kerasを使う上では0〜1に正規化する方が良いモデルができるため、255で割っています。

<code>
from __future__ import print_function

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop

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’)
</code>

次に、y_ をone hot vector に加工します。

Keras ではカテゴリを目的変数にする際には、one hot vector 形式にします。0から9の値が入っているので、下記のように表す10次元のデータになります。
0:0000000001
1:0000000010
2:0000000100

9:1000000000

<code>
# 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)
</code>

いよいよモデル作成。

3層ニューラルネット+dropout としています。入力は784個の画素なので、input_shape=784。活性化関数は、個人的には特に考えがなければrelu を使うと良いと思います。この辺りは、いろいろなサイトでどの活性化関数が良いか、議論されています。
http://www.procrasist.com/entry/2017/01/12/200000

dropoutは、ニューラルネットを学習させる際に、意図的に一部のネットワークをランダムに切断させることで、汎化性能が向上するテクニックです。簡単な割に効果的なので入れることを検討すると良いでしょう。欠点は学習の進みが遅くなります。最後のレイヤの出力は、softmax としましょう。これは、10次元のうち、一番大きい値の次元のベクトル値を1に近くして、他を0に近くする関数。これを用いて分類問題の正誤判定を行うことで、学習をより良くできます。

<code>
model = Sequential()
model.add(Dense(512, activation=’relu’, input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation=’relu’))
model.add(Dropout(0.2))
model.add(Dense(10, activation=’softmax’))
model.summary()
</code>

最後に学習+評価を見てみます。

評価関数は、クロスエントロピーなのですが、クラス分類問題なので、categorical_crossentropy を用います。最適化関数は、RMSpropを用いています。学習は、fit関数で行うことができ、評価は、evaluate関数で行うことができます。こうしてみると流れは、以前のロジスティック回帰とほとんど同じだとわかると思います。こういったところが便利ではないでしょうか。

<code>
model.compile(loss=’categorical_crossentropy’,
optimizer=RMSprop(),
metrics=[‘accuracy’])

history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print(‘Test loss:’, score[0])
print(‘Test accuracy:’, score[1])
</code>

こうして作成したモデルは、なんと精度98%を超えたものができます。すごいですね。

次回は畳み込みニューラルネットを見ていきます。(Sho.)