2017-01-22 9 views
5

ich Keras bin mit ein paar Experimente zu tun und ich überwacht nur das Gewicht Update für ein einfaches mlp Modell:Was gibt `layer.get_weights()` zurück?

# 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 

Für die erste dichte Schicht, bekam ich eine Matrix aus Nullen. Ich dachte, das Training ändert dieses Gewicht nicht. Gewichte in anderen Ebenen werden jedoch geändert. Also ich bin verwirrt, warum die erste Schicht unverändert ist? ich den Quellcode überprüft, aber immer noch keine Antwort, dann habe ich versucht, Überwachung:

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

Dieses Mal werden die Gewichte verändert haben. Also frage ich mich, welches Gewicht das "wahre" Gewicht ist, das während des Trainings funktioniert? Warum gibt es zwei Elemente in der Gewichtsliste?


Definition von 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

Könnten Sie uns die mlp() -Funktion bereitstellen? Das ist wirklich seltsames Verhalten –

+0

@ MarcinMożejko Ich habe es aktualisiert. Ich bin verwirrt auf dem zweiten Gewicht in der Liste "Layer.Weights". –

+0

Haben Sie Ihr Modell zusammengestellt? –

Antwort

3

Für die Frage der layer.get_weights():

lief ich ein paar Tests zu diesem Thema und überprüft die Quellcodes. Ich fand, dass die Dense Schicht ist eine Unterklasse von Layer und seinen Gewichten, die eine Art von Python Gewicht list hat zwei Elemente der Schicht bei layer.get_weights()[0] und die bei layer.get_weights()[1]bias gespeichert gespeichert ist.

Es ist eine Sache zu beachten, dass, können bias während die Definition der Schicht deaktiviert werden: model.add(Dense(503,init='normal',activation='relu',bias=False)). In diesem Fall hat die Liste layer.get_weights() nur ein Element. Wenn Sie das Attribut bias nach der Definition als False festlegen, wird es immer noch ein Element für bias geben, das nach der Anpassung des Modells aktualisiert wird.

Für die Frage der nicht Aktualisierung: oben

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

Dann benutze ich die gleiche Art und Weise zu kompilieren und zu:

ich ein Sequential Modell mit nur einem dichten Schicht aufgebaut passen Sie es an. Das ist, was ich habe:

enter image description here

Es scheint immer noch nicht das Gewicht aktualisieren, jedoch können wir das Gewicht sagen, ist auf jeden Fall geändert. Weil die Genauigkeit zunimmt. Ich denke, die einzige Erklärung ist Updates auf der ersten Ebene dense (die Sie input_dim definieren) ist zu klein für Keras zum Ausdrucken. Ich habe den präziseren Wert der Gewichte nicht überprüft, es wäre großartig, wenn jemand das bestätigen könnte.

Verwandte Themen