【问题标题】:what is the effect of `tf.nn.max_pool(input_tensor, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")` on an input tensor shape?`tf.nn.max_pool(input_tensor, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")`对输入张量形状有什么影响?
【发布时间】:2017-09-07 21:59:55
【问题描述】:

我正在专门研究蒲公英鬃毛的张量板代码: 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")

我正在尝试计算 maxpool 对输入张量大小的影响。据我所知,它似乎将中间两个维度大小减半,有时那里有一个+1。也许当尺寸是奇数时。

例如,?x188x141x32 输入变为?x94x71x32

我还看到:?x47x36x128 变成 ?x24x18x128

那么,输入的结果大小是:[a,b,c,d][a,(b+1)//2,(c+1)//2,d] 的输出大小吗?

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

有没有一种通用的方法可以根据内核和步幅大小来编写输入和输出大小?

【问题讨论】:

    标签: python tensorflow deep-learning tensorboard


    【解决方案1】:

    具体的线索在 strides 参数中:这决定了内核在每次迭代中将移动多少个单元。由于两者匹配,因此您的“结果大小”计算是正确的。对于每个维度,公式为

    ceil( n/stride )
    

    简而言之,除以四舍五入。您给定的步幅向量为 (1, 2, 2, 1),因此 ad 的分母为 1。对于中间维度,(n+1)//2 等价于ceil 函数。

    如果内核与步幅不匹配,您需要调整n/stride 以允许大小差异。实际数字是在内核的另一侧到达层的另一侧之前您可以在该方向上采取的步数。

    k = kernel size in that dimension
    n = layer  size in that dimension
    new_size = 1 + (n-k) // stride
    

    我希望我在最后一行中的边界条件是正确的......

    【讨论】:

    • 谢谢。不过,根据上述说明,该 new_size 公式似乎在这种情况下给出了结果 1?
    • 不:例如,在您的第一个示例中,维度 2 (b),层大小为 188;内核大小为 2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2016-05-20
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多