根据关于Dropout的原始论文,正规化方法可以应用于卷积层,通常可以提高它们的性能。 TensorFlow函数tf.nn.dropout
通过使用noise_shape
参数来支持,允许用户选择张量的哪些部分将独立退出。但是,论文和文档都没有明确解释哪些维度应该独立保存,而TensorFlow对noise_shape
如何工作的解释还不清楚。
只有带有noise_shape [i] == shape(x)[i]的维度才会做出独立决定。
我认为对于形状[batch_size, height, width, channels]
的典型CNN层输出,我们不希望单独的行或列自行丢弃,而是整个通道(这相当于一个节点)完全连接的NN)独立于示例(即,可以针对批次中的不同示例丢弃不同的通道)。我在这个假设中是否正确?
如果是这样,那么如何使用noise_shape
参数实现具有这种特异性的辍学?它会是:
noise_shape=[batch_size, 1, 1, channels]
或:
noise_shape=[1, height, width, 1]
答案 0 :(得分:2)
来自here,
例如,如果shape(x)= [k,l,m,n]和noise_shape = [k,1,1,n],则每个批处理和通道组件将独立保存,每个行和列将是保持或不保持在一起。
代码可能有助于解释这一点。
noise_shape = noise_shape if noise_shape is not None else array_ops.shape(x)
# uniform [keep_prob, 1.0 + keep_prob)
random_tensor = keep_prob
random_tensor += random_ops.random_uniform(noise_shape,
seed=seed,
dtype=x.dtype)
# 0. if [keep_prob, 1.0) and 1. if [1.0, 1.0 + keep_prob)
binary_tensor = math_ops.floor(random_tensor)
ret = math_ops.div(x, keep_prob) * binary_tensor
ret.set_shape(x.get_shape())
return ret
第random_tensor +=
行支持broadcast。当noise_shape [i]设置为1时,这意味着此维度中的所有元素将添加从0到1的相同随机值。因此,当noise_shape=[k, 1, 1, n]
时,将保留要素图中的每个行和列或没有在一起。另一方面,每个示例(批处理)或每个通道接收不同的随机值,每个都将独立保存。