知りたいこと
cyfer10に使用したCNNでなぜこのような差が出たのか、してはいけないことが含まれていたのか。
aidemyに使われていたCNNと層よりも、より層を増やして適当に作った自作CNNが明らかに精度が悪い。
学習結果
//モデル定義 model = Sequential() model.add(Conv2D(32, (3, 3), padding='same', input_shape=X_train.shape[1:])) model.add(Activation('relu')) model.add(Conv2D(32, (3, 3))) model.add(Activation('relu')) model.add(MaxPool2D(pool_size=(2, 2))) model.add(Dropout(0.5)) model.add(Conv2D(64, (3, 3), padding='same')) model.add(Activation('relu')) model.add(Conv2D(64, (3, 3))) model.add(Activation('relu')) model.add(MaxPool2D(pool_size=(2, 2))) model.add(Dropout(0.5)) model.add(Flatten()) model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(10)) model.add(Activation('softmax')) //コンパイル model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) //学習 fit = model.fit(X_train, Y_train, batch_size=32, epochs=50, verbose=1, validation_split=0.3 ) ![イメージ説明](a545e87427558a35e3f9374a0e1ddb4a.png)
//モデル定義 ori1 = Sequential() ori1.add(Conv2D(256, (3, 3), padding='same', input_shape=X_train.shape[1:])) ori1.add(Activation("relu")) ori1.add(Conv2D(256, (3, 3))) ori1.add(Dropout(0.5)) ori1.add(Activation("relu")) ori1.add(MaxPool2D(pool_size=(2, 2))) ori1.add(Dropout(0.5)) ori1.add(Conv2D(128, (3, 3))) ori1.add(Activation("relu")) ori1.add(Dropout(0.5)) ori1.add(Conv2D(128, (3, 3))) ori1.add(Activation("relu")) ori1.add(MaxPool2D(pool_size=(2, 2))) ori1.add(Dropout(0.5)) ori1.add(Conv2D(32, (3, 3))) ori1.add(Activation("relu")) ori1.add(Dropout(0.5)) ori1.add(Conv2D(32, (3, 3))) ori1.add(Activation("relu")) ori1.add(Flatten()) ori1.add(Dense(512)) ori1.add(Activation('relu')) ori1.add(Dropout(0.5)) ori1.add(Dense(256)) ori1.add(Activation('relu')) ori1.add(Dropout(0.5)) ori1.add(Dense(10)) ori1.add(Activation("softmax")) //コンパイル ori1.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"]) //学習 fit_ori1 = ori1.fit(X_train, Y_train, batch_size=32, epochs=50, verbose=1, validation_split=0.3 )
ダメな部分
してはいけないこと、推奨されていないことをしてしまっている、このdropoutやmaxpoolingの位置や数字、層の順序やパラメータで明らかに間違っている等があれば教えていただきたいです。よろしくお願いします。
改善したCNN
ori2 = Sequential() ori2.add(Conv2D(32, (3, 3), padding='same', input_shape=X_train.shape[1:])) ori2.add(Activation("relu")) ori2.add(Conv2D(32, (3, 3))) ori2.add(Dropout(0.5)) ori2.add(Activation("relu")) ori2.add(MaxPool2D(pool_size=(2, 2))) ori2.add(Dropout(0.5)) ori2.add(Conv2D(32, (3, 3))) ori2.add(Activation("relu")) ori2.add(Dropout(0.5)) ori2.add(Conv2D(32, (3, 3))) ori2.add(Activation("relu")) ori2.add(MaxPool2D(pool_size=(2, 2))) ori2.add(Dropout(0.5)) ori2.add(Conv2D(32, (3, 3))) ori2.add(Activation("relu")) ori2.add(Dropout(0.5)) ori2.add(Conv2D(32, (3, 3))) ori2.add(Activation("relu")) ori2.add(Flatten()) ori2.add(Dense(512)) ori2.add(Activation('relu')) ori2.add(Dropout(0.5)) ori2.add(Dense(256)) ori2.add(Activation('relu')) ori2.add(Dropout(0.5)) ori2.add(Dense(10)) ori2.add(Activation("softmax"))
### ori3 Dropoutを徐々に増加、batch_sizeを大きめに100に変更 ori3 = Sequential() ori3.add(Conv2D(32, (3, 3), padding='same', input_shape=X_train.shape[1:])) ori3.add(Activation("relu")) ori3.add(Conv2D(32, (3, 3))) ori3.add(Dropout(0.1)) ori3.add(Activation("relu")) ori3.add(MaxPool2D(pool_size=(2, 2))) ori3.add(Dropout(0.1)) ori3.add(Conv2D(64, (3, 3))) ori3.add(Activation("relu")) ori3.add(Dropout(0.2)) ori3.add(Conv2D(64, (3, 3))) ori3.add(Activation("relu")) ori3.add(MaxPool2D(pool_size=(2, 2))) ori3.add(Dropout(0.2)) ori3.add(Conv2D(128, (3, 3))) ori3.add(Activation("relu")) ori3.add(Dropout(0.3)) ori3.add(Conv2D(128, (3, 3))) ori3.add(Activation("relu")) ori3.add(Flatten()) ori3.add(Dense(512)) ori3.add(Activation('relu')) ori3.add(Dropout(0.4)) ori3.add(Dense(256)) ori3.add(Activation('relu')) ori3.add(Dropout(0.5)) ori3.add(Dense(10)) ori3.add(Activation("softmax"))
回答4件
あなたの回答
tips
プレビュー