CIFAR-10のデータセットを用いてCNNの画像認識を行ってみる
Kerasを用いてCNNを使用して画像認識を行ってみます。使用するデータはCIFAR-10と呼ばれるもので、飛行機、鳥、犬などの10種類の分類を行うことができます。全体画像数は60000件となり、そのうち50000件が訓練用データ、残り10000件がテスト用データに分けられます。CIFAR-10はKerasのデータセットに用意されているので、簡単にインポートして実行することが出来ます。
使用するデータ
使用データ:CIFAR-10
訓練用データ:50000
テストデータ:10000
説明変数:画像データ
目的変数::10クラス問題(下記参照)
回帰/識別:識別(10クラス)
識別方法:CNN
ソースコード
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 |
#CIFAR-10のデータセットのインポート from keras.datasets import cifar10 (X_train, Y_train), (X_test, Y_test) = cifar10.load_data() #CIFAR-10の正規化 from keras.utils import to_categorical # 特徴量の正規化 X_train = X_train/255. X_test = X_test/255. # クラスラベルの1-hotベクトル化 Y_train = to_categorical(Y_train, 10) Y_test = to_categorical(Y_test, 10) # CNNの構築 import keras from keras.models import Sequential from keras.layers.convolutional import Conv2D, MaxPooling2D from keras.layers.core import Dense, Dropout, Activation, Flatten import numpy as np model = Sequential() model.add(Conv2D(32, (3, 3), padding='same',input_shape=X_train.shape[1:])) model.add(Activation('relu')) model.add(Conv2D(32, (3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Conv2D(64, (3, 3), padding='same')) model.add(Activation('relu')) model.add(Conv2D(64, (3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(10)) model.add(Activation('softmax')) # コンパイル model.compile(loss='categorical_crossentropy',optimizer='SGD',metrics=['accuracy']) #訓練 history = model.fit(X_train, Y_train, epochs=20) # モデルの保存 model.save('./CIFAR-10.h5') #評価 & 評価結果出力 print(model.evaluate(X_test, Y_test)) #モデルの図示化 from keras.utils import plot_model plot_model(model, to_file='model.png',show_shapes=True) |
ソースコードの詳細
CIFAR-10のデータセットのインポート
1 2 3 |
#CIFAR-10のデータセットのインポート from keras.datasets import cifar10 (X_train, Y_train), (X_test, Y_test) = cifar10.load_data() |
CIFAR-10の正規化
1 2 3 4 5 6 |
#CIFAR-10の正規化 from keras.utils import to_categorical # 特徴量の正規化 X_train = X_train/255. X_test = X_test/255. |
クラスラベルの1-hotベクトル化
1 2 3 |
# クラスラベルの1-hotベクトル化 Y_train = to_categorical(Y_train, 10) Y_test = to_categorical(Y_test, 10) |
CNNの構築
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 |
# CNNの構築 import keras from keras.models import Sequential from keras.layers.convolutional import Conv2D, MaxPooling2D from keras.layers.core import Dense, Dropout, Activation, Flatten import numpy as np model = Sequential() model.add(Conv2D(32, (3, 3), padding='same',input_shape=X_train.shape[1:])) model.add(Activation('relu')) model.add(Conv2D(32, (3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Conv2D(64, (3, 3), padding='same')) model.add(Activation('relu')) model.add(Conv2D(64, (3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(10)) model.add(Activation('softmax')) |
コンパイル
1 2 |
# コンパイル model.compile(loss='categorical_crossentropy',optimizer='SGD',metrics=['accuracy']) |
訓練
1 2 |
#訓練 history = model.fit(X_train, Y_train, epochs=20) |
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 |
Epoch 1/20 50000/50000 [==============================] - 385s 8ms/step - loss: 2.0969 - acc: 0.2205 Epoch 2/20 50000/50000 [==============================] - 381s 8ms/step - loss: 1.8343 - acc: 0.3343 Epoch 3/20 50000/50000 [==============================] - 380s 8ms/step - loss: 1.6066 - acc: 0.4180 Epoch 4/20 50000/50000 [==============================] - 381s 8ms/step - loss: 1.4646 - acc: 0.4698 Epoch 5/20 50000/50000 [==============================] - 378s 8ms/step - loss: 1.3696 - acc: 0.5051 Epoch 6/20 50000/50000 [==============================] - 377s 8ms/step - loss: 1.2988 - acc: 0.5307 Epoch 7/20 50000/50000 [==============================] - 378s 8ms/step - loss: 1.2357 - acc: 0.5552 Epoch 8/20 50000/50000 [==============================] - 378s 8ms/step - loss: 1.1763 - acc: 0.5799 Epoch 9/20 50000/50000 [==============================] - 378s 8ms/step - loss: 1.1264 - acc: 0.5987 Epoch 10/20 50000/50000 [==============================] - 378s 8ms/step - loss: 1.0827 - acc: 0.6178 Epoch 11/20 50000/50000 [==============================] - 379s 8ms/step - loss: 1.0401 - acc: 0.6316 Epoch 12/20 50000/50000 [==============================] - 383s 8ms/step - loss: 1.0055 - acc: 0.6437 Epoch 13/20 50000/50000 [==============================] - 382s 8ms/step - loss: 0.9724 - acc: 0.6549 Epoch 14/20 50000/50000 [==============================] - 383s 8ms/step - loss: 0.9400 - acc: 0.6682 Epoch 15/20 50000/50000 [==============================] - 402s 8ms/step - loss: 0.9157 - acc: 0.6771 Epoch 16/20 50000/50000 [==============================] - 396s 8ms/step - loss: 0.8870 - acc: 0.6877 Epoch 17/20 50000/50000 [==============================] - 383s 8ms/step - loss: 0.8580 - acc: 0.6979 Epoch 18/20 50000/50000 [==============================] - 399s 8ms/step - loss: 0.8347 - acc: 0.7041 Epoch 19/20 50000/50000 [==============================] - 383s 8ms/step - loss: 0.8134 - acc: 0.7137 Epoch 20/20 50000/50000 [==============================] - 393s 8ms/step - loss: 0.7913 - acc: 0.7194 |
モデルの保存
1 2 |
# モデルの保存 model.save('./CIFAR-10.h5') |
評価 & 評価結果出力
1 2 |
#評価 & 評価結果出力 print(model.evaluate(X_test, Y_test)) |
1 2 |
10000/10000 [==============================] - 29s 3ms/step [0.7409893180847168, 0.74080000000000001] |
モデルの図示化
1 2 3 |
#モデルの図示化 from keras.utils import plot_model plot_model(model, to_file='model.png',show_shapes=True) |
作成したモデルに対しての図示化を行っています。