2017-11-23 3 views
2

Conv NetworksのMaxPooling層にfpropを実装しようとしていますが、重複していない領域と2x2をプールしています。これを行うには、入力行列を2x2の行列に分割して最大値を抽出する必要があります。私は後でbpropで使用できるマスクを作成しています。分割を実行するには、入力行列を最初に垂直方向に分割してから水平方向に分割し、次にvsplit,hsplitおよびamaxをそれぞれ使用して最大値を見つけます。ただし、インデックス外の例外を使用してクラッシュすることはありますが、エラーの原因はわかりません。 24×24の入力行列を144の2×2行列に分割する簡単な方法がありますので、最大値を得ることができます。行列を正方形の2x2サブ行列に分割する - maxpooling fprop

私はそうするには、以下のやっている:これは、リシェイプによって生成された出力である

for i in range(inputs.shape[0]): 
     for j in range(inputs.shape[1]): 
      for k in range(inputs.shape[2] // 2): 
       for h in range(inputs.shape[3] // 2): 

        outputs[i,j,k,h] = np.amax(np.hsplit(np.vsplit(inputs[i,j], inputs.shape[2] // 2)[k], inputs.shape[1] // 2)[h]) 

        max_ind = np.argmax(np.hsplit(np.vsplit(inputs[i,j], inputs.shape[2] // 2)[k], inputs.shape[1] // 2)[h]) 

        max_ind_y = max_ind // inputs.shape[2] 

        if (max_ind_y == 0): 
         max_ind_x = max_ind 
        else: 
         max_ind_x = max_ind % inputs.shape[3] 

        self.mask[i,j,max_ind_y + 2 * k, max_ind_x + 2 * h] = outputs[i,j,k,h] 

EDITを

enter image description here

私が代わりに希望は何されて

[0 1 
4 5] 

[2 3 
6 7] 

のように...

+0

サンプルケースを追加し、期待される出力を表示しますか? – Divakar

+0

@Divakarは編集の例を追加 – Alk

+0

しかし、最終的に期待される出力は何ですか?これはブロックの作成に役立ちます - https://stackoverflow.com/questions/16856788/slice-2d-array-into-smaller-2d-arrays – Divakar

答えて

1

ステップ#1:私たちは、ブロックごとの最大要素の列インデックス、行を取得する必要がありmax_ind_xmax_ind_y

を取得 -

m,n = inputs.shape 
a = inputs.reshape(m//2,2,n//2,2).swapaxes(1,2) 
row, col = np.unravel_index(a.reshape(a.shape[:-2] + (4,)).argmax(-1), (2,2)) 

ステップ2:入力からargmaxの場所で出力配列を設定する

次に、looあなたのコードでは、入力配列からの値で設定されたそれらのargmax場所で出力配列を作成しようとしているようです。そこで、私たちは何ができる -

out = np.zeros_like(a) 
M,N = a.shape[:2] 
indx_tuple = np.arange(M)[:,None],np.arange(N), row, col 
out[indx_tuple] = a[indx_tuple] 

最後に、我々は出力のために戻って2D形状を得ることができ、これは、元の入力に対して良好な検証ステップinputsだろう -

out2d = out.reshape(a.shape[:2]+(2,2)).swapaxes(1,2).reshape(m,n) 

サンプル入力、出力 -

In [291]: np.random.seed(0) 
    ...: inputs = np.random.randint(11,99,(6,4)) 

In [292]: inputs 
Out[292]: 
array([[55, 58, 75, 78], 
     [78, 20, 94, 32], 
     [47, 98, 81, 23], 
     [69, 76, 50, 98], 
     [57, 92, 48, 36], 
     [88, 83, 20, 31]]) 

In [286]: out2d 
Out[286]: 
array([[ 0, 0, 0, 0], 
     [78, 0, 94, 0], 
     [ 0, 98, 0, 0], 
     [ 0, 0, 0, 98], 
     [ 0, 92, 48, 0], 
     [ 0, 0, 0, 0]]) 
1

これはskimage.utilview_as_blocksとして実装されています

blocks = skimage.util.view_as_blocks(a,(2,2)) 
maxs = blocks.max((2,3)) 
関連する問題