2017-11-09 5 views
0

2次元畳み込みのための小さなカスタムケラスモデルにカスタムウェイトを設定する際に助けが必要です。ケラスモデルのウェイト設定

X = [[[3, 2, -4], 
     [0, 5, 4], 
     [2, -1, -7], 
     [-7, 0, 1]], 
    [[-8, 9, 1], 
     [-3, 6, 0], 
     [0, -4, 2], 
     [5, 1, 1]]] 

このように、2つのチャンネルだけの4x3画像を考えることができます。私のカーネルは次のようになります。

kernel = [[[2, 1], 
      [0, -1], 
      [0, -1]], 
      [[1, 2], 
      [2, -1], 
      [2, -2]]] 

したがって、2次元の3x2カーネルです。 1のストライドなしパディング、と手で2次元畳み込みを行う利回り:残念ながら

[[10, 14], 
[27, 16]] 

、次Kerasコード:

model = Sequential() 
conv2d = Conv2D(filters=1, kernel_size=(3,2), strides=1, input_shape=(2,4,3), use_bias=False) 
model.add(conv2d) 
layer = model.layers[0] 
layer.set_weights([np.array(kernel).reshape(3, 2, 2, 1)]) 
print(model.predict(np.array(X).reshape((1,) + np.shape(X)))) 

出力:

[[19, -6], 
[-39, 16]] 

私はできませんでしたKerasが畳み込みのためにカーネルをどのように整理するかを理解する。これまでのところ、直観に反して見えますが、おそらく何かが欠けています。

私はTensorflow 1.4.0でKeras 2.0.9をバックエンドとして使用しています。

答えて

3

ケラのカーネルは、(height, width, input_channels, output_channels)の形をしています。channels_firstを使用している場合でも。

あなたは正しい、それが形(3,2,2,1)

を使用しています。しかし、あなたの手計算は反転形状を検討している思考にしています。手動計算では(input_channels, height, width)を使用しています。

reshapeカーネルでは、これらのディメンションを正しく並べ替えていません。再整形することは、配列を "転置"することと同じではありません。 Reshapeは、並べ替えを行わずにデータを単純に再グループ化します。

kerasで正しい結果を得るために、あなたが適切に軸を交換する必要があります。

#start as (input_channels, height, width) = (2,3,2)  
kernel = np.array([[[2, 1], 
     [0, -1], 
     [0, -1]], 
     [[1, 2], 
     [2, -1], 
     [2, -2]]]) 

#change to (height, input_channels, width) = (3,2,2) 
kernel = kernel.swapaxes(0,1) 

#change to (height, width, input_channels) = (3,2,2) 
kernel = kernel.swapaxes(1,2) 

#add output_channels 
kernel = kernel.reshape((3,2,2,1)) 
関連する問題