首页 文章

tensorflow - 理解卷积的张量形状

提问于
浏览
1

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

所以我们有大小为 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 "blocks" .

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

但是,如果这是排序,那么我们的权重张量基本上是五个值的集合 .

如果我们想要推断每个补丁的 32 功能,那么 x32 是有道理的

不过,其余的,我并不十分相信 .

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

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

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 回答

  • 7

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

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

    数据张量中的维度排序与卷积权重张量中的维度排序无关 .

  • 1

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

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

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

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

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

    不完全,但权重张量不是一个集合,它只是一个大小为 5x5 的过滤器和输入通道 1 和输出功能(通道) 32

    为什么体重张量看起来很明显呢?

    权重张量 weight_variable([5, 5, 1, 32]) 告诉我有 5x5 补丁大小应用于图像,我有 1 输入功能(因为图像是灰度)和 32 输出功能(通道) .

    More Details:

    所以这一行 tf.nn.conv2d(x,W,strides=[1,1,1,1],padding ='SAME') 将输入x视为 [-1,28,28,1]-1 意味着你可以在这个维度中放入你想要的任何大小(批量大小), 28,28 显示输入大小,它必须精确到28x82,最后 1 显示输入通道的数量,因为mnist图像是灰度级的所以它是 1 ,更详细地说它表示输入图像是 28x28 2D矩阵,并且矩阵的每个单元格显示指示灰度级强度的值 . 如果输入图像是RGB,那么我们应该 3 通道而不是 1 ,这个 3 通道表示输入图像是 28x28x3 3D矩阵, 3 第一维中的单元格显示红色的强度, 3 的第二维显示强度绿色和其他显示蓝色 .

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

相关问题