Я не понимаю, как измерить размер Conv2D, pool_size MaxPooling2D et c. для построения CNN? Например, я видел учебник, где они запускают это, когда размер изображения равен 28*28
:
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28,28,1)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
Теперь я работаю с набором данных, где размер изображения is 100 * 100 . Итак, я попытался построить модель, как в примере:
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100,100,1)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='softmax'))
Но я не получаю приличный результат вообще:
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
n=100 # to reduce time in slow pc
model.fit(X_train_4d[:n], y_train_categorical[:n],
batch_size=32, epochs=5, verbose=1)
loss, accuracy = model.evaluate(X_test_4d[:n], y_test_categorical[:n], verbose=0)
print('\nTest Acc: ', accuracy)
Вывод:
Epoch 1/5
100/100 [==============================] - 12s 121ms/step - loss: 6.0578 - accuracy: 0.0000e+00
Epoch 2/5
100/100 [==============================] - 10s 96ms/step - loss: 4.0280 - accuracy: 0.1000
Epoch 3/5
100/100 [==============================] - 9s 94ms/step - loss: 3.7660 - accuracy: 0.3000
Epoch 4/5
100/100 [==============================] - 9s 94ms/step - loss: 3.2143 - accuracy: 0.3600
Epoch 5/5
100/100 [==============================] - 10s 103ms/step - loss: 2.3389 - accuracy: 0.4000
Test Acc: 0.25999999046325684
Так что, я думаю, для разных input_shape
размер сетки, плотный должен быть разным? Но я не понимаю, какой размер выбрать для какой формы?