2017-10-30 13 views
1

I 2 차원 차원에 컨볼 루션에 대한 다음과 같은 코드가 있습니다모양 오류

matrix = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) 
kernel = np.array([[1,-1],[1,-1]]) 

kr, kc = kernel.shape 
mr, mc = matrix.shape 

output = np.empty((mc-kc+1, mr-kr+1)) 

for row in range(mc-kc+1): 
    for column in range(mr-kr+1): 
     output[row][column] = (matrix[row:row+kr,column:column+kc]*kernel).sum() 

print(output) 

내가 진짜 컬러 이미지에 이것을 시도하고 싶습니다, 여기에 내가 뭘하려입니다

#matrix is now 3D 
print(matrix.shape) 
Out: (340, 360, 3) 

#kernel is now 3D 
print(kernel.shape) 
Out: (34, 36, 3) 

kr, kc, kdim = kernel.shape 
mr, mc, mdim = matrix.shape 

output = np.empty((mc-kc+1, mr-kr+1, 3)) 

for row in range(mc-kc+1): 
    for column in range(mr-kr+1): 
     for dim in range(3): 
      output[row][column][dim] = (matrix[row:row+kr,column:column+kc]*kernel).sum() 

print(output) 
Out: ValueError: operands could not be broadcast together with shapes (33,36,3) (34,36,3) 

깊이 치수에 문제가 있다고 생각하지만 해결 방법은 아직 없습니다. 도움?

+0

을'출력 = np.empty ((MC-KC, 1 + MR-KR + 1, 3))'는'대신 mcm''의 mc'을 사용하고 있습니다. 3d 행렬에있는'mcm'을 여기에 사용하셨습니까? 또는'mr, mcm, mdim = matrix.shape'을'mr, mc, mdim = matrix.shape'으로 변경하십시오. – gammazero

+0

그건 오타였습니다. 이미 변경했지만 문제가 남아 있습니다. –

+0

매트릭스 순위는 커널 순위보다 커야합니다. 2D 컨볼 루션은 4D 텐서 (일괄 처리의 경우 1 차원)로 작동하고 3D 컨볼 루션은 5D 텐서로 작동합니다. – Maxim

답변

0

행과 열을 output 선언으로 바꾸고 행과 열의 루프를 바꿨습니다. 이 버전보십시오 : 라인에서

# note: [rows, columns, channel] 
output = np.empty((mr - kr + 1, mc - kc + 1, 3)) 

# note: `row` loops over matrix rows, `column` - over columns 
for row in range(mr - kr + 1): 
    for column in range(mc - kc + 1): 
    for dim in range(3): 
     output[row][column][dim] = (matrix[row:row + kr, column:column + kc] * kernel).sum() 

print(output)