2017-11-09 2 views
1

Ich versuche, die frei trainierten VGG16-Layer ('conv_base' unten) einzufrieren und füge oben neue Layer zum Feature-Extrahieren hinzu. Ich erwarte die gleichen Vorhersageergebnisse von 'conv_base' vor (ret1)/nach (ret2) Anpassung des Modells, aber es ist nicht. Ist dieser falsche Weg, das Einfrieren von Gewicht zu überprüfen?sollte nicht model.trainable = Falsche Freeze Gewichte unter dem Modell?

Lade VGG16 und auf untrainable

conv_base = applications.VGG16(weights='imagenet', include_top=False, input_shape=[150, 150, 3])  
conv_base.trainable = False 

Ergebnis vor Modell passen

ret1 = conv_base.predict(np.ones([1, 150, 150, 3])) 

fügen Schichten auf der Oberseite des VGG16 und kompilieren, ein Modell

model = models.Sequential() 
model .add(conv_base) 
model .add(layers.Flatten()) 
model .add(layers.Dense(10, activation='relu')) 
model .add(layers.Dense(1, activation='sigmoid')) 
m.compile('rmsprop', 'binary_crossentropy', ['accuracy']) 

passt das Modell

m.fit_generator(train_generator, 100, validation_data=validation_generator, validation_steps=50) 

Ergebnis nach Modell

ret2 = conv_base.predict(np.ones([1, 150, 150, 3])) 

Hoffnung paßt das ist wahr, aber es ist nicht.

np.equal(ret1, ret2) 
+0

Haben Sie versucht, alle Schichten einzufrieren? 'für l in conv_base.layers: l.trainable = False' –

+0

Wenn es nicht funktioniert, müssen Sie es möglicherweise als trainierbar festlegen, nachdem Sie es dem sequenziellen Modell hinzugefügt haben ... –

+0

@ DanielMöller ja, das funktioniert perfekt. aber ich verstehe das nicht, warum model.trainable anders arbeitet als die "layer.trainable für layer in model.layers". – page

Antwort

0

Sie müssen einzeln Schichten einfrieren:

for l in conv_base.layers: 
    l.trainable=False 

Und wenn das nicht funktioniert, sollten Sie wahrscheinlich den neuen sequenziellen Modell verwenden, um die Schichten einzufrieren.

1

Dies ist ein interessanter Fall. Warum so etwas passieren wird durch die folgende Sache verursacht:

Sie können nicht ein ganzes Modell nach der Kompilierung einfrieren und es ist nicht eingefroren, wenn es nicht kompiliert

Wenn Sie einen Flag gesetzt model.trainable=False dann beim Kompilieren keras setzen alle Schichten sind nicht trainierbar. Wenn Sie dieses Flag nach der Kompilierung setzen, hat das keinerlei Auswirkungen auf Ihr Modell. Dasselbe gilt - wenn Sie dieses Flag vor dem Kompilieren setzen und dann einen Teil eines Modells zum Kompilieren eines anderen wiederverwenden, wirkt sich dies nicht auf Ihre wiederverwendbaren Ebenen aus. So model.trainable=False funktioniert nur, wenn Sie es in einer folgenden Reihenfolge anwenden werden:

# model definition 
model.trainable = False 
model.compile() 

In jedem anderen Szenario wäre es nicht wie erwartet funktionieren.

+0

Haben Sie die Antworten gelesen? War meine Antwort falsch? –