2016-07-21 3 views
0

CNN 및 이미지 필터링에 적용된 회선에 대해 조금 논의하고 싶습니다. RGB 이미지 (치수가 3xIxI) 및 K 필터의 크기가 각각 3xFxF 인 경우 출력을 얻고, 보폭이 1이고 완전 중복 영역 만 고려해야합니다 (패딩 없음).scipy.signal의 convolve가 그럴 필요가 없습니다.

컨볼 루션에서 읽은 모든 자료에서 기본적으로 이미지 위에 각 필터를 슬라이딩하고 각 단계에서 다수의 내적을 계산 한 다음이를 합하여 단일 값을 얻습니다. 예를 들어

:

I -> 3x5x5 matrix 
F -> 3x2x2 matrix 
I * F -> 1x4x4 matrix 

(회선 작업은 * 가정합니다.)

을 지금, 당신의 커널과 이미지 모두 같은 수의 채널이 있기 때문에, 당신은 분리 끝날거야 당신의 3D는 여러 병렬 2D 컨벌루션으로 컨볼 루션되고 매트릭스 합계가 뒤 따른다.

I -> 3x5x5 matrix 
F -> 3x2x2 matrix 
(I[0] * F[0]) + (I[1] * F[1]) + (I[2] * F[2]) -> 1x4x4 matrix 

I 단지 각각의 채널을 분리하고 있는데 :

는 는

그러므로, 상기 예는 모든 의도와 목적은 (패딩이없는 가정 우리 만 완전히 겹치는 영역을 고려하고있다)이 동일해야 독립적으로 그들을 convolving. 제발, 이걸 신중히보고 제가 잘못하면 저를 바로 잡으십시오.

이제는 이것이 합리적이라는 전제하에, 저는 파이썬에서 다음과 같은 실험을 수행했습니다.

(1, 4, 4) 
[[[ 268. 229. 297. 305.] 
    [ 256. 292. 322. 190.] 
    [ 173. 240. 283. 243.] 
    [ 291. 271. 302. 346.]]] 
(1, 4, 4) 
[[[ 247. 229. 291. 263.] 
    [ 198. 297. 342. 233.] 
    [ 208. 268. 268. 185.] 
    [ 276. 272. 280. 372.]]] 

난 그냥이 때문인지 알고 싶습니다 :

import scipy.signal 
import numpy as np 
import test 

x = np.random.randint(0, 10, (3, 5, 5)).astype(np.float32) 
w = np.random.randint(0, 10, (3, 2, 2)).astype(np.float32) 

r1 = np.sum([scipy.signal.convolve(x[i], w[i], 'valid') for i in range(3)], axis=0).reshape(1, 4, 4) 

r2 = scipy.signal.convolve(x, w, 'valid') 

print r1.shape 
print r1 

print r2.shape 
print r2 

나에게 다음과 같은 결과 제공 (덜) scipy의 버그가

  • 내 프로그램의 실수 (더 있음)
  • 중첩되는 회선에 대한 오해 (대부분)

또는 위의 임의의 조합. 읽어 주셔서 감사합니다!

답변

3

당신이 쓴 :

...이 같은 :

I -> 3x5x5 matrix 
F -> 3x2x2 matrix 
(I[0] * F[0]) + (I[1] * F[1]) + (I[2] * F[2]) -> 1x4x4 matrix 

당신은 회선 이 인수 한 반전 것을 잊어 버렸습니다. 따라서 위의 내용은 사실이 아닙니다. 대신, 마지막 행은 다음과 같습니다 예를 들어

(I[0] * F[2]) + (I[1] * F[1]) + (I[2] * F[0]) -> 1x4x4 matrix 

,

In [28]: r1 = np.sum([scipy.signal.convolve(x[i], w[2-i], 'valid') for i in range(3)], axis=0).reshape(1, 4, 4) 

In [29]: r2 = scipy.signal.convolve(x, w, 'valid') 

In [30]: r1 
Out[30]: 
array([[[ 169., 223., 277., 199.], 
     [ 226., 213., 206., 247.], 
     [ 192., 252., 332., 369.], 
     [ 167., 266., 321., 323.]]], dtype=float32) 

In [31]: r2 
Out[31]: 
array([[[ 169., 223., 277., 199.], 
     [ 226., 213., 206., 247.], 
     [ 192., 252., 332., 369.], 
     [ 167., 266., 321., 323.]]], dtype=float32) 
+0

고전 도현! 순간. 고마워. –