如何在Keras上仅加载特定权重

Ber*_*oGO 17 machine-learning conv-neural-network keras tensorflow

我有一个训练有素的模型,我已经导出了权重,并希望部分加载到另一个模型中.我的模型使用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'])
Run Code Online (Sandbox Code Playgroud)

我确信这是一种可怕的方式,尽管它有效.

如何加载前9层?

dhi*_*ley 25

如果你的第一个9层,原来的训练模型和新模型之间统一进行命名,那么你可以使用model.load_weights()by_name=True.这将仅在新模型的图层中更新权重,这些图层在原始训练模型中找到具有相同名称的图层.

可以使用name关键字指定图层的名称,例如:

model.add(Dense(8, activation='relu',name='dens_1'))
Run Code Online (Sandbox Code Playgroud)


Phi*_*emy 20

这个电话:

weights_list = model.get_weights()
Run Code Online (Sandbox Code Playgroud)

将返回模型中所有权重张量的列表,如Numpy数组.

您接下来要做的就是遍历此列表并应用:

for i, weights in enumerate(weights_list[0:9]):
    model.layers[i].set_weights(weights)
Run Code Online (Sandbox Code Playgroud)

其中model.layers是包含模型的图层的展平列表.在这种情况下,您重新加载前9层的权重.

更多信息请点击这里:

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

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

  • 但这会产生更大的问题。我必须定义/编译两个模型并遍历层以复制权重。与问题中的代码相比,它的可读性和计算能力都较差。我真正想要的是一种在不加载模型的情况下加载权重的方法,这样我就可以只设置我想要的那些而不必定义两个模型。 (2认同)