Как определить размер conv2D на основе формы ввода - PullRequest
0 голосов
/ 27 апреля 2020

Я не понимаю, как измерить размер 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 размер сетки, плотный должен быть разным? Но я не понимаю, какой размер выбрать для какой формы?

1 Ответ

1 голос
/ 27 апреля 2020

Глядя на ваш код, кажется, у вас есть 64 класса. Чтобы обучить модель с таким большим количеством классов, нам нужно по крайней мере иметь достаточное количество примеров на класс (скажем, 10), чтобы получить разумную точность классификации. Я полагаю, что низкая точность, которую вы получаете для тестового набора, в основном не из-за чего-то неправильного в параметрах модели, а скорее из-за ограниченного объема данных. n=100, что явно недостаточно для обучения модели. Я бы предположил, что вам нужно иметь не менее 10000 общих выборок данных в базе данных, чтобы получить приемлемую точность классификации. Используйте полную базу данных и дайте ей некоторое время для обучения.

Кроме того, вам нужно будет указать некоторые данные проверки, чтобы наблюдать за тем, как модель работает на протяжении всего обучения. Например, это можно легко сделать, установив аргумент validation_split=0.2 в model.fit(), что приведет к потере 20% обучающих данных для проверки. Тогда у вас будет потеря проверки, которая должна постоянно контролироваться, и обучение должно быть остановлено, когда потеря проверки достигает минимума, чтобы предотвратить переоснащение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...