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是否有任何方法直接做到這一點?
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)
我認爲OP希望做到這一點在tensorflow。此外,你的輸出似乎沒有關係。 – kmario23
是的,我沒有應用2X2的內核,所以輸出不像預期的那樣。 –