Python tensorflow-了解卷积的张量形状
目前,我正在努力解决这个问题,我需要一些帮助来理解darn张量的维数 因此,我们有大小为28x28像素的图像 卷积将为每个5x5面片计算32个特征 现在让我们接受这一点,稍后再问问自己为什么有32个功能,为什么有5x5个补丁 其重量张量的形状为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张量,第
[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')