Pythonコードの復習(5) - Tensorflow + Keras、CNNを用いたCIFAR-10の多値分類
今回は、CIFAR-10というデータセットを畳み込みニューラルネットワーク(CNN, Convolutional Neural Network)を用いて多値分類する方法を考案して実践してみました。
Cifar-10は50000枚の訓練データ、10000枚の学習データに分かれたデータセットであり、飛行機、鳥、猫、鹿、犬、蛙、馬、船、トラックの10つの異なる物体(説明変数)がそれぞれラベル(目的変数)を振られています。これらを認識して分類できるようにするのが目的です。
今回学んだこと
#CIFAR10を読み込む
from tensorflow.python.keras.datasets import cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print("x_train - shape:", x_train.shape)
print("y_train - shape:", y_train.shape)
print("x_test - shape:", x_test.shape)
print("y_test - shape:", y_test.shape)
#前処理。説明変数を標準化、目的変数をワンホットエンコーディングする
from tensorflow.keras.utils import to_categorical
x_train = x_train / 255
x_test = x_test / 255
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
#順伝播計算と畳み込みを組み合わせる。
#畳み込み→畳み込み→プーリング→ドロップアウトという処理を繰り返すニューラルネットワーク
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Conv2D
from tensorflow.python.keras.layers import MaxPooling2D
from tensorflow.python.keras.layers import Dropout
from tensorflow.python.keras.layers import Flatten
from tensorflow.python.keras.layers import Dense
model = Sequential()
model.add(Conv2D(filters=32, input_shape=(32,32,3), kernel_size=(3,3), strides=(1,1), padding="same", activation="relu"))
model.add(Conv2D(filters=32, kernel_size=(3,3), strides=(1,1), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(filters=64, kernel_size=(3,3), strides=(1,1), padding="same", activation="relu"))
model.add(Conv2D(filters=64, kernel_size=(3,3), strides=(1,1), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
#全結合層に入力するため、Flattenレイヤーで4階テンソルとなっている出力値を2階テンソルに直す
model.add(Flatten())
#全結合層
model.add(Dense(units=512, activation="relu"))
model.add(Dropout(0.5))
model.add(Dense(units=10, activation="softmax"))
model.output_shape
#モデルの学習。今回はTensorBoardに学習記録を出力する
from tensorflow.python.keras.callbacks import TensorBoard
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
tsb = TensorBoard(log_dir="./logs")
history_model1 = model.fit(x_train, y_train, batch_size=32, epochs=20, validation_split=0.2, callbacks=[tsb])
訓練性能が85%ほどのCNNが完成しました。実用的なAIには遠いですが、膨大な画像データを短時間で分類するにはニューラルネットワークが非常に効率的という事が分かります。
次回はCNNに関する理解を深めてGPUを用いた処理、転移学習、超解像、自動着彩、画像生成などの機械学習を用いた画像処理の応用を目指します。お楽しみに!
この記事が気に入ったらサポートをしてみませんか?