TensorFlow 2D阵列的卷积

时间:2017-03-12 02:55:58

标签: tensorflow

我有一些数据,我有一个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 = ...

3 个答案:

答案 0 :(得分:1)

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))

计算图教程是here

卷积助手doc

答案 1 :(得分:1)

到目前为止发布的答案都错过了一个重点:Tensorflow 计算卷积,但是doc中所述的互相关:

  

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

如果你真的想要计算卷积,你必须在将内核传递到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实际计算卷积,则必须将其翻转。

答案 2 :(得分:0)

除了kaufmanu的答案外,如果需要2D结果,还可以使用tf.squeeze。即

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

执行卷积。