Мой CNN перегружен даже в простой архитектуре и большом количестве данных - PullRequest
0 голосов
/ 29 сентября 2019

Я создал CNN для изображений с несколькими метками (разной обуви), и их размер составляет 100x100x3.У меня есть 50000 изображений с 5 классами (которых, я думаю, достаточно), но проблема во время обучения:

  • Точность теста и точность валидации растут вместе в начале, но Val accстановится почти постоянным при 58% прибл., а скорость движения поезда увеличивается примерно до 85-99%.

  • кажется перегонкой, я пробовал использовать выпадения, l1 регуляризацию и т. д..

Вот моя архитектура.Что может быть не так с этим?

**Conv Layer , 16 ,(3,3), input =100,100,3 ,padding = same**
**LeakyRelu and MaxPooling()**
**Dropouts **
**Conv layer , 32, (9,9), pd = same** 
**LeakyRelu and maxpooling()**
**Dropouts**
**Flatten()**
**Dense 5, leakyRelu, l1(0.001), dropout**
**Dense 5, leakyRelu,l1(0.001)**
**Sigmoid**

1 Ответ

0 голосов
/ 29 сентября 2019

Несколько вещей, которые вы можете попробовать:

  • фильтр размером 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...