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)
从这里,
例如,如果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],特征图中的每一行和每一列将保留或不保留在一起。另一方面,每个示例(批次)或每个通道接收不同的随机值,并且每个随机值将独立保存。
| 归档时间: |
|
| 查看次数: |
1942 次 |
| 最近记录: |