2017-01-22 12 views
5

bazı deneyler yapmak keras kullanıyorum ve sadece basit bir MLP modeli için ağırlık güncelleştirme izlenen: İlk yoğun katman için`layer.get_weights()` ne döndürür?

# 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 

, ben sıfır bir matris var. Eğitimin bu ağırlığı değiştirmediğini düşündüm. Bununla birlikte, diğer katmanlardaki ağırlıklar değişmiştir. Yani kafam karıştı, neden ilk katman değişmedi?

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

Bu sefer ağırlıkları değişiklik yaptı: ben kaynak kodunu kontrol ama hala hiçbir cevap var, o zaman izleme çalıştı. Öyleyse hangi kiloların eğitim sırasında çalışan "gerçek" ağırlık olduğunu merak ediyorum? Ağırlık listesinde neden iki öğe var? mlp() ait


Tanımı: layer.get_weights() ait soru için

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

Bize mlp() işlevini verebilir misiniz? Bu gerçekten garip davranış –

+0

@ MarcinMożejko güncelledim. Layer.weights 'listesindeki ikinci ağırlıkta kafam karıştı. –

+0

Modelinizi derlediniz mi? –

cevap

3

:

Ben bu konuda bazı testler yaptım ve kaynak kodlarını kontrol etti. I Dense tabaka piton list bir tür layer.get_weights()[0] saklandı tabakanın iki eleman ağırlığı vardır ve bias layer.get_weights()[1] saklanır olan Layer ve ağırlıkları bir alt sınıfı, olduğu bulunmuştur. model.add(Dense(503,init='normal',activation='relu', bias=False )):

bias tabakasını tanımlayan sırasında devre dışı bırakılabilir, dikkat etmek bir şey var. Bu durumda, layer.get_weights() listesinin yalnızca bir öğesi vardır. Tanımladıktan sonra bias özniteliğini False olarak ayarlarsanız, bias için hala bir öğe olacak ve modeli taktıktan sonra güncellenecektir. ait soru için

güncellememesi:

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

Sonra yukarıdaki derlemek için aynı şekilde kullanabilirsiniz ve: Ben sadece bir yoğun katmanına sahip bir Sıralı modelini kurmak

uygun. Bu bende ne olduğunu: Hala Ancak biz kilo kesinlikle değiştirilir söyleyebilir, kilo güncelleme değil görünüyor

enter image description here

. Çünkü doğruluk artıyor. Tek açıklama, ilk dense katmanındaki (input_dim'u tanımladığınız) güncelleştirmelerin Keras'ın çıktısı için çok küçük olduğunu düşünüyorum. Ağırlığın daha kesin değerini kontrol etmedim, eğer birisi onu şaşırtabilirse harika olurdu.

İlgili konular