TensorFlow2 + Keras로 화상 분류에 도전 CNN편 1 ~일단 움직이는~

소개



TensorFlow2 + Keras에 의한 화상 분류의 공부 메모(CNN편의 제1탄)입니다. MLP 편 (다층 퍼셉트론 모델 편)에 대해서는 여기을 참조하십시오.

덧붙여 소재는 드 정평인 필기 숫자 화상(MNIST)의 분류입니다.

이번에는 블랙 박스 그대로, 우선 CNN 모델을 학습시켜 그것을 사용하여 예측 (분류)을 해 보겠습니다.

MLP 버전 프로그램



다층 퍼셉트론 모델에 의한 필기 숫자 이미지(MNIST) 분류는 TensorFlow2 + Keras를 사용하여 다음과 같이 쓸 수 있었습니다( 상세 ).

TensorFlow2로 전환(GoogleColab. 환경 전용)
%tensorflow_version 2.x

MLP에 의한 이미지 분류
import tensorflow as tf

# (1) 手書き数字画像のデータセットをダウンロード・正規化
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

# (2) MLPモデルを構築
model = tf.keras.models.Sequential()
model.add( tf.keras.layers.Flatten(input_shape=(28, 28)) )
model.add( tf.keras.layers.Dense(128, activation='relu') )
model.add( tf.keras.layers.Dropout(0.2) )
model.add( tf.keras.layers.Dense(10, activation='softmax') )

# (3) モデルのコンパイル・トレーニング
model.compile(optimizer='Adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)

# (4) モデルの評価
model.evaluate(x_test,  y_test, verbose=2)

이렇게 하면 정답률 $97.7\%$ 전후의 분류기를 만들 수 있었습니다.

CNN 버전 프로그램



컨벌루션 신경망 모델(CNN)에 의한 필기 숫자 이미지(MNIST) 분류는 다음과 같이 쓸 수 있습니다. 다층 퍼셉트론의 모델에 무려 3행 추가하는 것만으로 컨벌루션 신경망 모델로 바꿀 수 있습니다.

CNN에 의한 이미지 분류
# (1) 手書き数字画像のデータセットをダウンロード・正規化
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

# (2) CNNモデルを構築
model = tf.keras.models.Sequential()
model.add( tf.keras.layers.Reshape((28, 28, 1), input_shape=(28, 28)) ) # 追加
model.add( tf.keras.layers.Conv2D(32, (5, 5), activation='relu') )      # 追加
model.add( tf.keras.layers.MaxPooling2D(pool_size=(2,2)) )              # 追加
model.add( tf.keras.layers.Flatten() )                                  # 改変
model.add( tf.keras.layers.Dense(128, activation='relu') )
model.add( tf.keras.layers.Dropout(0.2) )
model.add( tf.keras.layers.Dense(10, activation='softmax') )

# (3) モデルのコンパイル・トレーニング
model.compile(optimizer='Adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)

# (4) モデルの評価
model.evaluate(x_test,  y_test, verbose=2)

이렇게 하면 정답률 $98.7\%$ 전후의 분류기를 만들 수 있습니다(위의 MLP보다 정답률이 약 $1\%$ 정도 높은 모델을 만들 수 있습니다). 그러나 학습에 걸리는 시간은 길다.

제대로 예측할 수 없는 사례



분류 (예측)에 실패한 특정 사례를 살펴 보겠습니다 (이를 출력하기위한 프로그램은 "~분류에 실패하는 화상을 관찰해 본다~"참조).

각 그림의 왼쪽 상단에 표시된 빨간색 문자는 실수로 어떤 숫자로 예측했는지에 대한 정보입니다 (괄호 안의 숫자는 잘못된 예측에 대한 softmax 출력). 예를 들어 5(0.9)는 '약 $90\%$의 확신으로 $5$로 예측했다'는 것입니다. 또한 파란색 숫자는 테스트 데이터test_x의 인덱스 번호입니다.

정답치 「0」에 대해서 올바르게 예측(분류)할 수 없었던 케이스 4/980건





정답치 「1」에 대해서 올바르게 예측(분류)할 수 없었던 케이스 4/1135건





정답치 「2」에 대해서 올바르게 예측(분류)할 수 없었던 케이스 8/1032건





정답치 「3」에 대해서 올바르게 예측(분류)할 수 없었던 케이스 12/1010건





정답치 「4」에 대해서 올바르게 예측(분류)할 수 없었던 케이스 15/982건





정답치 「5」에 대해서 올바르게 예측(분류)할 수 없었던 케이스 6/892건





정답치 「6」에 대해서 올바르게 예측(분류)할 수 없었던 케이스 13/958건





정답치 「7」에 대해서 올바르게 예측(분류)할 수 없었던 케이스 15/1028건





정답치 「8」에 대해서 올바르게 예측(분류)할 수 없었던 케이스 27/974건





정답치 「9」에 대해서 올바르게 예측(분류)할 수 없었던 케이스 26/1009건





다음 번



컨벌루션 뉴럴 네트워크 모델(CNN)은, 왜 화상 분류·화상 인식에 적합한 것인가, 원래 컨벌루션(필터)이란? 같은 내용을 다루고 싶습니다.

좋은 웹페이지 즐겨찾기