0

가정하자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 출력은 우리가 모든 2 × 2 부 행 사이의 컨볼 루션 연산을 적용 할 필요

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

되어야 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)) 

출력은 다음 tf.nn.conv2D을 사용하여 수행하는 한 직접적인 방법

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

내가 영업 이익은 tensorflow에 그것을 할 것으로 기대하고 생각합니다. 또한 출력이 거의없는 것처럼 보입니다. – kmario23

+0

예, 2X2의 커널을 적용하지 않았으므로 예상대로 출력되지 않았습니다. –

2

될 것입니다 :

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