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

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

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是否有任何方法直接做到这一点?

回答:

可能这会对你有所帮助。

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

回答:

这里有一个直接的方式来做到这一点使用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)

以上是 在张量流中卷积两个矩阵的最佳方法是什么? 的全部内容, 来源链接: utcz.com/qa/264598.html

回到顶部