今更ながらDropoutを検証してみる~その2~

TL;DR

  • dropoutを入れてmnistで99.66%を達成した

dropoutの本気を見た

前回の記事でdropoutは安定しただけ、と書いたが、 もうちょい試すと99.66%を達成したのでこちらにて。

modelというかソース

このようにPReLUで活性化したレイヤの後全てにDropout(0.1)を入れた。

from keras import datasets
import numpy as np
((train_x,train_y),(test_x,test_y)) = datasets.mnist.load_data()
train_x = (train_x/255).astype("float32").reshape(-1,28,28,1)
test_x  = (test_x /255).astype("float32").reshape(-1,28,28,1)
train_y = np.eye(10)[train_y]
test_y = np.eye(10)[test_y]

from tensorflow.keras.layers import *
from tensorflow.keras.models import *
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import ModelCheckpoint
from tensorflow.keras.losses import categorical_crossentropy

prelu_model_drop01 = Sequential()
prelu_model_drop01.add(Conv2D(filters=32,kernel_size=(3,3),input_shape=(28,28,1),padding="same"))
prelu_model_drop01.add(PReLU())
prelu_model_drop01.add(Dropout(0.1))
prelu_model_drop01.add(BatchNormalization())
prelu_model_drop01.add(Conv2D(filters=32,kernel_size=(3,3),padding="same"))
prelu_model_drop01.add(PReLU())
prelu_model_drop01.add(Dropout(0.1))
prelu_model_drop01.add(BatchNormalization())
prelu_model_drop01.add(MaxPool2D(pool_size=(2,2),padding="same")) # 28,28 -> 14,14
prelu_model_drop01.add(Conv2D(filters=64,kernel_size=(3,3),padding="same"))
prelu_model_drop01.add(PReLU())
prelu_model_drop01.add(Dropout(0.1))
prelu_model_drop01.add(BatchNormalization())
prelu_model_drop01.add(Conv2D(filters=64,kernel_size=(3,3),padding="same"))
prelu_model_drop01.add(PReLU())
prelu_model_drop01.add(Dropout(0.1))
prelu_model_drop01.add(BatchNormalization())
prelu_model_drop01.add(MaxPool2D(pool_size=(2,2),padding="same")) # 14,14 -> 7,7
prelu_model_drop01.add(Conv2D(filters=64,kernel_size=(3,3),padding="same"))
prelu_model_drop01.add(PReLU())
prelu_model_drop01.add(Dropout(0.1))
prelu_model_drop01.add(BatchNormalization())
prelu_model_drop01.add(Conv2D(filters=64,kernel_size=(3,3),padding="same"))
prelu_model_drop01.add(PReLU())
prelu_model_drop01.add(Dropout(0.1))
prelu_model_drop01.add(BatchNormalization())
prelu_model_drop01.add(MaxPool2D(pool_size=(2,2),padding="same")) # 7,7 -> 4,4
prelu_model_drop01.add(Conv2D(filters=64,kernel_size=(3,3),padding="same"))
prelu_model_drop01.add(PReLU())
prelu_model_drop01.add(Dropout(0.1))
prelu_model_drop01.add(BatchNormalization())
prelu_model_drop01.add(Conv2D(filters=64,kernel_size=(3,3),padding="same"))
prelu_model_drop01.add(PReLU())
prelu_model_drop01.add(Dropout(0.1))
prelu_model_drop01.add(BatchNormalization())
prelu_model_drop01.add(MaxPool2D(pool_size=(2,2),padding="same")) # 4,4 -> 2,2
prelu_model_drop01.add(Conv2D(filters=128,kernel_size=(2,2),padding="same"))
prelu_model_drop01.add(PReLU())
prelu_model_drop01.add(Dropout(0.1))
prelu_model_drop01.add(BatchNormalization())
prelu_model_drop01.add(MaxPool2D(pool_size=(2,2),padding="same")) # 2,2 -> 1,1
prelu_model_drop01.add(Flatten())
prelu_model_drop01.add(Dense(10,activation="softmax"))
prelu_model_drop01.summary()

prelu_model_drop01.compile(optimizer=Adam(lr=0.0001),metrics=['accuracy'],loss="categorical_crossentropy")

prelu_model_drop01_history = prelu_model_drop01.fit(train_x,train_y,batch_size=16,epochs=64,validation_data=(test_x,test_y))

結果

32 epochで99.66%を達成しました。

f:id:kazuhitogo:20190906175130p:plain
drop01

また引き続き安定しているように見えます。

結論

弱いdropoutを活性化層の後に入れまくるべし。(ホントか?)

今回もふざけた広告を