Keras / Tensorflow:奇怪的辍学行为

时间:2018-01-11 17:18:34

标签: python tensorflow machine-learning neural-network keras

我想看看dropout是如何工作的,所以我进入了layers.core 模块并将退出调用从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))
根据辍学率,

会产生不同的预测。

e.g:

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.]]]

我哪里错了?丢失是在密集输出层上定义的, 所以它应该只影响关闭和打开的神经元,而不是它们的神经元 各自的价值观正确?

1 个答案:

答案 0 :(得分:7)

这是因为在使用Dropout时,您不仅可以打开和关闭不同的神经元,还可以缩放数据,以便补偿下一层因为部分神经元变黑而接收的信号较少这一事实。它被称为反向辍学,您可以阅读它here

基本上,您的网络中的每个输出都会通过1 / (1 - p)因素重新调整此补偿。这就是你的输出不同的原因。

对于Dropout(0.2)1 / (1 - 0.2) = 1.25补偿为5 = 4 * 1.25Dropout(0.5)补偿为1 / (1 - 0.5) = 2,结果为8 = 4 * 2。< / p>