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のダウンロードに
- バグ(少ない)
- 私のプログラムで間違いがある(可能性が高い)
- 重複する畳み込みの誤解(ほとんどの場合)
または上記のいずれかの組み合わせ。読んでくれてありがとう!
古典いやはや!瞬間どうもありがとう。 –