不错的收获!
丹尼斯·索默斯(Dennis Soemers)上述评论中提到的问题似乎是这样的,Keras Dropout 层更改 dropout=0.0 的结果 https://github.com/tensorflow/tensorflow/issues/10845,尚未完全解决,并且当面临 1.0 的辍学率时,它会以某种方式出错[请参阅帖子末尾的更新];修改显示的模型Keras MNIST MLP https://github.com/keras-team/keras/blob/master/examples/mnist_mlp.py例子:
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))
尽管所有神经元都被丢弃,但确实给出了一个正在训练的模型,正如您所报告的:
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
尽管如此,如果您尝试使用 0.99 的 dropout 率,即将上述模型中的两个 dropout 层替换为
model.add(Dropout(0.99))
那么实际上您实际上没有进行任何培训,情况应该如此:
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
UPDATE(在OP中Yu-Yang评论之后):这似乎是设计选择 https://github.com/keras-team/keras/blob/master/keras/layers/core.py#L120(立即处理链接,请参阅下面的更新)当退出率等于 0 或 1 时不执行任何操作;这Dropout
类仅生效
if 0. < self.rate < 1.
然而,正如已经评论的那样,在这种情况下发出警告消息(以及文档中的相关注释)可以说是一个好主意。
UPDATE(2021 年 7 月):
自 2018 年 1 月撰写答案以来发生了一些变化;现在,在引擎盖下,Keras 调用tf.nn.dropout https://github.com/keras-team/keras/blob/master/keras/layers/core/dropout.py#L116,这似乎不允许dropout=1
(source https://github.com/tensorflow/tensorflow/blob/v2.5.0/tensorflow/python/ops/nn_ops.py#L5185).