FC2カウンター FPGAの部屋 TensorFlow + Kerasを使ってみた3(以前使用したCNNを使った学習)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

TensorFlow + Kerasを使ってみた3(以前使用したCNNを使った学習)

TensorFlow + Kerasを使ってみた2(実践編)”の続き。

TensorFlow + Kerasを使ってみた2(実践編)”で使用した”Keras / Tensorflowで始めるディープラーニング入門”の Python コードをそのまま再利用させて頂いて、”「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化5(再度学習)”の CNN を学習していこう。これは MNIST の手書き数字を認識するCNN で畳み込み層の特徴マップの数は 10 個となっている。

まずは、Python コードを示す。

# My Mnist CNN
# Conv2D - ReLU - MaxPooling - Dence - ReLU - Dence
# 2018/05/25 by marsee
# Keras / Tensorflowで始めるディープラーニング入門 https://qiita.com/yampy/items/706d44417c433e68db0d
# のPythonコードを再利用させて頂いている

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K

batch_size = 128
num_classes = 10
epochs = 12

img_rows, img_cols = 28, 28

(x_train, y_train), (x_test, y_test) = mnist.load_data()

#Kerasのバックエンドで動くTensorFlowとTheanoでは入力チャンネルの順番が違うので場合分けして書いています
if K.image_data_format() == 'channels_first':
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)
else:
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

y_train = y_train.astype('int32')
y_test = y_test.astype('int32')
y_train = keras.utils.np_utils.to_categorical(y_train, num_classes)
y_test =  keras.utils.np_utils.to_categorical(y_test, num_classes)

model = Sequential()
model.add(Conv2D(10, kernel_size=(5, 5),
                 activation='relu',
                 input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs,
          verbose=1, validation_data=(x_test, y_test))


結果を示す。

('x_train shape:', (60000, 28, 28, 1))
(60000, 'train samples')
(10000, 'test samples')
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
60000/60000 [==============================] - 16s 265us/step - loss: 0.2680 - acc: 0.9204 - val_loss: 0.1202 - val_acc: 0.9640
Epoch 2/12
60000/60000 [==============================] - 16s 261us/step - loss: 0.0822 - acc: 0.9754 - val_loss: 0.0626 - val_acc: 0.9792
Epoch 3/12
60000/60000 [==============================] - 16s 260us/step - loss: 0.0558 - acc: 0.9830 - val_loss: 0.0476 - val_acc: 0.9845
Epoch 4/12
60000/60000 [==============================] - 15s 256us/step - loss: 0.0429 - acc: 0.9869 - val_loss: 0.0470 - val_acc: 0.9842
Epoch 5/12
60000/60000 [==============================] - 15s 254us/step - loss: 0.0349 - acc: 0.9891 - val_loss: 0.0369 - val_acc: 0.9867
Epoch 6/12
60000/60000 [==============================] - 17s 279us/step - loss: 0.0290 - acc: 0.9910 - val_loss: 0.0376 - val_acc: 0.9871
Epoch 7/12
60000/60000 [==============================] - 16s 274us/step - loss: 0.0238 - acc: 0.9927 - val_loss: 0.0372 - val_acc: 0.9877
Epoch 8/12
60000/60000 [==============================] - 16s 261us/step - loss: 0.0204 - acc: 0.9940 - val_loss: 0.0328 - val_acc: 0.9884
Epoch 9/12
60000/60000 [==============================] - 15s 251us/step - loss: 0.0172 - acc: 0.9947 - val_loss: 0.0334 - val_acc: 0.9878
Epoch 10/12
60000/60000 [==============================] - 15s 254us/step - loss: 0.0146 - acc: 0.9957 - val_loss: 0.0342 - val_acc: 0.9889
Epoch 11/12
60000/60000 [==============================] - 15s 254us/step - loss: 0.0123 - acc: 0.9966 - val_loss: 0.0359 - val_acc: 0.9878
Epoch 12/12
60000/60000 [==============================] - 15s 257us/step - loss: 0.0109 - acc: 0.9968 - val_loss: 0.0340 - val_acc: 0.9889


accuracy は 0.9889 だった。

次に、accuracy と loss のグラフを書いてみた。これも”Keras / Tensorflowで始めるディープラーニング入門”の Python コードをそのまま再利用させて頂いている。

# Keras / Tensorflowで始めるディープラーニング入門 https://qiita.com/yampy/items/706d44417c433e68db0d
# のPythonコードを再利用させて頂いている

%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt

plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()

# plot the loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()


描画されたグラフを示す。
tensorflow_keras_31_180525.png

多少 train と test の間が離れているが、test の accuracy は振動はしているが、増加はしているので、まだ過学習ではないと思うがいかがだろうか?

最後に、Jupyter Notebook の画像を貼っておく。
tensorflow_keras_27_180525.png
tensorflow_keras_28_180525.png
tensorflow_keras_29_180525.png
tensorflow_keras_30_180525.png
  1. 2018年05月25日 04:42 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/4178-3e0d5702
この記事にトラックバックする(FC2ブログユーザー)