【tensorflow2.0】10.模型保存与加载

    今天的课程是本周的最后一节了,大家坚持一下!今天的内容是模型的保存与加载,深度学习模型我们目前学习了两种:keras模型与自定义模型(keras模型自定义模型);模型的保存与加载老师的github中给出了三种方法,下面我们就通过今天的打卡作业来梳理一下这些方法如何使用以及有何差别。

"""
第一个是model.load_weights('文件名.h5')和model.load_weights('文件名.h5')
这个函数只会保留模型的权重,它不包含模型的结构,所以当我们加载权重文件时候,需要先输入网络结构
"""
#这里用到的代码都来自于前几天的作业,这里只节选一部分
#inputs = tf.keras.Input(shape=(4,))
#x = tf.keras.layers.Dense(32,activation='relu')(inputs)
#x = tf.keras.layers.Dense(32,activation='relu')(x)
#predictions = tf.keras.layers.Dense(3,activation='softmax')(x)

model = tf.keras.Model(inputs,predictions)
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])

model.fit(X, Y, batch_size=32, epochs=100,shuffle=True)

model.save_weights('abc.h5')
#加载权重文件时候只需要写入上边被注释掉的网络结构即可
model.load_weights('abc.h5')
model.predict(x_test)

"""
这种保存权重的方法同样可以使用在自定义网络中,使用方法和keras模型相同
"""

"""
第二个是model.save('文件名.h5')和model.load_model('文件名.h5')
将整个模型保存下来,以后直接载入模型与训练数据即可开始训练,不用再定义网络和编译模型.
(这种方法已经保存了模型的结构和权重,以及损失函数和优化器)
"""
#这里用到的代码都来自于前几天的作业,这里只节选一部分
inputs = tf.keras.Input(shape=(4,))
x = tf.keras.layers.Dense(32,activation='relu')(inputs)
x = tf.keras.layers.Dense(32,activation='relu')(x)
predictions = tf.keras.layers.Dense(3,activation='softmax')(x)

model = tf.keras.Model(inputs,predictions)
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])

model.fit(X, Y, batch_size=32, epochs=100,shuffle=True)

model.save('123.h5')

#加载权重文件时候只需要导入相应的包以及需要测试的数据
new_model = tf.keras.models.load_model('1234.h5') #需要建立一个model
new_model.predict(x_test)

"""
注意:这种方法只可以使用在keras的顺序模型和函数式模型中,不能使用在子类模型和自定义模型中,否则会报错
"""
"""
第三个是tf.saved_model.save(model,'文件夹名')和 tf.saved_model.load('文件夹名')
注意:这里是文件夹名称!!
当我们使用这个方法后,对应目录下会出现一个文件夹,文件夹下有两个子文件夹和一个子文件:assets、variables、save_model.pb

TensorFlow 为我们提供的SavedModel这一格式可在不同的平台上部署模型文件,当模型导出为 SavedModel 文件时,无需建立
模型的源代码即可再次运行模型,这使得SavedModel尤其适用于模型的分享和部署。
"""
#使用方法和前两种相同,只需要结尾加上tf.saved_model.save(model,'文件夹名')
inputs = tf.keras.Input(shape=(4,),name='digits')
x = tf.keras.layers.Dense(32,activation='relu')(inputs)
x = tf.keras.layers.Dense(32,activation='relu')(x)
predictions = tf.keras.layers.Dense(3,activation='softmax')(x)

model = tf.keras.Model(inputs,predictions)
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])

model.fit(X, Y, batch_size=32, epochs=100,shuffle=True)

tf.saved_model.save(model,'文件夹名')

#我们可以通过下边这行代码查看保存的文件夹
!saved_model_cli show --dir tf_saved_model_version --all

"""
输出:
MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:

signature_def['__saved_model_init_op']:
  The given SavedModel SignatureDef contains the following input(s):
  The given SavedModel SignatureDef contains the following output(s):
    outputs['__saved_model_init_op'] tensor_info:
        dtype: DT_INVALID
        shape: unknown_rank
        name: NoOp
  Method name is: 

signature_def['serving_default']:  加载模型时候需要的名字!!
  The given SavedModel SignatureDef contains the following input(s):
    inputs['digits'] tensor_info:    这里是输入名字!!
        dtype: DT_FLOAT
        shape: (-1, 32)
        name: serving_default_digits:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['predictions'] tensor_info:   这里是输出名字!!
        dtype: DT_FLOAT
        shape: (-1, 10)
        name: StatefulPartitionedCall:0
  Method name is: tensorflow/serving/predict

"""
#当我们加载这个模型时候
restored_saved_model = tf.saved_model.load('model')
f = restored_saved_model.signatures["serving_default"]
f(digits = tf.constant(x_test.tolist()) )  #这里的输入要转化为列表


这种方法可以使用于自定义模型,方法同keras模型相同
周末快乐!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值