张量流 - 理解卷积的张量形状

时间:2017-05-05 13:11:01

标签: python tensorflow neural-network conv-neural-network

目前正试图通过Tensorflow MNIST tutorial for convolutional networks,我可以使用一些帮助来理解相关张量的尺寸。

因此我们的图片大小为28x28像素。

  

卷积将为每个5x5补丁计算32个特征。

现在让我们接受这个,然后问自己为什么有32个功能以及5x5补丁的原因。

  

它的重量张量的形状为[5, 5, 1, 32]。前两个维度是补丁大小,下一个是输入通道的数量,最后一个是输出通道的数量。

     

W_conv1 = weight_variable([5, 5, 1, 32])

     

b_conv1 = bias_variable([32])

如果你这么说......

  

要应用图层,我们首先将x重塑为4d张量,第二维和第三维对应于图像宽度和高度,最终尺寸对应于颜色通道数。

     

x_image = tf.reshape(x, [-1,28,28,1])

好吧,现在我迷路了。

从这最后的重塑来看,我们有 " howevermany" 28x28x1"阻止"像素是我们的图像。

我想这是有道理的,因为图像是灰度

但是,如果这是排序,那么我们的权重张量基本上是五个5x1x32"块"的集合。价值观。

如果我们想推断每个补丁的x32个功能,那么32就有意义了

其余的,我并不十分相信。

为什么体重张量看起来就像它显然那样?

(为了完整性:我们使用它们

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)

,其中

def conv2d(x,W):
    '''
    2D convolution, expects 4D input x and filter matrix W
    '''
    return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding ='SAME')

def max_pool_2x2(x):
    '''
    max-pooling, using 2x2 patches
    '''
    return tf.nn.max_pool(x,ksize=[1,2,2,1], strides=[1,2,2,1],padding='SAME')

2 个答案:

答案 0 :(得分:7)

您的输入张量的形状为[-1,28,28,1]。就像你提到的那样,最后一个维度是1,因为图像是灰度的。第一个索引是batchsize。卷积将独立处理批次中的每个图像,因此批量大小对卷积 - 权重 - 张量维度没有影响,或者实际上对网络中的任何权重张量维度没有影响。这就是批量大小可以是任意的(-1表示张量流中的任意大小)。

现在到了重量张量;你没有五个5x1x32 - 块,你宁可拥有32个5x5x1 - 块。每个代表一个功能。 1是贴片的深度,由于灰度等级为1(彩色图像为5x5x3x32)。 5x5是补丁的大小。

数据张量中的维度顺序与卷积权重张量中的维度顺序不同。

答案 1 :(得分:1)

除了另一个答案,我想补充一点,

  

现在让我们接受这个,然后问自己为什么有32个功能以及5x5补丁的原因。

我们选择5x5补丁或32个功能没有具体原因,所有这些参数都经验丰富(除非在某些情况下),您可以使用3x3补丁或更大的功能。

我说过,除了在某些情况下',因为我们可以使用3x3补丁来捕捉更多细节中的图像信息,或更大的特征尺寸来更详细地了解每个图像('更大' 39;以及'更多细节'在这种情况下是相对术语。)

  

然而,如果这是排序,那么我们的权重张量基本上是五个5x1x32"块"的集合。价值观。

不完全,但权重张量不是一个集合,它只是一个尺寸为5x5的滤镜,输入频道1和输出要素(频道)32

  

为什么体重张量看起来就像它显然那样?

权重张量weight_variable([5, 5, 1, 32])告诉我要在图片上应用5x5补丁大小,我有1输入要素(因为图像是灰度)并且32输出功能(频道)。

更多详情:

因此,此行tf.nn.conv2d(x,W,strides=[1,1,1,1],padding ='SAME')将输入x视为[-1,28,28,1]-1表示您可以将此尺寸放入所需尺寸(批量大小),28,28显示输入尺寸,它必须正好是28x82,最后一个1显示输入通道的数量,因为mnist图像是灰度级的,因此它是1,更详细地说它表示输入图像是{{1 2D矩阵和矩阵的每个单元格显示一个表示灰度强度的值。如果输入图像是RGB,那么我们应该28x28通道而不是3,并且此1通道表示输入图像是3 3D矩阵,第一维中的单元格28x28x3显示红色的强度,3的第二个维度显示绿色的强度,另一个显示蓝色。

现在3需要x并应用W(这是一个tf.nn.conv2d(x,W,strides=[1,1,1,1],padding ='SAME')个修补程序并在步骤大小为1的3x3图像上应用whis补丁(因为stride为1)并给出结果图像再次调整大小28x28,因为我们使用28x28