训练卷积神经网络时准确性突然下降50%

Der*_*aut 5 python neural-network keras tensorflow

使用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)
Run Code Online (Sandbox Code Playgroud)

每当模型达到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
Run Code Online (Sandbox Code Playgroud)

答案也有一些类似的问题,但是大多数情况下,他们建议降低学习速度,但这完全没有帮助。

精度下降

UPD:几乎所有的网络权重和偏见都变得了nan。网络以某种方式消亡

Der*_*aut 1

这种情况下的解决方案:

我将sigmoid最后一层的功能更改为softmax功能,并且掉落消失了

为什么会这样呢?

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

更多信息:Sigmoid 与 Softmax

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