2017-03-12 55 views
2

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

例子:

a = np.random.randint(2, size=(10,10)) 
k = [[1,1,1],[1,1,1],[1,1,1]] 
# Compute convolution of these?? 
c = ... 

回答

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

答案为止发布的所有错过了一个重要的观点:Tensorflow不计算一个卷积,但互相关正如在中所述doc

注意的是,虽然这些老年退休金计划被称为“回旋”,他们是 严格说来“互相关”由于过滤器无需反转滤波器结合 与输入窗口。

如果真要计算的卷积,你将有传递到conv2d之前扭转内核,即一旦上了水平翻转,然后在垂直轴上。用仪的回答,这可能是这样的:

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实际计算卷积,就必须翻转它。