`tf.nn.max_pool(input_tensor, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME") 的效果是什么` 在输入张量形状上?

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?

我正在专门研究 Dandelion Mane 的 tensorboard 代码: 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")

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

例如,?x188x141x32 输入变成?x94x71x32

而且我还看到:?x47x36x128 变成了?x24x18x128

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

第一个维度不变的想法对吗?

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

具体线索在 strides 参数中:这决定了内核在每次迭代中将移动多少个单元格。由于两者匹配,您的 "resultant size" 计算就目前而言是正确的。对于每个维度,公式为

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

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