目前正试图通过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 回答
输入张量的形状为
[-1,28,28,1]
. 就像你提到的那样,最后一个维度是1,因为图像是灰度的 . 第一个索引是batchsize . 卷积将分别处理批次中的每个图像,因此批量大小对卷积 - 权重 - 张量维度没有影响,或者实际上对网络中的任何权重张量维度没有影响 . 这就是批量大小可以是任意的 .现在到了重量张量;你没有五个
5x1x32
-blocks,而是拥有32个5x5x1
-blocks . 每个代表一个功能 . 1是贴片的深度,由于灰度等级为1(彩色图像为5x5x3x32
) .5x5
是补丁的大小 .数据张量中的维度排序与卷积权重张量中的维度排序无关 .
除了另一个答案,我想补充一点,
没有具体原因我们选择5x5补丁或32个功能,所有这些参数都经验丰富(除了在某些情况下),您可以使用3x3补丁或更大的功能 .
我说'除了在某些情况下',因为我们可以使用3x3补丁从图像中捕获更多细节中的信息,或者更大的特征尺寸来更详细地了解每个图像(“更大”和“更多细节”在这种情况下是相对术语) .
不完全,但权重张量不是一个集合,它只是一个大小为
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'