2016-07-21 3 views
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のダウンロードに

  • バグ(少ない)
  • 私のプログラムで間違いがある(可能性が高い)
  • 重複する畳み込みの誤解(ほとんどの場合)

または上記のいずれかの組み合わせ。読んでくれてありがとう!

答えて

3

あなたは書きました:

...これと同じ:

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

あなたは畳み込みは、引数の 1逆転していることを忘れています。したがって、上記は真実ではありません。代わりに、最後の行は次のようになります。たとえば

(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

古典いやはや!瞬間どうもありがとう。 –

関連する問題