二维数组的张量流卷积



我有一些数据,其中有一个 2D 数组A和一个内核K。我想计算这些的卷积。如何在TensorFlow中执行此操作。看起来内置卷积操作将 4D 张量作为输入,因为它们假设我们正在计算具有多个颜色通道的批处理。如何将这些操作与我的数据一起使用?

例:

a = np.random.randint(2, size=(10,10))
k = [[1,1,1],[1,1,1],[1,1,1]]
# Compute convolution of these??
c = ...
import tensorflow as tf
import numpy as np
a = np.random.randint(2, size=(10,10))
k = [[1,1,1],[1,1,1],[1,1,1]]
tensor_a = tf.constant(a, tf.float32)
tensor_k = tf.constant(k, tf.float32)
tensor_res = tf.nn.convolution(tf.reshape(tensor_a, [1, 10, 10, 1]), tf.reshape(tensor_k, [3, 3, 1, 1]), padding='VALID')
sess = tf.Session()
print(sess.run(tensor_res))

计算图教程在这里

卷积帮助程序文档

到目前为止发布的答案都忽略了一个重要的点:Tensorflow 不计算卷积,而是计算文档中所述的互相关:

请注意,尽管这些操作称为"卷积",但它们是 严格来说,"互相关",因为过滤器是组合的 带有输入窗口而不反转过滤器。

如果你真的想计算卷积,你必须在将内核传递到conv2d之前反转内核,即在水平轴上翻转一次,然后在垂直轴上翻转一次。使用Miriam的答案,这可能看起来像这样:

import tensorflow as tf
import numpy as np
a = np.random.randint(2, size=(10,10))
k = np.array([[1,1,1],[1,1,1],[1,1,1]],dtype=np.float32)
flip = [slice(None, None, -1), slice(None, None, -1)]
k = k[flip]
a=a.astype(np.float32)
a_tensor = tf.reshape(a, [1, 10, 10, 1])
k_weight = tf.reshape(np.array(k), [3,3,1,1])
c=tf.nn.conv2d(a_tensor, k_weight,padding='VALID',strides=[1, 1, 1, 1])
sess=tf.Session()
c.eval(session=sess)

请注意,在这个特定示例中,翻转内核在技术上是徒劳的,因为对于对称核来说,卷积和互相关是一回事。但是,一旦你有一个非对称内核,如果你想让 Tensorflow 实际计算卷积,你必须翻转它。

除了考夫马努的答案之外,如果您需要 2D 结果,您还可以使用tf.squeeze。 即

c=tf.squeeze(tf.nn.conv2d(a_tensor, k_weight,padding='VALID',strides=[1, 1, 1, 1]))

以执行卷积。

最新更新