我正在研究蒲公英Mane的张量代码: 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]
的输出大小?
认为第一个维度不会改变是否正确?
是否有基于内核和步幅大小编写输入和输出大小的一般方法?
答案 0 :(得分:1)
具体线索在 strides 参数中:这决定了内核在每次迭代时将移位多少个单元格。由于这两个匹配,你的"结果大小"计算是正确的。对于每个维度,公式为
ceil( n/stride )
简而言之,分而归。您给定的步幅矢量为(1,2,2,1),因此 a 和 d 的分母为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
我希望在最后一行中我的边界条件正确...