【问题标题】:tensorflow - understanding tensor shapes for convolutiontensorflow - 理解卷积的张量形状
【发布时间】:2017-05-05 13:11:00
【问题描述】:

目前正在尝试通过Tensorflow MNIST tutorial for convolutional networks 工作,我可以在了解该死张量的尺寸方面使用一些帮助。

所以我们有28x28 像素大小的图像。

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

让我们暂时接受这一点,稍后再问自己为什么要使用 32 个功能以及为什么要使用 5x5 补丁。

其权重张量的形状为[5, 5, 1, 32]。前两个维度是patch size,接下来是输入通道数,最后是输出通道数。

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')

)

【问题讨论】:

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


    【解决方案1】:

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

    现在到权重张量;你没有五个5x1x32-blocks,你宁愿有32个5x5x1-blocks。每个代表一个特征。 1 是补丁的深度,并且由于灰度而为 1(对于彩色图像,它将是 5x5x3x32)。 5x5 是补丁的大小。

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

    【讨论】:

      【解决方案2】:

      除了其他答案,我想补充几点,

      让我们暂时接受这一点,稍后再问自己为什么要使用 32 个功能以及为什么要使用 5x5 补丁。

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

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

      但是,如果这是排序,那么我们的权重张量本质上是五个 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,更详细地说,输入图像是一个28x28二维矩阵,矩阵的每个单元格显示一个值,表示灰度强度。如果输入图像是RGB所以我们应该有3通道而不是1,这个3通道表示输入图像是一个28x28x3 3D矩阵,3的第一维中的单元格显示红色的强度颜色,3的第二个维度显示绿色的强度,另一个显示蓝色的强度。

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

      【讨论】:

        猜你喜欢
        • 2021-04-09
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-05
        相关资源
        最近更新 更多