如何让tensorflow在具有1x2内核的2x2矩阵上进行卷积?

如何让tensorflow在具有1x2内核的2x2矩阵上进行卷积?,tensorflow,convolution,Tensorflow,Convolution,我有以下矩阵: 以及以下内核: 如果我在没有填充的情况下进行卷积并滑动1行,我应该得到以下答案: 因为: 基于tf.nn.conv2d的文档,我认为这段代码表达了我刚才描述的内容: import tensorflow as tf input_batch = tf.constant([ [ [[.0], [1.0]], [[2.], [3.]] ] ]) kernel = tf.constant([ [ [[1.

我有以下矩阵:

以及以下内核:

如果我在没有填充的情况下进行卷积并滑动1行,我应该得到以下答案:

因为:

基于
tf.nn.conv2d
的文档,我认为这段代码表达了我刚才描述的内容:

import tensorflow as tf

input_batch = tf.constant([
    [
        [[.0], [1.0]],
        [[2.], [3.]]
    ]
])

kernel = tf.constant([
    [
        [[1.0, 2.0]]
    ]
])

conv2d = tf.nn.conv2d(input_batch, kernel, strides=[1, 1, 1, 1], padding='VALID')
sess = tf.Session()

print(sess.run(conv2d))
但它产生了这样的输出:

[[[[ 0.  0.]
   [ 1.  2.]]

  [[ 2.  4.]
   [ 3.  6.]]]]

我不知道这是怎么计算出来的。我尝试过为“步幅填充”参数尝试不同的值,但仍然无法产生我预期的结果。

您没有正确阅读链接教程中的说明。在直接修改
无填充后,Stripes=1
您将得到以下代码

import tensorflow as tf
k = tf.constant([
    [1, 2],
], dtype=tf.float32, name='k')
i = tf.constant([
    [0, 1],
    [2, 3],
], dtype=tf.float32, name='i')
kernel = tf.reshape(k, [1, 2, 1, 1], name='kernel')
image  = tf.reshape(i, [1, 2, 2, 1], name='image')

res = tf.squeeze(tf.nn.conv2d(image, kernel, [1, 1, 1, 1], "VALID"))
# VALID means no padding
with tf.Session() as sess:
   print sess.run(res)
这将为您提供预期的结果:
[2,8.]
。这里我得到了一个向量,而不是列,因为挤压算子



我在代码中看到的一个问题(可能还有其他问题)是,您的内核的形状是
(1,1,1,2)
,但假设它是
(1,2,1,1)

您没有正确阅读您链接的教程中我的解释。在直接修改
无填充后,Stripes=1
您将得到以下代码

import tensorflow as tf
k = tf.constant([
    [1, 2],
], dtype=tf.float32, name='k')
i = tf.constant([
    [0, 1],
    [2, 3],
], dtype=tf.float32, name='i')
kernel = tf.reshape(k, [1, 2, 1, 1], name='kernel')
image  = tf.reshape(i, [1, 2, 2, 1], name='image')

res = tf.squeeze(tf.nn.conv2d(image, kernel, [1, 1, 1, 1], "VALID"))
# VALID means no padding
with tf.Session() as sess:
   print sess.run(res)
这将为您提供预期的结果:
[2,8.]
。这里我得到了一个向量,而不是列,因为挤压算子


我在代码中看到的一个问题(可能还有其他问题)是,内核的形状是
(1,1,1,2)
,但它应该是
(1,2,1,1)