一些填充步幅 1

填充只是一个奇特的名称:用一些常量围绕输入矩阵。在大多数情况下,常量为零,这就是人们称之为零填充的原因。因此,如果你想在我们的原始输入中使用 1 的填充(使用 padding=0, strides=1 检查第一个示例),矩阵将如下所示:

StackOverflow 文档

要计算卷积的值,请执行相同的滑动。请注意,在我们的情况下,中间的许多值不需要重新计算(它们将与前面的示例相同。我也不会在此显示所有计算,因为这个想法很简单。结果是:

StackOverflow 文档

哪里

  • 5 = 0 * 1 + 0 * 0 + 0 * 1 + 0 * 2 + 4 * 1 + 3 * 0 + 0 * 0 + 0 * 1 + 1 * 1
  • 6 = 4 * 1 + 1 * 0 + 0 * 1 + 0 * 2 + 2 * 1 + 0 * 0 + 0 * 0 + 0 * 0 + 0 * 1

TF 不支持 conv2d 函数中的任意填充,因此如果需要一些不支持的填充,请使用 tf.pad() 。幸运的是,对于我们的输入,填充 SAME 将等于 padding = 1.因此我们需要在前面的示例中几乎不做任何改变:

res = tf.squeeze(tf.nn.conv2d(image, kernel, [1, 1, 1, 1], "SAME"))
# 'SAME' makes sure that our output has the same size as input and 
# uses appropriate padding. In our case it is 1.
with tf.Session() as sess:
   print sess.run(res)

你可以验证答案是否与手动计算的答案相同。