在训练卷积神经网络时,突然出现50%的准确率下降。

6

使用Keras和Tensorflow从头训练自己的数据集上的卷积神经网络。

学习率=0.0001, 需要分类5类, 未使用Dropout, 数据集已经检查两次,没有错误标签。

模型:

model = models.Sequential()
model.add(layers.Conv2D(16,(2,2),activation='relu',input_shape=(75,75,3)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(16,(2,2),activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(32,(2,2),activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Flatten())
model.add(layers.Dense(128,activation='relu'))
model.add(layers.Dense(5,activation='sigmoid'))

model.compile(optimizer=optimizers.adam(lr=0.0001),
             loss='categorical_crossentropy',
             metrics=['acc'])

history = model.fit_generator(train_generator,
                              steps_per_epoch=100,
                              epochs=50,
                              validation_data=val_generator,
                              validation_steps=25)

每当模型达到25-35个时期(80-90%准确率)时,就会发生以下情况:
Epoch 31/50
100/100 [==============================] - 3s 34ms/step - loss: 0.3524 - acc: 0.8558 - val_loss: 0.4151 - val_acc: 0.7992
Epoch 32/50
100/100 [==============================] - 3s 34ms/step - loss: 0.3393 - acc: 0.8700 - val_loss: 0.4384 - val_acc: 0.7951
Epoch 33/50
100/100 [==============================] - 3s 34ms/step - loss: 0.3321 - acc: 0.8702 - val_loss: 0.4993 - val_acc: 0.7620
Epoch 34/50
100/100 [==============================] - 3s 33ms/step - loss: 1.5444 - acc: 0.3302 - val_loss: 1.6062 - val_acc: 0.1704
Epoch 35/50
100/100 [==============================] - 3s 34ms/step - loss: 1.6094 - acc: 0.2935 - val_loss: 1.6062 - val_acc: 0.1724

有一些类似的问题和答案,但大多数建议降低学习率,但这根本没有帮助。

准确度下降

更新:网络中几乎所有权重和偏差都变成了 NaN 。 网络在某种程度上死亡了


你的数据集中有任何 nan 值吗? - X. W
你使用什么损失/成本函数?使用sigmoid激活作为最后一个密集层有特定的原因吗? - Vlad
训练和验证样本的数量是多少?每次计算准确率时,您是否使用整个验证数据? - Vlad
4
这是否为多标签问题(样本可以同时属于多个类别),还是简单的多类别问题(5个不重叠的类别)?如果是后者,您应该将最后一个激活函数更改为softmax - desertnaut
1
失败似乎是由于最后一层的sigmoid函数。您应该改用softmax激活函数。 - Shubham Panchal
显示剩余2条评论
1个回答

1
在这种情况下的解决方案是:我将最后一层中的sigmoid函数更改为softmax函数,然后就消除了掉落。为什么会奏效呢?sigmoid激活函数用于二元(两类)分类。在多类分类问题中,我们应该使用softmax函数 - sigmoid函数在多类分类问题中的特殊扩展。更多信息请参见:Sigmoid vs Softmax。特别感谢@desertnaut和@Shubham Panchal指出错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接