我在理解使用TensorFlow建立卷积神经网络时使用的张量的维数时遇到了一些麻烦。例如,在this教程中,28x28 MNIST图像的表示如下:
import TensorFlow as tf
x = tf.placeholder(tf.float32, shape=[None, 784])
x_image = tf.reshape(x, [-1,28,28,1])
假设我有十个训练图像,上面的重塑使我的输入x_image
成为一个包含二十八个28维列向量的十个子集的集合。
使用
似乎更自然x_image_natural = tf.reshape(x, [-1,28,28])
而是,它将返回10个28x28矩阵。
插图:
a = np.array(range(8))
opt1 = a.reshape(-1,2,2,1)
opt2 = a.reshape(-1,2,2)
print opt1
print opt2
# opt1 - column vectors
>>[[[[0]
>>[1]]
>>[[2]
>>[3]]]
>>[[[4]
>>[5]]
>>[[6]
>>[7]]]]
# opt2 - matrices
>>[[[0 1]
>>[2 3]]
>>[[4 5]
>>[6 7]]]
同样,有一种直观的方法可以理解为什么卷积层具有维(height_of_patch, width_of_patch, num_input_layers, num_output_layers)
?转置,似乎更直观,因为它最终是一个补丁大小的矩阵的集合。
*编辑*
我真的很好奇为什么张量的尺寸按照它们的方式排序。
对于输入,X,我们为什么不使用
x_image = tf.reshape(x, [-1,i,28,28])
会创建batch_size,i
大小的28x28矩阵数组(其中i
是输入层的数量)?
同样地,为什么权重张量不像(num_output_layers, num_input_layers, input_height, input_width)
那样(这似乎更直观,因为它是'补丁矩阵'的集合。)
答案 0 :(得分:3)
一层二维卷积的工作方式是在输入上滑动2D窗口/滤镜/补丁以计算特征映射"。放入此MNIST数据集的上下文中,输入是灰度图像,因此它们的尺寸为[height,width,num_channels]([28,28,1])。假设您决定使用3x3窗口/过滤器/补丁,这将确定此卷积层权重的前两个维度(height_of_path = 3,width_of_path = 3)。这种滑动跨越高度和宽度尺寸的原因是为了共享神经元并保持统计不变性(鸟无论它在图片中出现的位置仍然是鸟),此外,它还带来了降低计算的一些好处。每个通道/深度被认为携带唯一信息(在RGB通道情况下,R = 255和G = 255表示完全不同的事物)并且我们不想在不同深度/通道上共享神经元。因此,卷积层的权重的第三维与输入相同。深度维度(MNIST情况下第一个卷积层中的num_input_layers = 1)。卷积层权重的最后一个维度是用户可以决定的超参数。此数字确定在此卷积层之后生成的特征映射的数量。值越大,计算成本越高。
快速摘要。对于任何2D卷积层,假设它接收尺寸为:
的输入X.X - [batch_size,input_height,input_width,input_depth]
然后该卷积层的权重w将具有以下维度:
w - [filter_height,filter_width,input_depth,output_depth]
此卷积层输出维度为:
的yy - [batch_size,output_height,output_width,output_depth]
通常ppl使filter_height = filter_width,并且经常设置filter_height = 3,5,7.output_depth是用户可以决定的超参数。 output_height和output_width是根据input_height,input_weight,filter_height,filter_width,滑动选择和填充选择等确定的。
如需了解更多信息,我鼓励您阅读Stanford CS231 notes on ConvNet,我个人非常清楚并且深刻地解释了这一点。
编辑:维度的顺序
就维度的顺序而言,据我所知,它更像是一种惯例,而不是"对"或"错误"。对于一个样本输入,我认为按照[高度,宽度,通道/深度]的顺序对其尺寸进行排序是直观的。事实上,您可以简单地将具有此维度顺序的样本矩阵粘贴到import matplotlib.pyplot as plt; plt.imhow(sample_matrix)
中,以绘制人眼友好的图像。我认为前三个重量尺寸顺序遵循[高度,宽度,深度]的传统顺序。我推测这种一致性使得执行卷积操作变得容易,因为我读到这一步骤的一个常见实现是将3D张量展平为2D并使用下面的矩阵乘法库。我想你只要实际计算btw尺寸正确完成,你就可以将尺寸的顺序改变成你想要的方式。
答案 1 :(得分:2)
我认为形状中额外的1维是针对频道的,这是conv2d
所必需的。换句话说,如果MNIST图像是彩色的,那么它将是3(对于RGB),但由于它们是灰度的,因此只有1。
我对维度顺序没有直观的解释 - 也许其他人会。