训练年龄和性别检测模型时模型的准确度卡在 50%
Accuracy of model got stuck at 50% while training an Age and Gender detection model
我正在研究研究论文 Age and Gender Classification using Convolutional Neural Networks 中描述的年龄和性别检测模型的 Keras 实施。它最初是 Caffe 模型,但我想将其转换为 Keras。但是当我训练模型时,模型的准确率卡在了 49 - 52% 左右。这意味着模型根本没有学习。此外,可以看到损失呈指数增长,有时会变成 nan。我正在接受 google 与 GPU 硬件加速器协作的培训。
我的输入是一个图像文件夹,其标签在其文件中 name.I 将所有图像加载为一个 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
我使用了正确的优化器和正确的初始化器以及偏差来防止梯度消失。
建议遵循以下方法来提高模型的准确性 -
- 构建两个不同的模型,一个用于性别预测,另一个用于年龄预测。
- 在目标变量上使用标签编码器或一个热编码器。
- 对于性别预测模型,使用二元交叉熵作为损失函数。
- 对于年龄预测模型,使用分类交叉熵(如果您对目标变量使用了标签编码器)或稀疏分类交叉熵(如果您对目标变量使用了一个热编码器)。
- 在构建模型之前,将所有数值数据归一化。
- 在最后一层使用 softmax 作为激活函数,在剩余层使用 relu。
- 另外,不要使用 2 个隐藏的密集层,而只保留 1 个(更密集的层意味着要学习更多的权重,您可以尝试层数和过滤器的数量)。
希望我已经回答了你的问题。快乐学习!
我正在研究研究论文 Age and Gender Classification using Convolutional Neural Networks 中描述的年龄和性别检测模型的 Keras 实施。它最初是 Caffe 模型,但我想将其转换为 Keras。但是当我训练模型时,模型的准确率卡在了 49 - 52% 左右。这意味着模型根本没有学习。此外,可以看到损失呈指数增长,有时会变成 nan。我正在接受 google 与 GPU 硬件加速器协作的培训。
我的输入是一个图像文件夹,其标签在其文件中 name.I 将所有图像加载为一个 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 我使用了正确的优化器和正确的初始化器以及偏差来防止梯度消失。
建议遵循以下方法来提高模型的准确性 -
- 构建两个不同的模型,一个用于性别预测,另一个用于年龄预测。
- 在目标变量上使用标签编码器或一个热编码器。
- 对于性别预测模型,使用二元交叉熵作为损失函数。
- 对于年龄预测模型,使用分类交叉熵(如果您对目标变量使用了标签编码器)或稀疏分类交叉熵(如果您对目标变量使用了一个热编码器)。
- 在构建模型之前,将所有数值数据归一化。
- 在最后一层使用 softmax 作为激活函数,在剩余层使用 relu。
- 另外,不要使用 2 个隐藏的密集层,而只保留 1 个(更密集的层意味着要学习更多的权重,您可以尝试层数和过滤器的数量)。
希望我已经回答了你的问题。快乐学习!