基于tf2.x的keras训练的模型转成tf1.x版本

写在前面

我训练使用的是TF2.3,部分业务场景需要将模型转到TF1.14版本进行部署。
训练的模型是基于keras的预训练,外加自己添了一点东西。
TF2.x的模型转到TF1.x之后存在精度损失,因模型而异。

第一步:保证在tf1.x环境下正确导入tf2.x的权重

在TF2.x只保存模型的权重

只保存模型的权重,能够保证在TF1.x环境下,通过定义模型结构可以正确的导入权重,不会引入TF2.x特有的OP或者属性,避免一些莫名奇妙的错误。

    tf2_model = load_trained_keras_model() # 导入训练好的模型
    tf2_model.trainable = False # 此步要加,可避免一些错误
    tf2_model.save("weights.hdf5")

在TF1.x下定义模型结构并导入TF2.x保存的权重

在TF2.x的keras中有些Layer不存在于TF1.x中,比如keras.layers.Normalizaiton,在定义模型结构时,可以对一些不存在的op进行自定义生成,保证Variable的名字一致,这是因为模型导入权重有两种形式:(1)根据网络的拓扑逻辑自动填入权重;(2)根据变量名称填入权重。
在定义网络结构时,一定要和原来保持一致,例如:

# tf2.x
inputs = tf.keras.Input(shape=(224, 224, 3))
pretrain = tf.keras.applications.EfficientNetB0(include_top=False, input_tensor=inputs, pooling=None)
x = pretrain(inputs)
x = tf.keras.layers.Conv2D(512, kernel_size=1, use_bias=False)(x)
outputs = tf.keras.layers.GlobalAvgPool2D()(x)
model = tf.keras.Model(inputs, outputs, name="my_model")

model.summary()

# _________________________________________________________________
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值