らんだむな記憶

blogというものを体験してみようか!的なー

notMNIST

Deep Learning (ud730) - らんだむな記憶をもう少し真面目にやってみる。
notMNISTデータをPythonで使うため処理(とお試しで分類してみた) - Qiitaでもこのデータセット「notMNIST」が取り上げられている。

ud187のFashion MNISTの分類のレクチャーで提示されていたモデルにDropout層を突っ込んで分類してみる。

model = tf.keras.Sequential([
    tf.keras.layers.Reshape((28, 28, 1), input_shape=(28, 28)),
    tf.keras.layers.Conv2D(32, (3,3), padding='same',
                           activation=tf.nn.relu),
    tf.keras.layers.MaxPooling2D((2, 2), strides=2),
    tf.keras.layers.Conv2D(64, (3,3), padding='same',
                           activation=tf.nn.relu),
    tf.keras.layers.MaxPooling2D((2, 2), strides=2),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation=tf.nn.relu),
    tf.keras.layers.Dense(10,  activation=tf.nn.softmax)
])

データセット間の重複を解決していないので些か“カンニング”状態の学習になっていることは否めないが・・・これでバッチサイズ32で、エポック数10くらいで学習させたら大体93%かそこいらの精度にまで学習できたようだ。好き放題な形状のデータが多いのにまぁそれなりに分類できるもんだな。

上記Qiitaを眺めつつ、素朴な手法として LogisticRegression で解かせると CPU なのでめちゃめちゃ時間がかかる(と初心者的な感覚で思う)が、それなり(?)の汎化性能が得られて89%かそこいらになるようである:

from sklearn.linear_model import LogisticRegression

flatten_train_dataset = train_dataset.reshape(-1,28*28)
flatten_test_dataset = test_dataset.reshape(-1,28*28)

lr = LogisticRegression()
lr.fit(flatten_train_dataset, train_labels)

# 汎化性能を確認
pred = lr.predict(flatten_test_dataset)
result = [y==p for y, p in zip(test_labels, pred)]
test_accuracy = np.sum(result)/len(pred)

print('Accuracy on test dataset:', test_accuracy)

ランダムフォレストだったらこの10倍くらい時間がかかるのかな・・・と思うとうんざりではある。ただ、素朴な実装だけどめちゃくちゃな結果になるわけではないのが驚き・・・。
そしてまったく記憶にはないが既製の分類器 - らんだむな記憶でデータセットを小さくしてみて同じことはやっていたようだ・・・。