FC2カウンター FPGAの部屋 2018年07月27日
FC2ブログ

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

FPGAの部屋

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

白線間走行用CNNをKerasで学習する

「ゼロから作るDeep Learning」のMNISTデータを使用してKerasで学習する”で「ゼロから作るDeep Learning」のMNISTデータを使用してKerasで学習した。今回は、白線間走行用CNN をKeras で学習する。

まずは、白線間走行用CNN の学習データはデータのシャッフルができていないので、今回 Keras で学習するときにデータをシャッフルしたい。ミニバッチで学習するときに不利だと思うからだ。
Python でトレーニングデータをシャッフルするのだが、トレーニング用のラベルデータも同時にシャッフルする必要がある。どうやるか考えながら検索していると、”zip()を使って複数配列(array, list)をshuffleする-python”を見つけた。これはやりたいことにぴったりだった。
実際に使用したPython コードを示す。

(x_train, y_train), (x_test, y_test) = load_mnist(normalize=False, flatten=False)
print('x_train shape:', x_train.shape)
print('y_train shape:', y_train.shape)

# トレーニングデータとテストデータをシャッフル
trainzip = list(zip(y_train, x_train))
np.random.shuffle(trainzip)
y_train, x_train = zip(*trainzip)
x_train = np.asarray(x_train)
y_train = np.asarray(y_train)

testzip = list(zip(y_test, x_test))
np.random.shuffle(testzip)
y_test, x_test = zip(*testzip)
x_test = np.asarray(x_test)
y_test = np.asarray(y_test)


結果を示す。
keras_mnist_zero_6_180727.png
keras_mnist_zero_7_180727.png
keras_mnist_zero_8_180727.png

x_train shape: (34650, 1, 10, 56)
y_train shape: (34650,)
x_train shape: (34650, 10, 56, 1)
34650 train samples
26550 test samples
Train on 34650 samples, validate on 26550 samples
Epoch 1/8
34650/34650 [==============================] - 6s 170us/step - loss: 0.5659 - acc: 0.7551 - val_loss: 0.4968 - val_acc: 0.7847
Epoch 2/8
34650/34650 [==============================] - 5s 152us/step - loss: 0.2709 - acc: 0.8988 - val_loss: 0.2481 - val_acc: 0.9006
Epoch 3/8
34650/34650 [==============================] - 5s 152us/step - loss: 0.1726 - acc: 0.9386 - val_loss: 0.1631 - val_acc: 0.9456
Epoch 4/8
34650/34650 [==============================] - 5s 158us/step - loss: 0.1273 - acc: 0.9540 - val_loss: 0.2028 - val_acc: 0.9261
Epoch 5/8
34650/34650 [==============================] - 5s 158us/step - loss: 0.1025 - acc: 0.9616 - val_loss: 0.1651 - val_acc: 0.9376
Epoch 6/8
34650/34650 [==============================] - 6s 163us/step - loss: 0.0861 - acc: 0.9673 - val_loss: 0.1170 - val_acc: 0.9532
Epoch 7/8
34650/34650 [==============================] - 5s 154us/step - loss: 0.0760 - acc: 0.9705 - val_loss: 0.1007 - val_acc: 0.9618
Epoch 8/8
34650/34650 [==============================] - 5s 153us/step - loss: 0.0672 - acc: 0.9733 - val_loss: 0.0957 - val_acc: 0.9647


テストデータでの精度は 0.9647 だった。
この白線間走行用CNN の学習は、うまく行かないことも多い。何度もトライして一番良さそうな値を採用した。
epochs ごとの精度のグラフを示す。
keras_mnist_zero_9_180727.png

テストデータがあばれているのが分かる。
最後にPython コードを貼っておく。

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

import sys, os
sys.path.append(os.pardir)  # 親ディレクトリのファイルをインポートするための設定
from dataset_curve.curve_dataset import load_mnist
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D, Activation
from keras import backend as K

import numpy as np

batch_size = 128
num_classes = 3
epochs = 8

img_rows, img_cols = 10, 56

(x_train, y_train), (x_test, y_test) = load_mnist(normalize=False, flatten=False)
print('x_train shape:', x_train.shape)
print('y_train shape:', y_train.shape)

# トレーニングデータとテストデータをシャッフル
trainzip = list(zip(y_train, x_train))
np.random.shuffle(trainzip)
y_train, x_train = zip(*trainzip)
x_train = np.asarray(x_train)
y_train = np.asarray(y_train)

testzip = list(zip(y_test, x_test))
np.random.shuffle(testzip)
y_test, x_test = zip(*testzip)
x_test = np.asarray(x_test)
y_test = np.asarray(y_test)

#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(2, kernel_size=(5, 5),
                 input_shape=input_shape))
model.add(Activation(activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(100))
model.add(Activation(activation='relu'))
model.add(Dense(num_classes))
model.add(Activation(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))

  1. 2018年07月27日 04:32 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0