初始化一个新模型,然后导入旧模型,将旧模型的embedding权重用到新模型。
def load_pretrain_embedding(old_path):
new_model = build_model()
old_model = tf.keras.models.load_model(old_path) # 预训练模型
for i, pretrain_layer in enumerate(old_model.layers):
if isinstance(pretrain_layer, tf.keras.layers.Embedding) and pretrain_layer.name=='pretrain_goods_embedding':
for layer in new_model.layers: # 新模型
if isinstance(layer, tf.keras.layers.Embedding) and layer.name=='pretrain_goods_embedding':
weights = old_model.get_layer(index=i).get_weights()
assert len(weights) == 1
layer.set_weights(weights) # 赋权重
return model
其他相关:
1.截取已训练好的模型的中间输出,可通过Model截取:
from tensorflow.keras.models import load_model
model_path = '...'
model = load_model(model_path)
sub_model = tf.keras.Model(inputs = model.input, outputs = model.get_layer('logits').output)
这样就截取到了从原模型得到的一个子模型,从原模型输入到原模型中间层’logits’。model.get_layer()可通过某一层的名称获得,例如’logits’,通过model.summary()中查看即可,或构建原模型时有自定义名称;也可通过get_layer(index=i)获取。
2.截取后加层,以及冻结前面的层
for layer in model.layers:
layer.trainable = False
last_layer = model.get_layer('fc2').output
out = Flatten()(last_layer)
out = Dense(128, activation='relu', name='fc3')(out)
out = Dropout(0.5)(out)
out = Dense(n_classes, activation='softmax', name='prediction')(out)
new_model = Model(input=model.input, output=out)