KerasはTensorFlowのラッパーであり、TensorFlowと比べ簡単にモデルを作成することができます。
そこで今回はKerasを用いて多層パーセプトロンを作成し、MNISTの学習を行いました。
MNISTへのアクセス
MNISTは0~9の手書き数字画像のデータベースです。
MNISTの画像数は70000枚であります。そのうち60000枚は学習用のセットであり、10000枚はテスト用のセットです。
画像サイズは縦28×横28です。
MNISTは非常に有名であることから、ニューラルネットワーク等のテストとしてよく用いられます。
TensorFlow版の多層パーセプトロンによるMNISTの学習については、下記の記事を参照してください。
KerasからMNISTへのアクセスは次のように行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
################################################## # MNIST ################################################## (x_train, t_train), (x_test, t_test) = mnist.load_data() reshape = 28 * 28 x_train = x_train.reshape(60000, reshape) x_test = x_test.reshape(10000, reshape) x_train = x_train.astype("float32") x_test = x_test.astype("float32") x_train /= 255 x_test /= 255 #one-hot表記に変換 t_train = np_utils.to_categorical(t_train, 10) t_test = np_utils.to_categorical(t_test, 10) |
作成モデル
使用した多層パーセプトロンのモデルを示します。
- 階層は3とし、各階層のユニット数は入力から、784, 128, 128, 10
- 活性化関数はRelu関数を使用
- 出力層にはソフトマックスを使用
- 誤差関数には交差エントロピー誤差関数を使用
また今回はKerasのSequentialモデルを用いて多層パーセプトロンを作成しました。
KerasにはSequentialモデルとfunctional APIを使用したモデルの二つがあります。functional APIを使用したほうがより高度なモデルを作成できますが、Sequentialモデルは非常に簡単にモデルを作成することができます。
コード
使用したコードを下記に示します。実行はPython 3.6、TensorFlow 1.8、Keras 2.2.2を用いました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
import numpy as np from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Activation from keras.optimizers import SGD from keras.utils import np_utils np.random.seed(1991) ################################################## # MNIST ################################################## (x_train, t_train), (x_test, t_test) = mnist.load_data() reshape = 28 * 28 x_train = x_train.reshape(60000, reshape) x_test = x_test.reshape(10000, reshape) x_train = x_train.astype("float32") x_test = x_test.astype("float32") x_train /= 255 x_test /= 255 #one-hot表記に変換 t_train = np_utils.to_categorical(t_train, 10) t_test = np_utils.to_categorical(t_test, 10) ################################################## # Classs ################################################## class my_Net: def __init__(self): self.Epoch = 20 self.Batch_size = 50 self.Verbose = 1 #ログの出力モード切替 : 1 プログレスバーで表示 self.output_size = 10 self.optimize = SGD() self.hidden_units = 128 self.Validation_split = 0.2 #訓練データの中で検証データとして扱う割合 self.Reshape = 28 * 28 self.model = Sequential() def make_net(self): self.model.add(Dense(self.hidden_units, input_shape=(self.Reshape,))) #全結合1層目 self.model.add(Activation("relu")) self.model.add(Dense(self.hidden_units)) #全結合2層目 self.model.add(Activation("relu")) self.model.add(Dense(self.output_size)) #出力層 self.model.add(Activation("softmax")) self.model.summary() def model_compile(self): self.model.compile(loss="categorical_crossentropy", #交差エントロピー誤差関数 optimizer=self.optimize, #確率的勾配下降法 metrics=["accuracy"]) def make_model(self): self.make_net() self.model_compile() def train(self, x, t): self.model.fit(x, t, batch_size=self.Batch_size, epochs=self.Epoch, verbose=self.Verbose, validation_split=self.Validation_split) def score(self, x, t): return self.model.evaluate(x, t, verbose=self.Verbose) ################################################## # Main ################################################## net = my_Net() net.make_model() net.train(x_train, t_train) score = net.score(x_test, t_test) print("\nTest loss:", score[0]) print("\nTest accuracy:", score[1]) |
このように多層パーセプトロンによる学習を、80行ほどのコードで書くことができました。TensorFlowによる多層パーセプトロンと比べるとコードの量が半分近くで書くことができます。
実行結果
実行結果を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
Using TensorFlow backend. _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_1 (Dense) (None, 128) 100480 _________________________________________________________________ activation_1 (Activation) (None, 128) 0 _________________________________________________________________ dense_2 (Dense) (None, 128) 16512 _________________________________________________________________ activation_2 (Activation) (None, 128) 0 _________________________________________________________________ dense_3 (Dense) (None, 10) 1290 _________________________________________________________________ activation_3 (Activation) (None, 10) 0 ================================================================= Total params: 118,282 Trainable params: 118,282 Non-trainable params: 0 _________________________________________________________________ Train on 48000 samples, validate on 12000 samples Epoch 1/20 48000/48000 [==============================] - 5s 105us/step - loss: 0.9033 - acc: 0.7659 - val_loss: 0.3940 - val_acc: 0.8954 Epoch 2/20 48000/48000 [==============================] - 3s 53us/step - loss: 0.3676 - acc: 0.8975 - val_loss: 0.3068 - val_acc: 0.9136 省略 Epoch 19/20 48000/48000 [==============================] - 3s 56us/step - loss: 0.1089 - acc: 0.9695 - val_loss: 0.1277 - val_acc: 0.9649 Epoch 20/20 48000/48000 [==============================] - 3s 55us/step - loss: 0.1043 - acc: 0.9710 - val_loss: 0.1236 - val_acc: 0.9652 10000/10000 [==============================] - 0s 28us/step Test loss: 0.1174773828573525 Test accuracy: 0.966 |
Kerasは1 Epochにかかった時間や、学習データの判定率、検証データの判定率等を表示してくれます。
このようにKerasなら大きな設定をしなくても、途中経過を表示してくれます。
また多層パーセプトロンの判定率も96.6%となっており、正しく学習することができています。
まとめ
- Keras版の多層パーセプトロンを用いてMNISTの学習を行った
- Kerasによるモデルの作成方法は二つあり、今回は簡単に作成できるSequentialモデルを使用した
- Kerasなら学習の途中経過を少しの設定で表示してくれる
関連記事