在Keras中的丢失行为,其中rate = 1(丢弃所有输入单元)并不像预期的那样

Dan*_*ung 7 python machine-learning neural-network keras tensorflow

input0 = keras.layers.Input((32, 32, 3), name='Input0')
flatten = keras.layers.Flatten(name='Flatten')(input0)
relu1 = keras.layers.Dense(256, activation='relu', name='ReLU1')(flatten)
dropout = keras.layers.Dropout(1., name='Dropout')(relu1)
softmax2 = keras.layers.Dense(10, activation='softmax', name='Softmax2')(dropout)
model = keras.models.Model(inputs=input0, outputs=softmax2, name='cifar')
Run Code Online (Sandbox Code Playgroud)

只是为了测试丢失是否有效..

我将辍学率设为1.0

应该冻结每个时期的状态,而不需要调整参数

然而,尽管我丢弃了所有隐藏的节点,但准确性仍然在增长 在此输入图像描述 在此输入图像描述

怎么了?

des*_*aut 5

不错的收获!

看起来 Dennis Soemers 在上面的评论中链接的问题,Keras Dropout 层用 dropout=0.0 更改结果,尚未完全解决,并且在面临 1.0 的 dropout 率时会以某种方式出现错误 [请参阅末尾的更新邮政]; 修改Keras MNIST MLP示例中显示的模型:

model = Sequential()
model.add(Dense(512, activation='relu', use_bias=False, input_shape=(784,)))
model.add(Dropout(1.0))
model.add(Dense(512, activation='relu'))
model.add(Dropout(1.0))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss='categorical_crossentropy',
          optimizer=RMSprop(),
          metrics=['accuracy'])

model.fit(x_train, y_train,
          batch_size=128,
          epochs=3,
          verbose=1,
          validation_data=(x_test, y_test))
Run Code Online (Sandbox Code Playgroud)

尽管所有神经元都被丢弃,但确实给出了一个正在训练的模型,正如您所报告的:

Train on 60000 samples, validate on 10000 samples
Epoch 1/3
60000/60000 [==============================] - 15s 251us/step - loss: 0.2180 - acc: 0.9324 - val_loss: 0.1072 - val_acc: 0.9654
Epoch 2/3
60000/60000 [==============================] - 15s 246us/step - loss: 0.0831 - acc: 0.9743 - val_loss: 0.0719 - val_acc: 0.9788
Epoch 3/3
60000/60000 [==============================] - 15s 245us/step - loss: 0.0526 - acc: 0.9837 - val_loss: 0.0997 - val_acc: 0.9723
Run Code Online (Sandbox Code Playgroud)

尽管如此,如果您尝试使用 0.99 的 dropout 率,即将上述模型中的两个 dropout 层替换为

Train on 60000 samples, validate on 10000 samples
Epoch 1/3
60000/60000 [==============================] - 15s 251us/step - loss: 0.2180 - acc: 0.9324 - val_loss: 0.1072 - val_acc: 0.9654
Epoch 2/3
60000/60000 [==============================] - 15s 246us/step - loss: 0.0831 - acc: 0.9743 - val_loss: 0.0719 - val_acc: 0.9788
Epoch 3/3
60000/60000 [==============================] - 15s 245us/step - loss: 0.0526 - acc: 0.9837 - val_loss: 0.0997 - val_acc: 0.9723
Run Code Online (Sandbox Code Playgroud)

那么实际上您实际上没有进行任何培训,情况应该如此:

Train on 60000 samples, validate on 10000 samples
Epoch 1/3
60000/60000 [==============================] - 16s 265us/step - loss: 3.4344 - acc: 0.1064 - val_loss: 2.3008 - val_acc: 0.1136
Epoch 2/3
60000/60000 [==============================] - 16s 261us/step - loss: 2.3342 - acc: 0.1112 - val_loss: 2.3010 - val_acc: 0.1135
Epoch 3/3
60000/60000 [==============================] - 16s 266us/step - loss: 2.3167 - acc: 0.1122 - val_loss: 2.3010 - val_acc: 0.1135
Run Code Online (Sandbox Code Playgroud)

更新(在 OP 中 Yu-Yang 发表评论后):这似乎是一种设计选择(现在交易链接,请参阅下面的更新),当退出率等于 0 或 1 时不执行任何操作;该类Dropout仅生效

model.add(Dropout(0.99))
Run Code Online (Sandbox Code Playgroud)

然而,正如已经评论的那样,在这种情况下发出警告消息(以及文档中的相关注释)可以说是一个好主意。

更新(2021 年 7 月):自 2018 年 1 月撰写答案以来发生了一些变化;现在,在幕后,Keras 调用了tf.nn.dropout,这似乎不允许dropout=1来源)。