Я работал над реализацией в 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)
Вы можете увидеть мои тренировки результаты здесь Я использовал правильные оптимизаторы и правильные инициализаторы вместе с отклонениями, чтобы предотвратить исчезновение градиентов.