2017-01-22 363 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 

這一次,權做了改變。所以我想知道在訓練過程中哪個重量是真正的重量?爲什麼權重列表中有兩個元素?


mlp()定義:

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'列表中的第二個權重感到困惑。 –

+0

你編譯過你的模型嗎? –

回答

3

對於layer.get_weights()問題:

我跑在這個問題上的一些測試,並檢查了源代碼。我發現Dense層是Layer及其權重的子類,其是一種類型的蟒list的具有存儲在layer.get_weights()[0]該層的兩個元件重量和bias存儲在layer.get_weights()[1]

有一兩件事要注意的是,bias可以定義層中被禁用:model.add(Dense(503,init='normal',activation='relu',bias=False))。在這種情況下,列表layer.get_weights()只有一個元素。如果在定義它之後將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來說太小而無法打印。我沒有檢查權重的更精確的價值,如果有人能夠認定它,這將是非常好的。