载入预训练model权重

初始化一个新模型,然后导入旧模型,将旧模型的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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值