2017-01-22 13 views
5

私はいくつかの実験を行うためにKerasを使用していると私は単純なMLPモデルの重み更新を監視し:最初の緻密層については`layer.get_weights()`は何を返しますか?

# model contains one input layer in the format of dense, 
# one hidden layer and one output layer. 
model=mlp() 
weight_origin=model.layers[0].get_weights()[0] 
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
model.fit(.....) # with adam optimizer 
weight_updated=model.layers[0].get_weights()[0] 
print weight_origin-weight_updated 

、私はゼロの行列を得ました。私はトレーニングがこの体重を変えないと思った。ただし、他のレイヤーのウェイトは変更されます。だから私は混乱しています、なぜ最初の層は変わりませんか?

model.layers[0].get_weights()[1] # get_weight() returns a list of weights 

今回、重みが変更しました: 私はソースコードをチェックしますが、まだ何の答えを得ない、私は監視を試してみました。だから私はどのような体重がトレーニング中に働く "本当の"体重であるのだろうか?なぜウェイトリストに2つの要素があるのですか? mlp()


定義:layer.get_weights()の質問については

def mlp(): 
    model=Sequential() 
    model.add(Dense(500, input_dim=784)) 
    model.add(Dense(503,init='normal',activation='relu')) 
    model.add(Dense(503,init='normal',activation='relu')) 
    model.add(Dense(10, activation='softmax')) 
    return model 
+1

mlp()関数を提供できますか?これは本当に奇妙な行動です –

+0

@MarcinMożejko私はそれを更新しました。私は 'layer.weights'リストの2番目の重みを混同しています。 –

+0

あなたのモデルを編集しましたか? –

答えて

3

私はこの問題について、いくつかのテストを実行し、ソースコードをチェックします。私はDense層は、Python listの種類layer.get_weights()[0]に格納されている層の2つの要素量を有し、biaslayer.get_weights()[1]で保存されLayerのサブクラスと、その重みであることを見出しました。 model.add(Dense(503,init='normal',activation='relu',bias=False))

bias層を定義する時に無効にすることができ、ことに注意することは一つのことがあります。その場合、リストlayer.get_weights()には1つの要素しかありません。 bias属性を定義した後にFalseと設定すると、biasの要素が残り、モデルを適用した後に更新されます。を更新しないの質問に対する

私は一つだけ緻密層とシーケンシャルモデル設定:その後、私はコンパイルするには、上記と同じ方法を使用し

def mlp_2(): model=Sequential() model.add(Dense(10, input_dim=784, activation='softmax', bias =False)) return model

をし、それに合う。これは私が得たものである:

enter image description here

まだ体重を更新していないようだ、しかし、我々は重量が間違いなく変更されて伝えることができます。正確さが増しているからです。私は唯一の説明は最初のdense層(あなたが定義するinput_dim)の更新がKerasがプリントアウトするには小さすぎると思う。私は体重のより正確な値をチェックしなかった、誰かがそれを納得させることができれば素晴らしいだろう。

関連する問題