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
应该冻结每个时期的状态,而不需要调整参数
怎么了?
不错的收获!
看起来 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(来源)。