在训练年龄和性别检测模型时,模型的准确性停留在50%

时间:2020-04-26 10:53:23

标签: tensorflow keras deep-learning classification conv-neural-network

我正在研究论文Age and Gender Classification using Convolutional Neural Networks'中描述的Keras年龄和性别检测模型的实现。它最初是Caffe模型,但我想将其转换为Keras。但是,当我训练模型时,模型的准确性停留在49-52%左右。这意味着该模型根本没有学习。同样,可以看到损失呈指数增长,有时甚至更小。我正在使用GPU硬件加速器在Google合作实验室上进行培训。

我的输入是一个图像文件夹,其标签位于文件名中。我将所有图像加载为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)

您可以看到我的训练结果 here 我使用了正确的优化程序和正确的初始化程序以及偏差来防止梯度消失。

1 个答案:

答案 0 :(得分:1)

建议采用以下方法来提高模型的准确性-

  • 建立两个不同的模型,一个用于性别预测,另一个用于年龄预测。
  • 在目标变量上使用标签编码器或一个热编码器。
  • 对于性别偏爱模型,请使用Binary crossentrpy作为损失函数。
  • 对于年龄预测模型,请使用分类交叉熵(如果已将Label Encoder用于目标变量)或稀疏分类交叉熵(如果已将一个热编码器用于目标变量)。
  • 在构建模型之前,将所有数值数据归一化。
  • 在最后一层使用softmax作为激活函数,并在其余层使用relu。
  • 也不要保留2个隐藏的密集层,而只需保留1个(密集层意味着要学习更多的权重,您可以尝试使用层数和滤镜数量)。

希望我已经回答了你的问题。学习愉快!