Keras-convolution-neural-network

提供:Dev Guides
移動先:案内検索

Keras-畳み込みニューラルネットワーク

以前の桁識別問題のために、モデルをMPLから* Convolution Neural Network(CNN)*に変更してみましょう。

CNNは以下のように表すことができます-

たたみ込みニューラルネットワーク

モデルのコア機能は次のとおりです-

  • 入力層は(1、8、28)の値で構成されます。
  • 最初のレイヤー、 _ Conv2D_ は32個のフィルターとカーネルサイズ(3,3)の「relu」アクティベーション関数で構成されています。
  • 2番目のレイヤー、 _ Conv2D_ は64個のフィルターとカーネルサイズ(3,3)の「relu」アクティベーション関数で構成されています。
  • 3番目のレイヤー、 _ MaxPooling_ のプールサイズは(2、2)です。
  • 5番目のレイヤー、 _ Flatten_ は、すべての入力を単一の次元に平坦化するために使用されます。
  • 第6層、 _ Dense_ は、128個のニューロンと「relu」活性化関数で構成されています。
  • 7番目のレイヤー、 _ Dropout_ の値は0.5です。
  • 8番目の最後の層は、10個のニューロンと「softmax」アクティベーション機能で構成されています。
  • categorical_crossentropy を損失関数として使用します。
  • オプティマイザーとして* Adadelta()*を使用します。
  • *精度*を指標として使用します。
  • バッチサイズとして128を使用します。
  • エポックとして20を使用します。

ステップ1-モジュールをインポートする

必要なモジュールをインポートしましょう。

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
import numpy as np

ステップ2-データの読み込み

mnistデータセットをインポートしましょう。

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

ステップ3-データを処理する

モデルに合わせてデータセットを変更して、モデルにフィードできるようにします。

img_rows, img_cols = 28, 28

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

y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

データ処理は、入力データの形状と画像フォーマット構成を除いて、MPLモデルと同様です。

ステップ4-モデルを作成する

実際のモデルを作成してみましょう。

model = Sequential()
model.add(Conv2D(32, kernel_size = (3, 3),
   activation = 'relu', input_shape = input_shape))
model.add(Conv2D(64, (3, 3), activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(Dropout(0.25)) model.add(Flatten())
model.add(Dense(128, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation = 'softmax'))

ステップ5-モデルをコンパイルする

選択した損失関数、オプティマイザー、およびメトリックを使用してモデルをコンパイルしてみましょう。

model.compile(loss = keras.losses.categorical_crossentropy,
   optimizer = keras.optimizers.Adadelta(), metrics = ['accuracy'])

ステップ6-モデルのトレーニング

  • fit()*メソッドを使用してモデルをトレーニングしてみましょう。
model.fit(
   x_train, y_train,
   batch_size = 128,
   epochs = 12,
   verbose = 1,
   validation_data = (x_test, y_test)
)

アプリケーションを実行すると、以下の情報が出力されます-

Train on 60000 samples, validate on 10000 samples Epoch 1/12
60000/60000 [==============================] - 84s 1ms/step - loss: 0.2687
- acc: 0.9173 - val_loss: 0.0549 - val_acc: 0.9827 Epoch 2/12
60000/60000 [==============================] - 86s 1ms/step - loss: 0.0899
- acc: 0.9737 - val_loss: 0.0452 - val_acc: 0.9845 Epoch 3/12
60000/60000 [==============================] - 83s 1ms/step - loss: 0.0666
- acc: 0.9804 - val_loss: 0.0362 - val_acc: 0.9879 Epoch 4/12
60000/60000 [==============================] - 81s 1ms/step - loss: 0.0564
- acc: 0.9830 - val_loss: 0.0336 - val_acc: 0.9890 Epoch 5/12
60000/60000 [==============================] - 86s 1ms/step - loss: 0.0472
- acc: 0.9861 - val_loss: 0.0312 - val_acc: 0.9901 Epoch 6/12
60000/60000 [==============================] - 83s 1ms/step - loss: 0.0414
- acc: 0.9877 - val_loss: 0.0306 - val_acc: 0.9902 Epoch 7/12
60000/60000 [==============================] - 89s 1ms/step - loss: 0.0375
-acc: 0.9883 - val_loss: 0.0281 - val_acc: 0.9906 Epoch 8/12
60000/60000 [==============================] - 91s 2ms/step - loss: 0.0339
- acc: 0.9893 - val_loss: 0.0280 - val_acc: 0.9912 Epoch 9/12
60000/60000 [==============================] - 89s 1ms/step - loss: 0.0325
- acc: 0.9901 - val_loss: 0.0260 - val_acc: 0.9909 Epoch 10/12
60000/60000 [==============================] - 89s 1ms/step - loss: 0.0284
- acc: 0.9910 - val_loss: 0.0250 - val_acc: 0.9919 Epoch 11/12
60000/60000 [==============================] - 86s 1ms/step - loss: 0.0287
- acc: 0.9907 - val_loss: 0.0264 - val_acc: 0.9916 Epoch 12/12
60000/60000 [==============================] - 86s 1ms/step - loss: 0.0265
- acc: 0.9920 - val_loss: 0.0249 - val_acc: 0.9922

ステップ7-モデルを評価する

テストデータを使用してモデルを評価してみましょう。

score = model.evaluate(x_test, y_test, verbose = 0)

print('Test loss:', score[0])
print('Test accuracy:', score[1])

上記のコードを実行すると、以下の情報が出力されます-

Test loss: 0.024936060590433316
Test accuracy: 0.9922

テストの精度は99.22%です。 手書きの数字を識別するための最適なモデルを作成しました。

ステップ8-予測

最後に、以下のように画像から数字を予測します-

pred = model.predict(x_test)
pred = np.argmax(pred, axis = 1)[:5]
label = np.argmax(y_test,axis = 1)[:5]

print(pred)
print(label)

上記のアプリケーションの出力は次のとおりです-

[7 2 1 0 4]
[7 2 1 0 4]

両方の配列の出力は同一であり、モデルが最初の5つの画像を正しく予測していることを示しています。