Python tf.nn.conv2d()对输入张量形状有什么影响?

Python tf.nn.conv2d()对输入张量形状有什么影响?,python,tensorflow,deep-learning,tensorboard,Python,Tensorflow,Deep Learning,Tensorboard,我正在研究蒲公英鬃毛的张力板代码: 他的卷积层具体定义如下: def conv_layer(input, size_in, size_out, name="conv"): with tf.name_scope(name): w = tf.Variable(tf.truncated_normal([5, 5, size_in, size_out], stddev=0.1), name="W") b = tf.Variable(tf.constant(0.1, shape=[si

我正在研究蒲公英鬃毛的张力板代码:

他的卷积层具体定义如下:

def conv_layer(input, size_in, size_out, name="conv"):
  with tf.name_scope(name):
    w = tf.Variable(tf.truncated_normal([5, 5, size_in, size_out], stddev=0.1), name="W")
    b = tf.Variable(tf.constant(0.1, shape=[size_out]), name="B")
    conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding="SAME")
    act = tf.nn.relu(conv + b)
    tf.summary.histogram("weights", w)
    tf.summary.histogram("biases", b)
    tf.summary.histogram("activations", act)
    return tf.nn.max_pool(act, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
我试图找出
conv2d
对输入张量大小的影响。据我所知,前3个维度似乎没有改变,但输出的最后一个维度遵循
w
的最后一个维度的大小

例如,x47x36x64输入变为?x47x36x128,w形=5x5x64x128

我还看到:?x24x18x128变为?x24x18x256,w形=5x5x128x256

那么,是输入的结果大小:
[a,b,c,d]
[a,b,c,w.shape[3]]
的输出大小吗


认为第一个维度没有改变是正确的吗?

这在您的情况下有效,因为使用了步幅和填充。输出宽度和高度并不总是与输入相同

退出主题。基本要点(几乎一字不差地从该链接中提取)是卷积层:

  • 接受大小为W1 x H1 x D1的输入卷
  • 需要四个超参数:
    • 过滤器数量
      K
    • 过滤器的空间范围
      F
    • 过滤器移动的步幅
      S
    • 零填充量
      P
  • 产生大小为W2 x H2 x D2的体积,其中:
    • W2=(W1-F+2*P)/S+1
    • H2=(H1-F+2*P)/S+1
    • D2=K
当您在Tensorflow中处理数据批次时,它们通常具有形状
[批次大小、宽度、高度、深度]
,因此第一个维度(即批次中的样本数)不应更改

注意,上面的填充量
p
对于TF来说有点棘手。当您为
tf.nn.conv2d
提供
padding='same'
参数时,tensorflow会对图像的两侧应用零填充,以确保过滤器不会忽略图像的任何像素,但它可能不会向两侧添加相同数量的填充(我认为只有一个不同)。就这个话题进行了一些很好的讨论


一般来说,如果跨距
S
为1(您的网络有),则
p=(F-1)/2
的零填充将确保输出宽度/高度等于输入,即
W2=W1
H2=H1
。在您的例子中,
F
是5,因此
tf.nn.conv2d
必须为
P
的2的图像的每一侧添加两个零,并且根据上面的公式,您的输出宽度是
W2=(W1-5+2*2)/1+1=W1-1+1=W1
W2=(W1-F+2*P)/S+1
H2=(H1-F+2*P)/S+1
似乎中间的二维值应该期望从
W1
H1
?@paolov发生变化。跨距
S
为1,过滤器大小
F
为5,因此如果填充
P
为2,每边加两个零,我们得到
W2=(W1-5+4)/1+1=W1
。一般来说,对于步幅为1的情况,
P=(F-1)/2
的零填充将确保
W2=W1
。将此添加到答案中,这样人们就不需要在注释中搜索其他信息。