我有一个训练有素的模型,我已经导出了权重,并希望部分加载到另一个模型中。 我的模型使用TensorFlow作为后端在Keras中构建。
现在我正在做如下:
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'])
我确信这是一种可怕的方式,尽管它有效。
如何仅加载前9层?
答案 0 :(得分:19)
如果您的前9个图层始终在原始训练模型和新模型之间命名,那么您可以model.load_weights()
使用by_name=True
。这将仅在新模型的图层中更新权重,这些图层在原始训练模型中找到具有相同名称的图层。
可以使用name
关键字指定图层的名称,例如:
model.add(Dense(8, activation='relu',name='dens_1'))
答案 1 :(得分:15)
这个电话:
weights_list = model.get_weights()
将返回模型中所有权重张量的列表,如Numpy数组。
接下来要做的就是遍历此列表并应用:
for i, weights in enumerate(weights_list[0:9]):
model.layers[i].set_weights(weights)
其中model.layers
是包含模型的图层的展平列表。在这种情况下,您重新加载前9层的权重。
更多信息请点击此处: