【问题标题】:Keras / Tensorflow: Wierd dropout behaviourKeras / Tensorflow:奇怪的辍学行为
【发布时间】:2018-01-12 01:54:26
【问题描述】:

我想看看 dropout 是如何工作的,所以我进入了 layers.core 模块并将退出调用从 in_train_phase 更改为 in_test_phase。

我不确定我的更改是否对奇怪的辍学行为负责, 所以请多多包涵。

现在考虑到这些变化,下面的代码 sn-p:

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 在密集输出层上定义, 所以它应该只影响关闭和打开的神经元,而不是它们的 各自的值。对吧?

【问题讨论】:

  • 你对layers.core做了什么改变?当然,这就是奇怪行为的原因。如果您撤消该更改,并使用不同的丢弃率进行测试,错误是否仍然存在?
  • 继续尝试最小的更改并告诉我们。
  • @DarkCygnus 在 Keras 中的 Dropout 仅在训练期间有效。所以我(也许是幼稚的方式)让它可见是改变 - 我猜是回调 - 在 dropout 类中并使用 in_test_phase 而不是 in_train_phase,这会导致这种行为。如果您知道检查 dropout 层的任何其他方法,请澄清。

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


【解决方案1】:

发生这种情况是因为在使用Dropout 时,您不仅可以打开和关闭不同的神经元,而且还可以缩放数据,以补偿由于部分神经元变黑而导致下一层接收到较少信号的事实。它被称为倒置辍学,你可以阅读它here

因此,基本上,您网络的每个输出都会按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

【讨论】:

  • 有趣,所以这是一个使信号仍能触发其层的激活的功能,以补偿由于 Dropout 引起的“较少”神经元放电?
  • 是的。如果不从训练阶段切换到推理阶段,可能会严重改变网络行为。
猜你喜欢
  • 2020-09-28
  • 2018-10-01
  • 2017-12-24
  • 2017-11-05
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2022-07-11
  • 2021-12-01
相关资源
最近更新 更多