我正在执行多类图像分类任务。在训练我的CNN时,验证准确性在所有时期均保持不变。我尝试了不同的模型架构和不同的超参数值,但没有任何变化。任何想法将不胜感激。这是我目前的结果: Train and Validation Loss and Accuracy
这是我的CNN:
model = models.Sequential()
model.add(Conv2D(32, (3, 3), activation = 'relu', input_shape= .
(img_width, img_height, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation = 'relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation = 'relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.2))
model.add(layers.Dense(64, activation = 'relu'))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(8, activation = 'softmax'))
model.compile(loss='categorical_crossentropy',
optimizer=optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999,
epsilon=1e-08, decay=0.0001),metrics = ['acc'])
model.summary()
答案 0 :(得分:0)
有多种可能导致此现象的潜在因素-以下是您可以尝试的一些初步修复的列表,但绝非详尽无遗:
如果您使用的是Adam优化器(或任何其他自适应学习速率优化器,例如RMSprop或Adadelta),请尝试使用比默认值小得多的初始学习率,大约在10E-6左右。或者,尝试以10E-2至10E-3范围内的某个地方的初始学习率进行随机梯度下降。您还可以设置较大的初始学习率,并通过使用Keras的LearningRateScheduler回调并定义自定义学习率计划(用于SGD)在几个训练时期内对其进行退火。
如果上述方法不起作用,请尝试降低网络的复杂性(例如,层数)并增加训练集的大小。另外,在检查训练数据集时,请确保训练集不会遭受班级不平衡的困扰-如果确实如此,则可以使用class_weights
参数来人为地加权与代表性不足的班级训练示例相关的损失可以传递给模型的fit()
方法。
如果问题仍然存在,那么您可能不得不面对这样的可能性,即持续的验证损失可能实质上是与噪声相适应的假象,并且模型发出的任何(甚至有些合理的)预测都可能是虚假的。此时,您可能想尝试提取更多有用的功能,更多的功能或对您的训练集进行大量的数据扩充。
请查看此GitHub问题,以获取可能有助于解决问题的进一步建议: