0
我想討論一下卷積應用於CNN和圖像過濾......如果您有一個RGB圖像(尺寸爲3xIxI
)和K
過濾器,每個尺寸爲3xFxF
,那麼假設你的步幅是1
,並且你只考慮完全重疊的區域(沒有填充),那麼你最終會得到一個Kx(I - F + 1)x(I - F + 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
我剛分離每個信道和將它們獨立捲入。請仔細看看,如果我錯了,請糾正我。
現在,假設這是有道理的,我已經在python中進行了以下實驗。
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
這給了我以下結果:
(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.]]]
我只是想知道這是否是由於:
- 在SciPy的(不太可能)的bug
- 我的程序出錯(更可能)
- 我誤解重疊卷積(很有可能)
或上述的任意組合。謝謝閱讀!
經典衛生署!時刻。非常感謝。 –