web-dev-qa-db-de.com

So laden Sie nur bestimmte Gewichte auf Keras

Ich habe ein trainiertes Modell, dass ich die Gewichte exportiert habe und teilweise in ein anderes Modell laden möchte. Mein Modell ist in Keras mit TensorFlow als Backend gebaut.

Im Moment mache ich Folgendes:

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=input_shape, trainable=False))
model.add(Activation('relu', trainable=False))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3), trainable=False))
model.add(Activation('relu', trainable=False))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3), trainable=True))
model.add(Activation('relu', trainable=True))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])


model.load_weights("image_500.h5")
model.pop()
model.pop()
model.pop()
model.pop()
model.pop()
model.pop()


model.add(Conv2D(1, (6, 6),strides=(1, 1), trainable=True))
model.add(Activation('relu', trainable=True))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

Ich bin sicher, es ist ein schrecklicher Weg, es zu tun, obwohl es funktioniert.

Wie lade ich nur die ersten 9 Ebenen?

16
BernardoGO

Wenn Ihre ersten 9 Ebenen zwischen Ihrem ursprünglich trainierten Modell und dem neuen Modell konsistent benannt sind, können Sie model.load_weights() mit by_name=True Verwenden. Dadurch werden die Gewichte nur in den Layern Ihres neuen Modells aktualisiert, die einen identischen Namen im ursprünglich trainierten Modell haben.

Der Name des Layers kann mit dem Schlüsselwort name angegeben werden, zum Beispiel:

model.add(Dense(8, activation='relu',name='dens_1'))
25
dhinckley

Dieser Anruf:

weights_list = model.get_weights()

gibt eine Liste aller Gewichtstensoren im Modell als Numpy-Arrays zurück.

Alles, was Sie als Nächstes tun müssen, ist, diese Liste zu durchlaufen und Folgendes anzuwenden:

for i, weights in enumerate(weights_list[0:9]):
    model.layers[i].set_weights(weights)

wo model.layers ist eine abgeflachte Liste der Ebenen, aus denen das Modell besteht. In diesem Fall laden Sie die Gewichte der ersten 9 Ebenen neu.

Weitere Informationen finden Sie hier:

https://keras.io/layers/about-keras-layers/

https://keras.io/models/about-keras-models/

18
Philippe Remy