【发布时间】:2016-09-19 03:33:47
【问题描述】:
我在 TensorFlow 中查看 official batch normalization layer (BN),但它并没有真正解释如何将它用于卷积层。有人知道该怎么做吗?尤其重要的是它应用和学习每个特征图的相同参数(而不是每个激活)。以其他顺序应用和学习每个过滤器的 BN。
在一个特定的玩具示例中说我想在 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) 将 BN 应用于每个过滤器创建的每个特征。在伪代码中:
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。
【问题讨论】:
标签: machine-learning neural-network tensorflow conv-neural-network