如何在TensorFlow

时间:2017-07-19 11:26:47

标签: machine-learning tensorflow neural-network conv-neural-network

根据关于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]

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]时,将保留要素图中的每个行和列或没有在一起。另一方面,每个示例(批处理)或每个通道接收不同的随机值,每个都将独立保存。