我在查看TensorFlow中的官方批量归一化层(BN),但它没有很好地解释如何将其用于卷积层。有人知道怎么做吗?特别是它应用和学习每个特征图相同的参数(而不是每个激活)。换句话说,它按过滤器应用和学习BN。
在一个具体的玩具示例中,假设我想在MNIST上使用带有BN的conv2d(本质上是2D数据)。因此,可以执行以下操作:
我们对其应用了适当的批量归一化层(在省略重要细节的伪代码中):
即对于每个过滤器
在一个具体的玩具示例中,假设我想在MNIST上使用带有BN的conv2d(本质上是2D数据)。因此,可以执行以下操作:
W_conv1 = weight_variable([5, 5, 1, 32]) # 5x5 filters with 32 filters
x_image = tf.reshape(x, [-1,28,28,1]) # MNIST image
conv = tf.nn.conv2d(x_image, W_conv1, strides=[1, 1, 1, 1], padding='VALID') #[?,24,24,1]
z = conv # [?,24,24,32]
z = BN(z) # [?,24,24,32], essentially only 32 different scales and shift parameters to learn, per filer application
a = tf.nn.relu(z) # [?,24,24,32]
其中z = BN(z)
会对每个卷积核生成的特征进行批量归一化。伪代码如下:
x_patch = x[h:h+5,w:w+h,1] # patch to do convolution
z[h,w,f] = x_patch * W[:,:,f] = tf.matmul(x_patch, W[:,:,f]) # actual matrix multiplication for the convolution
我们对其应用了适当的批量归一化层(在省略重要细节的伪代码中):
z[h,w,f] = BN(z[h,w,f]) = scale[f] * (z[h,w,f] - mu / sigma) + shift[f]
即对于每个过滤器
f
,我们应用 BN。
normalizer_params
是做什么的吗? - Charlie Parkertf.nn.conv2d
函数,而不是在'contrib/layers... etc (the file you provided)'中描述的那个。然后我使用grep,在https://github.com/tensorflow/tensorflow/blob/b826b79718e3e93148c3545e7aa3f90891744cc0/tensorflow/python/ops中查看了nn.py和nn_ops.py文件,但由于涉及到一些别名系统,包括"local_response_normalization"之类的东西,我完全迷失了...也许我将来会试试,但我首先会尝试直接使用tf.contrib.layers.whateverElse.conv2d函数。 - fr_andres