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의 버그가- 을
- 내 프로그램의 실수 (더 있음)
- 중첩되는 회선에 대한 오해 (대부분)
또는 위의 임의의 조합. 읽어 주셔서 감사합니다!
고전 도현! 순간. 고마워. –