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)
Haben Sie versucht, alle Schichten einzufrieren? 'für l in conv_base.layers: l.trainable = False' –
Wenn es nicht funktioniert, müssen Sie es möglicherweise als trainierbar festlegen, nachdem Sie es dem sequenziellen Modell hinzugefügt haben ... –
@ 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