我有一些数据,我有一个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 = ...
答案 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]))
执行卷积。