【问题标题】:How to correctly implement dropout for convolution in TensorFlow如何在 TensorFlow 中正确实现卷积的 dropout
【发布时间】:2017-07-19 11:26:46
【问题描述】:

根据关于 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 参数来实现具有这种特殊性的dropout?会不会:

noise_shape=[batch_size, 1, 1, channels]

或:

noise_shape=[1, height, width, 1]

【问题讨论】:

  • 我不完全确定放弃整个频道是标准的。我在不同的地方读过不同的东西,在我看来,许多人独立地删除了单个元素(skalars),即将noise_shape 保留为默认值。
  • 你所做的被称为空间辍学(SO postpaper)。在我看来,标准的 dropout,即使对于 conv 层,也是每个元素独立的

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


【解决方案1】:

来自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]时,特征图中的每一行和每一列都会保留或不保留一起。另一方面,每个样本(批次)或每个通道都会接收到不同的随机值,并且它们中的每一个都将独立保存。

【讨论】:

    猜你喜欢
    • 2016-12-23
    • 2017-10-25
    • 2017-06-14
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2017-07-18
    • 2019-11-24
    • 2016-10-13
    相关资源
    最近更新 更多