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

相關問題