如何在TensorFlow中正确实现卷积的丢包

Bru*_* KM 5 machine-learning neural-network conv-neural-network tensorflow

根据关于Dropout的原始论文,正则化方法可以应用于卷积层,通常可以提高它们的性能.TensorFlow功能tf.nn.dropout通过提供一个noise_shape参数来支持,允许用户选择张量的哪些部分将独立退出.然而,论文和文献都没有明确解释哪些维度应该独立保存,而TensorFlow对noise_shape工作原理的解释还不清楚.

只有带有noise_shape [i] == shape(x)[i]的维度才会做出独立的决定.

我假设对于形状的典型CNN层输出,[batch_size, height, width, channels]我们不希望单独的行或列自己丢失,而是整个通道(这将等同于完全连接的NN中的节点),与示例无关(即,批量中的不同示例可以删除不同的通道).我在这个假设中是否正确?

如果是这样,如何使用noise_shape参数实现具有这种特异性的辍学?可不可能是:

noise_shape=[batch_size, 1, 1, channels]
Run Code Online (Sandbox Code Playgroud)

要么:

noise_shape=[1, height, width, 1]
Run Code Online (Sandbox Code Playgroud)

LI *_*ong 2

这里

例如,如果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
Run Code Online (Sandbox Code Playgroud)

该线路random_tensor +=支持广播。当noise_shape[i]设置为1时,意味着该维度上的所有元素都会添加相同的0到1范围内的随机值。因此,当 时noise_shape=[k, 1, 1, n],特征图中的每一行和每一列将保留或不保留在一起。另一方面,每个示例(批次)或每个通道接收不同的随机值,并且每个随机值将独立保存。