ETLデータセットは産総研が公開している手書き文字認識のデータセットです。ETL8Gを使用して、9561画像から957カテゴリの分類を行います。

ETL8Gはバイナリデータなので、画像を取り出すため、ETL文字データベース (etlcdb)を画像に変換するを参考に抽出しました。

etl

IMAGE_SIZE=48として、最初は以下のネットワークで学習しました。

model.add(Conv2D(32, (3, 3), input_shape=(IMAGE_SIZE,IMAGE_SIZE,1)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64,(3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())

model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(957))

model.add(Activation('softmax'))

全く収束しません。

etl_3x3

試行錯誤した結果、Conv2Dを5x5にしたら収束しました。

model.add(Conv2D(32, (5, 5), input_shape=(IMAGE_SIZE,IMAGE_SIZE,1)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64,(5, 5)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())

model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(957))

model.add(Activation('softmax'))

etl_5x5

TensorFlowでひらがな・漢字文字認識でも5x5の畳み込みを使用しているようです。3x3だと局所特徴量すぎるのかと思っていたのですが、BatchNormalizationを入れたら3x3でも収束するようです。

model.add(Conv2D(32, (3, 3), input_shape=(IMAGE_SIZE,IMAGE_SIZE,1)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64,(3, 3)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())

model.add(Dense(1024))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(num_classes))

model.add(Activation('softmax'))

etl_all_3x3_batch

BatchNormalization優秀ですね。