今更ながら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%を達成しました。
また引き続き安定しているように見えます。
結論
弱いdropoutを活性化層の後に入れまくるべし。(ホントか?)
今回もふざけた広告を
純愛ドロップアウト 【電子限定特典付き】 (バンブーコミックス 麗人uno!コミックス)
- 作者: 三坂ニウム
- 出版社/メーカー: 竹書房
- 発売日: 2019/07/19
- メディア: Kindle版
- この商品を含むブログを見る