[英]Keras / Tensorflow: Weird dropout behaviour
我想看看 dropout 是如何工作的,所以我进入了 layers.core 模块并将 dropout 调用从 in_train_phase 更改为 in_test_phase。
我不确定我的更改是否对奇怪的辍学行为负责,所以请多多包涵。
现在考虑到这些变化,下面的代码片段:
from keras.models import Model
from keras.layers import Dropout, Input
import numpy as np
import tensorflow as tf
from keras import initializers
x=np.ones((2,2,4))
# x[:,1,:] = 1
print(x)
from keras.layers import Dense
input = Input(name='atom_inputs', shape=(2, 4))
x1 = Dense(4, activation='linear',
kernel_initializer=initializers.Ones(),
bias_initializer='zeros')(input)
x1 = Dropout(0.5, noise_shape=(tf.shape(input)[0], 1, 4))(x1)
fmodel = Model(input, x1)
fmodel.compile(optimizer='sgd', loss='mse')
print(fmodel.predict(x))
将根据辍学率产生不同的预测。
例如:
Dropout(0.2)
[[[5. 5. 5. 5.]
[5. 5. 5. 5.]]
[[5. 0. 5. 0.]
[5. 0. 5. 0.]]]
Dropout(0.5)
[[[0. 0. 8. 8.]
[0. 0. 8. 8.]]
[[8. 0. 8. 8.]
[8. 0. 8. 8.]]]
我哪里错了? dropout 是在密集输出层上定义的,因此它应该只影响关闭和打开的神经元,而不影响它们各自的值。 正确的?
发生这种情况是因为在使用Dropout
时,您不仅可以打开和关闭不同的神经元,还可以缩放数据,以补偿由于部分神经元变黑而导致下一层接收到较少信号的事实。 这称为倒置辍学,您可以在此处阅读。
因此,基本上,您网络的每个输出都会按1 / (1 - p)
因子重新缩放以进行补偿。 这就是您的输出不同的原因。
对于Dropout(0.2)
补偿为1 / (1 - 0.2) = 1.25
,结果为5 = 4 * 1.25
,对于Dropout(0.5)
补偿为1 / (1 - 0.5) = 2
,结果为8 = 4 * 2
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.