【问题标题】:what is the effect of tf.nn.conv2d() on an input tensor shape?tf.nn.conv2d() 对输入张量形状有什么影响?
【发布时间】:2017-09-07 22:14:58
【问题描述】:

我正在专门研究蒲公英鬃毛的张量板代码:https://github.com/dandelionmane/tf-dev-summit-tensorboard-tutorial/blob/master/mnist.py

他的卷积层具体定义为:

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 shape=5x5x64x128

我还看到: ?x24x18x128 变成 ?x24x18x256 w shape=5x5x128x256

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

认为第一维不变是正确的吗?

【问题讨论】:

    标签: python tensorflow deep-learning tensorboard


    【解决方案1】:

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

    查看主题的this excellent discussion。基本的外卖(几乎逐字从该链接中获取)是一个卷积层:

    • 接受大小为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 中处理批量数据时,它们的形状通常为 [batch_size, width, height, depth],因此第一个维度(即批次中的样本数量)不应改变。

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

    一般而言,步幅S 为 1(您的网络具有),P = (F - 1) / 2 的零填充将确保输出宽度/高度等于输入,即 W2 = W1H2 = 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 + 1H2 = (H1 - F + 2*P)/S + 1 似乎中间的两个维度值应该期望从 W1H1 发生变化?
    • @paolov 不一定。步幅S 是1,过滤器大小F 是5,所以如果填充P 是2,每边添加两个零,我们就有W2 = (W1 - 5 + 4)/1 + 1 = W1。一般来说,对于 1 的步幅,P = (F-1)/2 的零填充将确保 W2 = W1
    • 将此添加到答案中,因此人们无需搜索 cmets 以获取其他信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2021-02-16
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    相关资源
    最近更新 更多