首页 文章

为什么卷积神经网络的张量维数是给定的? - TensorFlow

提问于
浏览
2

我在理解使用TensorFlow Build 卷积神经网络时使用的张量的维数时遇到了一些麻烦 . 例如,在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) ?转置,似乎更直观,因为它最终是一个补丁大小的矩阵的集合 .

*** EDIT ***

我实际上很好奇为什么张量的尺寸按他们的方式排序 .

对于输入,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) (这似乎更直观,因为它是'patch matrices.'的集合)

2 回答

  • 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]

    该卷积层输出y的维数:

    y - [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,我个人非常清楚并且深刻地解释了它 .

    Edit: The order of the dimension

    就维度的顺序而言,据我所知,它的直观性按照[高度,宽度,通道/深度]的顺序排列 . 事实上,您可以简单地将具有此维度顺序的样本矩阵粘贴到 import matplotlib.pyplot as plt; plt.imhow(sample_matrix) 中,以绘制人眼友好的图像 . 我认为前三个重量尺寸顺序遵循[高度,宽度,深度]的传统顺序 . 我推测这种一致性使得执行卷积操作变得容易,因为我读到这一步骤的一个常见实现是将3D张量展平为2D并使用下面的矩阵乘法库 . 我想你可以将维度的顺序改变成你想要的方式,只要实际计算btw维度正确完成 .

  • 2

    我相信形状中1的额外尺寸是针对通道的,这是 conv2d 所需的 . 换句话说,如果MNIST图像是彩色的,它将是3(对于RGB),但由于它们是灰度的,所以它是只有1 .

    我对维度顺序没有直观的解释 - 也许别人会 .

相关问题