Точность модели застряла на 50% при обучении модели определения возраста и пола - PullRequest
2 голосов
/ 26 апреля 2020

Я работал над реализацией в Keras модели определения возраста и пола, описанной в исследовательской работе Классификация по возрасту и полу с использованием сверточных нейронных сетей '. Первоначально это была модель Caffe, но я решил преобразовать ее в Keras. Но пока я тренировался с моделью, точность модели застряла на 49 - 52%. Это означает, что модель не учится вообще. Кроме того, потери можно увидеть экспоненциально увеличивающимися и иногда становящимися нан. Я тренировался на Google Collab с аппаратным ускорителем графического процессора.

В качестве входных данных использовалась папка с изображениями, метки которых указаны в имени файла. Я загрузил все изображения в виде массива numpy, а метки представляли собой коллекцию из 10 элементы (2 для пола и 8 классов для 8 разных возрастных групп, как описано в документе).

model = Sequential()
model.add(Conv2D(96,(7,7),
                 activation= 'relu',
                 strides= 4,
                 use_bias= 1,
                 bias_initializer= 'Zeros',
                 data_format= 'channels_last',
                 kernel_initializer = RandomNormal(stddev= 0.01),
                 input_shape= (200,200,3)))
model.add(MaxPooling2D(pool_size= 3,
                       strides= 2))
model.add(BatchNormalization())

model.add(Conv2D(256,(5,5),
                 activation= 'relu',
                 strides= 1,
                 use_bias= 1,
                 data_format= 'channels_last',
                 bias_initializer= 'Ones',
                 kernel_initializer = RandomNormal(stddev= 0.01)
                 ))
model.add(MaxPooling2D(pool_size= 3,
                       strides= 2))
model.add(BatchNormalization())

model.add(Conv2D(384,
                 (3,3),
                 strides= 1,
                 data_format= 'channels_last',
                 use_bias= 1,
                 bias_initializer= 'Zeros',
                 padding= 'same',
                 kernel_initializer = RandomNormal(stddev= 0.01),
                 activation= 'relu'))
model.add(MaxPooling2D(pool_size= 3,
                       strides= 2))

model.add(Flatten())
model.add(Dense(512,
                use_bias= 1,
                bias_initializer= 'Ones',
                kernel_initializer= RandomNormal(stddev= 0.05),
                activation= 'relu'))
model.add(Dropout(0.5))

model.add(Dense(512,
                use_bias= 1,
                bias_initializer= 'Ones',
                kernel_initializer= RandomNormal(stddev= 0.05),
                activation= 'relu'))
model.add(Dropout(0.5))

model.add(Dense(10,
                use_bias= 1,
                kernel_initializer= RandomNormal(stddev= 0.01),
                bias_initializer= 'Zeros',
                activation= 'softmax'))

model.compile(loss= 'categorical_crossentropy', metrics= ['accuracy'], optimizer= SGD(lr= 0.0001, decay= 1e-7, nesterov= False))
model.summary()

Входы в модель были перемешаны:

X_train, X_test, y_train, y_test = train_test_split(images,labels,test_size= 0.2,shuffle= True, random_state= 42)

Вы можете увидеть мои тренировки результаты здесь Я использовал правильные оптимизаторы и правильные инициализаторы вместе с отклонениями, чтобы предотвратить исчезновение градиентов.

1 Ответ

1 голос
/ 05 мая 2020

Предложил бы следовать приведенному ниже подходу для повышения точности модели -

  • Построить две разные модели, одну для прогнозирования пола и другую для прогнозирования возраста.
  • Используйте Label Encoder или One hot encoder для целевых переменных.
  • Для модели прогнозирования пола используйте Binary crossentrpy в качестве функции потерь.
  • Для модели прогнозирования возраста используйте Категориальную кроссентропию (если вы использовали Label Encoder для целевой переменной) или разреженную категориальную кросцентропию (если вы использовали одну из них). горячий кодировщик для целевой переменной).
  • Перед построением модели нормализуйте все числовые данные.
  • Используйте softmax в последнем слое в качестве функции активации и задействуйте оставшиеся слои.
  • Также вместо 2 скрытых плотных слоев оставьте только 1 (более плотный слой означает больший вес для изучения, вы можете эксперимент с количеством слоев и фильтров).

Надеюсь, я ответил на ваш вопрос. Счастливого обучения!

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