0

假设在张量流中卷积两个矩阵的最佳方法是什么?

A = [[1,2,3],[4,5,6],[7,8,9]] 
    B = [[1,2,1],[2,1,1],[1,1,2]] 

与kernel_size卷积后= 2 * 2和跨度= 1,输出应该是

[[18,18],[28,37]] 

我们需要A的每个2×2部分 到之间施加卷积运算B的每个2 * 2部分。 如何使用tensorflow有效执行此操作? tensorflow是否有任何方法直接做到这一点?

回答

0

可能这会对你有所帮助。

import numpy as np 
from scipy.signal import convolve2d 

def conv2(x, y, mode='same'): 
    return np.rot90(convolve2d(np.rot90(x, 2), np.rot90(y, 2), mode=mode), 2) 


A = [[1,2,3],[4,5,6],[7,8,9]] 
B = [[1,1,1],[1,1,1],[1,1,1]] 

print(conv2(A,B)) 

输出将被

[[12 21 16] 
[27 45 33] 
[24 39 28]] 
+0

我认为OP希望做到这一点在tensorflow。此外,你的输出似乎没有关系。 – kmario23

+0

是的,我没有应用2X2的内核,所以输出不像预期的那样。 –

2

这里有一个直接的方式来做到这一点使用tf.nn.conv2D

In [1055]: A = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
     ...: B = np.array([[1,1,1],[1,1,1],[1,1,1]]) 
     ...: 

# define input tensor 
In [1056]: tfA = tf.constant(A, dtype=tf.float32) 

# reshape it to 4D tensor (as needed by tf.nn.conv2d) 
In [1057]: tfA = tfA[tf.newaxis, :, :, tf.newaxis] 

# define kernel tensor 
In [1058]: tfK = tf.constant(B, dtype=tf.float32) 

# again reshape it to 4D tensor (also, we use 2x2 convolution) 
In [1059]: tfK = tfK[:-1, :-1, tf.newaxis, tf.newaxis] 

# convolving the input tensor with kernel 
In [1060]: convolved = tf.nn.conv2d(tfA, tfK, strides=[1, 1, 1, 1], padding="VALID") 

In [1061]: convolved.eval() 
Out[1061]: 
array([[[[ 12.], 
     [ 16.]], 

     [[ 24.], 
     [ 28.]]]], dtype=float32) 

我用了一个交互式会话评估这些张量,但是这应该很好地工作即使您定义了计算图并稍后使用显式会话来运行它也没关系。

编辑

此外,为了澄清,这种方法适用于任何(2x2)内核张B工作。考虑下面的例子,内核张量中的条目增加了一倍。正如预期的那样,与上面例子中得出的结果相比,最终结果也会增加一倍。

又如:

In [110]: A = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
In [111]: B = np.array([[2,2,2],[2,2,2],[2,2,2]]) 

In [112]: tfA = tf.constant(A, dtype=tf.float32) 
In [113]: tfA = tfA[tf.newaxis, :, :, tf.newaxis] 

In [114]: tfK = tf.constant(B, dtype=tf.float32) 
In [115]: tfK = tfK[:-1, :-1, tf.newaxis, tf.newaxis] 

In [116]: convolved = tf.nn.conv2d(tfA, tfK, strides=[1, 1, 1, 1], padding="VALID") 

In [117]: convolved.eval() 
Out[117]: 
array([[[[ 24.], 
     [ 32.]], 

     [[ 48.], 
     [ 56.]]]], dtype=float32) 
+0

B可以是任何东西,不一定是全部的。对于任何B都可以做这个工作吗? – phkr

+0

是的,它足以通用于任何内核张量“B”。 – kmario23

+0

@phkr增加了另一个澄清的例子。另外,我鼓励你用不同的内核和输入张量来检查它:) – kmario23

相关问题