【问题标题】:Sudden 50% accuracy drop while training convolutional NN训练卷积神经网络时准确率突然下降 50%
【发布时间】:2019-08-07 10:55:35
【问题描述】:

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

learning rate = 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 个 epoch(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

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

UPD:网络中几乎所有的权重和偏差都变成了nan。网络不知何故死在里面

【问题讨论】:

  • 您的数据集中有任何nan 值吗?
  • 你使用什么损失/成本函数?最后一个密集层使用sigmoid激活是否有任何具体原因?
  • 训练和验证样本的数量是多少?每次计算准确度时是否使用整个验证数据?
  • 这是一个多标签问题(样本可以同时属于多个类)还是只是多类(5个不重叠的类)?如果是第二个,你一定要把上次激活改成softmax)
  • 失败似乎是因为sigmoid函数最后一层。您应该改用 softmax 激活函数。

标签: python tensorflow keras neural-network


【解决方案1】:

这种情况下的解决方案:

我将最后一层的 sigmoid 函数更改为 softmax 函数,并且drops消失了

为什么会成功?

sigmoid 激活函数用于二元(二分类)分类。 在多分类问题中,我们应该使用softmax 函数 - 对多分类问题的sigmoid 函数的特殊扩展。

更多信息:Sigmoid vs Softmax

特别感谢@desertnaut 和@Shubham Panchal 的错误提示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-12
    • 2018-05-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多