python - tensorflow conv2d偶数步长和奇数步长之间的不同起始索引

标签 python machine-learning tensorflow deep-learning convolution

据我了解tf.nn.conv2d doc对于相同的卷积(无论步幅如何)第一个点积应以 (0,0) 为中心 正如您在下面看到的,当步幅为奇数时,第一个点积似乎以 (1,1) 为中心: 在这个玩具示例中

input shape is [5,5,1]

filer shape is [3,3,1,1]

res = tf.nn.conv2d(X, F, strides=[1,x,x,1], padding='SAME')

跨步 1 结果:

array([[ 1.49573362,  2.65084887,  2.96818447,  3.04787111,  1.89275599],
   [ 3.1941781 ,  4.47312069,  4.10260868,  4.13415051,  2.85520792],
   [ 2.65490007,  3.41439581,  2.93415952,  3.65811515,  2.89861989],
   [ 2.22547054,  2.98453856,  2.89428496,  3.29111433,  2.53204632],
   [ 0.52702606,  1.16226625,  1.75986075,  2.20483446,  1.56959426]], dtype=float32)

步幅 2 结果:

array([[ 1.49573362,  2.96818447,  1.89275599],
   [ 2.65490007,  2.93415952,  2.89861989],
   [ 0.52702606,  1.75986075,  1.56959426]], dtype=float32)

步幅 3 结果:

array([[ 4.47312069,  2.85520792],
   [ 1.16226625,  1.56959426]], dtype=float32)

这是一个错误还是我遗漏了什么?

最佳答案

发生的情况是,如果额外的零列(来自填充)的数量是奇数,则 tensorflow 将在末尾添加列。

在 stride = 1 的示例中,它需要添加两列,因此它在开头添加一列,在末尾添加一列(意味着每侧的开始、结束:左、右、上、下)。 Stride = 2 也会做同样的事情。

但是,对于 stride = 3,它只需要添加一列,并在末尾(右侧和底部)执行此操作。如果需要添加 5 列,它将在开头(左、上)添加 2 列,在末尾(右、下)添加 3 列

关于python - tensorflow conv2d偶数步长和奇数步长之间的不同起始索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44853243/

相关文章:

python - Tensorflow 形状不匹配

tensorflow - Keras SavedModel 与 Tensorflow SavedModel

python - 修改 __main__ 模块的属性访问(名称解析的详细信息)

python - Python 中的另一个 unicode 困惑

python - PyQt 4 - 将窗口中的所有数据保存到应用程序关闭时的文件

gradient-descent - TensorFlow的ReluGrad声称输入不是有限的

python - Keras NASNet 训练

python - 基于字典高效替换数组中的元素 - NumPy/Python

artificial-intelligence - 从纯文本描述调用函数

machine-learning - 一个标签上的 Vowpal Wabbit 矩阵分解