Python tensorflow-了解卷积的张量形状

Python tensorflow-了解卷积的张量形状,python,tensorflow,neural-network,conv-neural-network,Python,Tensorflow,Neural Network,Conv Neural Network,目前,我正在努力解决这个问题,我需要一些帮助来理解darn张量的维数 因此,我们有大小为28x28像素的图像 卷积将为每个5x5面片计算32个特征 现在让我们接受这一点,稍后再问问自己为什么有32个功能,为什么有5x5个补丁 其重量张量的形状为[5,5,1,32]。前两个维度是面片大小,下一个维度是输入通道数,最后一个维度是输出通道数 W\u conv1=weight\u变量([5,5,1,32]) b_conv1=偏差变量([32]) 如果你这么说 为了应用该层,我们首先将x重塑为4d张量,第

目前,我正在努力解决这个问题,我需要一些帮助来理解darn张量的维数

因此,我们有大小为28x28像素的图像

卷积将为每个5x5面片计算32个特征

现在让我们接受这一点,稍后再问问自己为什么有32个功能,为什么有5x5个补丁

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

W\u conv1=weight\u变量([5,5,1,32])

b_conv1=偏差变量([32])

如果你这么说

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

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

好吧,现在我迷路了

从这最后一次重塑来看,我们有 “howevermany”
28x28x1
“块”是我们的图像像素

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

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

如果我们想推断每个补丁的
32
特性,我想
x32
是有意义的

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

为什么重量张量看起来是这样的

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

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


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

现在是重量张量;您没有五个
5x1x32
-块,而是有32个
5x5x1
-块。每个代表一个特征。1是面片的深度,由于灰度的原因是1(对于彩色图像,它将是
5x5x3x32
)。
5x5
是补丁的大小


数据张量中的维数排序不同于卷积权张量中的维数排序

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

现在让我们接受这一点,稍后再问问自己为什么有32个功能,为什么有5x5个补丁

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

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

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

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

为什么重量张量看起来是这样的

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

更多详细信息:

所以这行
tf.nn.conv2d(x,W,strips=[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,步长=[1,1,1,1],padding='SAME')
获取x并应用W(这是一个
3x3
补丁,并在步长为1的
28x28
图像上应用whis补丁(因为步长为1),然后再次给出大小为
28x28
的结果图像,因为我们使用
padding='SAME'

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