【问题标题】:Accuracy of model got stuck at 50% while training an Age and Gender detection model在训练年龄和性别检测模型时,模型的准确率停留在 50%
【发布时间】:2020-08-09 20:43:06
【问题描述】:

我正在研究研究论文Age and Gender Classification using Convolutional Neural Networks'中描述的年龄和性别检测模型的 Keras 实现。它最初是一个 Caffe 模型,但我想将其转换为 Keras。但是当我训练模型时,模型的准确率卡在了 49 - 52% 左右。这意味着模型根本没有学习。此外,可以看到损失呈指数增长,有时会变成 nan。我正在使用 GPU 硬件加速器进行 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)

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

【问题讨论】:

  • 您已经处理了所有事情,但没有注意到loss 从第二个纪元本身变成了nan。解决这个问题也可以帮助您获得更高的准确性。
  • 0 我也会提出同样的建议。跟踪您的损失以及您在 epoch 2+ 上获得 nan 的原因。该线程可能是开始搜索的好地方:stackoverflow.com/questions/61416197/…
  • 你的目标是 one-hot 编码的吗?你能展示你所有的 10 个标签吗?
  • 我的标签格式为:y = ['Male','Female','0 - 2', '4 - 6', '8 - 12', '15 - 20', '25 - 32'、'38 - 43'、'48 - 53'、'60 - 100']。格式为 0/1。
  • 我尝试使用 Adam 优化器并使用 tanh 激活,但没有 prgress。我不明白为什么我的损失是 nan。

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


【解决方案1】:

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

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

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

【讨论】:

  • @Aditya Gupta - 如果它回答了您的问题,请您接受并投票赞成。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2019-01-05
  • 2019-11-24
  • 2018-06-25
  • 2021-09-27
相关资源
最近更新 更多