どうも、とがみんです。
以前の記事では、Kerasを用いてニューラルネットワークを構築し、手書き数字画像の分類を行いました。
この記事では、一般的な物「鳥」や「猫」、「犬」などの画像を分類する畳み込みニューラルネットワークを「Keras」を利用して構築していきます。
畳み込みニューラルネットワークの概要は以下の記事にまとめています。
Contents
実装するものの概要
今回実装する畳み込みニューラルネットワークの概要は以下です。入力画像は、縦32×横32×RGBデータ32となってます。
今回は、「CIFAR-10」というデータを利用し、「鳥」、「犬」、「猫」、「飛行機」、「自動車」、、、その他10種類に分類するため、出力層のノードは10個になっています。
データの準備
「CIFAR-10」データセットをダウンロードします。
1 2 3 4 | import tensorflow as tf cifar10 = tf.keras.datasets.cifar10 (x_train, y_train), (x_test, y_test) = cifar10.load_data() |
ダウンロードしたデータを確認すると、32ピクセル×32ピクセルのRGB画像データ、学習用50000枚とテスト用10000枚が確認できます。
以下のような画像があります。
畳み込みニューラルネットワークの実装
上記データを分類する、畳み込みニューラルネットワークのシステムを、「Keras」を利用して、以下の流れにそって構築していきます。
- モデルの構築
- モデルのコンパイル
- モデルの学習
- 学習済みモデルの保存と読み込み
モデルの構築
これに沿ってモデルを構築します。
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 | model = keras.Sequential([ #畳み込みレイヤー keras.layers.Conv2D( filters = 32, # 出力空間の次元(つまり畳み込みにおける出力フィルタの数) kernel_size = 3, # フィルターサイズ padding = "same", # 入出力サイズが同じになるように入力にパディングする activation = "relu", # 活性化関数 input_shape = (32, 32, 3) # 入力サイズ ), #プーリングレイヤー keras.layers.MaxPooling2D( pool_size=(2, 2) ), #畳み込みレイヤー keras.layers.Conv2D( filters = 32, # 出力空間の次元(つまり畳み込みにおける出力フィルタの数) kernel_size = 3, # フィルターサイズ padding = "same", # 入出力サイズが同じになるように入力にパディングする activation = "relu", # 活性化関数 input_shape = (32, 32, 3) # 入力サイズ ), #プーリングレイヤー keras.layers.MaxPooling2D( pool_size=(2, 2) ), #入力の平滑化 keras.layers.Flatten(), #全結合層(Affine層)。ノード数512の中間層.活性化関数はReLU関数 keras.layers.Dense(512, activation="relu"), #全結合層(Affine層)。ノード数10の出力層.活性化関数はソフトマックス関数 keras.layers.Dense(10, activation="softmax") ]) |
>Convolutionalレイヤー|Keras Documentation
モデルのコンパイル
以下のコードを実行します。
1 2 3 | model.compile(optimizer=tf.keras.optimizers.Adam(), loss='sparse_categorical_crossentropy', metrics=['accuracy']) |
学習アルゴリズムには「Adam」、損失関数は「クロスエントロピー関数」を指定しています。
モデルの学習
モデルを学習させます。
1 | history = model.fit(x_train/255, y_train,batch_size=100, epochs=10,validation_data=(x_test/255, y_test)) |
画像データは0〜255の値を0〜1に直すために、255で割っています。
バッチサイズを100、エポック数を10にしています。
各エポック終了後にテストデータで精度を確認するために、validation_dataにテストデータを入れてます。
実行すると学習が始まります。
学習済みモデルの保存と読み込み
作成した畳み込みニューラルネットワークのモデルを保存するコードと、読み込むコードです。
1 2 3 4 | #モデルの保存 model.save('model/KerasCNN.hdf5') #モデルの読み込み model = tf.keras.models.load_model('model/KerasCNN.hdf5') |
学習結果の確認
認識精度・損失関数の推移
以下のコードを実行すると、各エポックごとの認識精度と損失関数の値をプロットしたグラフが表示されます。
学習は順調に進んでいますが、テストデータに対する精度は「71%」程度で落ち着いています。損失関数の値も、ほぼ変わらない状態になっています。
なので、これ以上学習させても、学習データのみに対応したシステムになってしまうことが考えられるので、
より精度を上げるためには、畳み込み層の数を変えたり、ノード数を変えたりして、探る必要がありそうです。
テストデータの画像と予測ラベルの確認
テスト用データ30個の正解ラベルと、推測した結果を以下に表示します。
1 2 | # testデータ30件の予測ラベル pred_classes = model.predict_classes(x_test[0:30]) |
カエルと猫を間違えがちですね(笑)
まとめ
Kerasを利用して、畳み込みニューラルネットワークによる、画像の分類システムを構築しました。
認識精度は71%程度だったので、まだまだ改良する必要がありそうです。