Несколько вещей, которые вы можете попробовать:
- фильтр размером
9x9
не так уж часто встречается, конечно, не для таких маленьких изображений.Я бы использовал 3x3
в этом случае - Вы пробовали использовать ReLU вместо его текущей версии?Я думаю, что лучше начать с простой версии нелинейности, а затем попробовать разные версии, чтобы увидеть, какая из них работает лучше (и если это любая разница)
- Я бы отбросил регуляризации L1и только добавьте их позже, чтобы увидеть, помогают ли они.Сначала попытайтесь получить разумные результаты, прежде чем пытаться получить современные результаты
- В настоящее время у вас есть выпадание после каждого слоя, что мне кажется очень большим.Может быть, вы можете попробовать удалить первый?Кроме того: каковы ваши показатели отсева?
- у вас есть пул после каждого сверточного слоя, вы пытались удалить первый?Как и в случае с выпадающими, вы, кажется, чрезмерно используете слои пула.
- ваш первый полностью подключенный (плотный) слой имеет очень мало узлов.Обратите внимание, что вывод слоя
Flatten()
имеет размерность 20000 (удвоение пула -> 100/2/2 x 100/2/2 x 32 = 20000
), поэтому было бы более целесообразно использовать большее количество узлов в слое между выравниванием и последним полностью подключенным.Я бы посоветовал попробовать 1024 или даже 256, я думаю.
Также у вас очень мало сверточных слоев.Даже для набора данных CIFAR-10 (60000 изображений размером 32x32x3
для 10 классов) я бы использовал как минимум 2 блока по 2 сверточных слоя в каждом, что-то вроде этого:
input(32, 32, 3)
conv_2D(32, (3,3), activation='relu', padding='same')
conv_2D(32, (3,3), activation='relu', padding='same')
dropout(0.25)
maxpooling
conv_2D(64, (3,3), activation='relu', padding='same')
conv_2D(64, (3,3), activation='relu', padding='same')
dropout(0.25)
maxpooling
flatten
dense(1024, activation='relu')
dense(10, activation='sigmoid')