2017-04-09 13 views
2

私はと層が定義されていConv2D:これは私のネットワークの最初の層である
kerasでConv2Dからレイヤーウェイトを正しく取得する方法は?

Conv2D(96, kernel_size=(5, 5), 
      activation='relu', 
      input_shape=(image_rows, image_cols, 1), 
      kernel_initializer=initializers.glorot_normal(seed), 
      bias_initializer=initializers.glorot_uniform(seed), 
      padding='same', 
      name='conv_1') 


入力サイズは64×160、画像は1チャンネルです。
私はこの畳み込みレイヤーからウェイトを視覚化しようとしていますが、それを取得する方法はわかりません。

1.Call

layer.get_weights()[0] 

をこの形状(5、5、1、96)の配列をreturs:ここ
は、私は今、これをやっている方法です。 1は画像が1チャンネルであるためです。

layer.get_weights()[0][:,:,:,j][:,:,0] 

非常に醜いが、私はこれを簡素化するかどうかはわからない5つのフィルタによる

2.Take 5は、任意のコメントは非常に高く評価されています。

これらの5×5の正方形ではわかりません。彼らは実際にフィルターですか?
もし誰かが正しくモデルからフィルタを取得する方法を教えてくださいできませんでしたか?

答えて

4

私は最初の25のように重みを表示しようとしました。私はあなたがこれと同じ質問をしているのと同じ質問があります。ディープ・ビリーフ・ネットワークやスタックされたRBMから派生したものと同じフィルタではないようです。ここで

は、訓練を受けていない可視化の重みである:untrained weights

、ここでは、訓練された重みである:

trained weights

不思議なトレーニングの後に変更がありません!あなたがそれらを比較すると、それらは同じです。

、その後DBN RBMは、下部にトップと層2の上にレイヤ1をフィルタリング: DBM RBM filters

私はkernel_intialization =「もの」を設定した場合、私はよく見るが、当期純損失は、多くはかかわらず減少したことがないフィルタを取得試行錯誤の変更:

ここでは、2Dコンバートの重み/フィルタを表示するコードを示します。

ann = Sequential() 
    x = Conv2D(filters=64,kernel_size=(5,5),input_shape=(32,32,3)) 
    ann.add(x) 
    ann.add(Activation("relu")) 

...

x1w = x.get_weights()[0][:,:,0,:] 
    for i in range(1,26): 
     plt.subplot(5,5,i) 
     plt.imshow(x1w[:,:,i],interpolation="nearest",cmap="gray") 
    plt.show() 

    ann.fit(Xtrain, ytrain_indicator, epochs=5, batch_size=32) 

    x1w = x.get_weights()[0][:,:,0,:] 
    for i in range(1,26): 
     plt.subplot(5,5,i) 
     plt.imshow(x1w[:,:,i],interpolation="nearest",cmap="gray") 
    plt.show() 

--------------------------- UPDATE ----- -------------------

私は1e-6の代わりに0.01の学習率でもう一度試して、0と1の間で正規化された画像を使用しました。画像を255.0で除算することにより、今畳み込みフィルタが変更され、最初の畳み込みフィルタの出力はそうのようになります。 Untrained Weights

あなたが気づく訓練されたフィルタは、合理的な学習率を(あまりないことで)変更されます。ここではTrained Convolution Filter

私は最後の畳み込みレーを取る場合 Convolution Layer Output

そして:Image 7 CIFAR-10 Car

そしてここでは、最初のコンボリューション層の出力です:CIFAR-10テストセットの画像7がありますr(緻密なレイヤーを挟んでいない)とそれを訓練されていないクラシファイアに送ることは、生の画像を精度の点で分類するのと似ていますが、畳み込みレイヤーを訓練すると、最後の畳み込みレイヤーの出力が、

だから、畳み込みレイヤーは確かに重みと同様にフィルターであると結論づけます。

+0

ありがとうございました!これは本当に奇妙なことです。ランダムな初期化の場合、重みは似ています。私はconvレイヤーに推奨されるglorot初期化を使用しています。私にとって最も混乱する質問は、ネットワークをトレーニングしていますが、同じウェイトを経験していることです。何を訓練しましたか?これについての答えはありません... –

+0

重みの3次元は何ですか? 'x1w = x.get_weights()[0] [:、:、0、:]'では、 '[:、:、0、:]'の中の0です。最初の2つのディムはカーネルxとyで、最後はカーネルの数ですが、3次元が何であるかはわかりません。それは前のレイヤーの出力の次元と思われますが、なぜか、それが本当に意味するものは理解できません。 – wordsforthewise

+0

0は赤のチャネルです。三次元は赤緑と青です。第1はxであり、第2はyであり、第3はチャネルであり、最後はn番目の畳み込み層である。 – John

関連する問題