一、checkpoint
1、检查点checkpoint中存储着模型所使用的所有tf.Variable对象,它不包含任何关于模型的计算信息,故只有在恢复原模型时才可用;
2、Checkpoints文件是二进制文件,它把变量名映射到对应的tensor值,本质上存储各个变量的值,并没有网络结构信息;
3、保存模型的权重、优化器状态信息以及配置,缺少模型结构。

tensorflow 保存训练模型pb tensorflow保存模型参数_加载

二、h5文件
h5文件保存整个模型,包括模型的结构、权值、配置(优化器、损失函数等)以及优化器的状态信息,所以可以接着训练。
三、SavedModel
1、SavedModel是对TensorFlow对象标准的序列化格式,它包含TensorFlow程序的完整信息,不仅包含参数的权值,还包含计算的流程(计算图)。即无需模型的源代码即可再次运行模型,非常适用模型的分享和部署。
2、保存模型的所有信息:网络结构、权重、配置和优化器状态
四、TensorFlow2.x
I、Sequence模型保存和加载
1、保存为h5文件
# 保存模型
model.save('path_to_my_model.h5')
# 加载模型,同时加载模型的结构、权重等信息
new_model = keras.models.load_model('path_to_my_model.h5')
2、保存为SavedModel
# 保存模型,其中path_to_saved_model为一个保存模型的文件夹
model.save('path_to_saved_model', save_format='tf')
# 加载模型,通过指定存放模型的文件夹
new_model = keras.models.load_model('path_to_saved_model')
3、仅保存模型结构
# 方法一:通过model的get_config方法,注意该命令并没有存储到磁盘哦
config = model.get_config()
# 模型结构的加载
new_model = keras.Model.from_config(config)

# 方法二:通过json格式,将模型保存为json格式
json_config = model.to_json()
# 模型加载
new_model = keras.models.model_fron_json(json_config)

# 将模型结构以json格式保存到磁盘文件
with open('model_config.json', 'w') as json_file:
    json_file.write(json_config)
# 磁盘读取,加载模型
with open('model_config.json') as json_file:
    json_config = json_file.read()
new_model = keras.models.model_from_json(json_config)
4、仅保存模型权重
# 仅获取权重,不保存
weights = model.get_weights()
# 给模型设置权重
model.set_weigths(weights)

## 用h5文件存储,将模型权重保存到磁盘
model.save_weights('path_to_my_weights.h5')
## 从磁盘加载权重
new_model.load_weights('path_to_my_weights.h5')

## 用checkpoint格式存储,权重checkpoint会保存在path_to_my_tf_checkpoint文件夹下
model.save_weights('path_to_my_tf_checkpoint')
## 为了和保存为h5文件进行区分,通过关键字save_format
model.save_weights('path_to_my_tf_checkpoint', save_format='tf')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OPMiZeGX-1638408371777)(C:\Users\LinJie\AppData\Roaming\Typora\typora-user-images\image-20210816100436889.png)]

II、SubClass Model模型保存和加载
SubClass Model是通过继承Model类来实现模型子类化,不能像Sequence和Model那样将整个模型保存成一个完整的h5文件
1、仅保存checkpoint权重信息
my_model.save_weights('path_to_my_weights', save_format='tf')
2、保存为SavedModel格式

一、model.save()

# 保存整个模型,需要调用fit或者是predict方法才能使用该方法保存
model.save('path_to_my_model', save_format='tf')
# 加载模型
new_model = keras.models.load_model('path_to_my_model')

二、model._set_inputs(shape)

# 若不用fit训练,保存模型
# 创建自定义模型
model = KeypointNetwork()  
 
# 对于自定义模型,给模型制定一个输入形状,这对于后面模型的保存以及加载,是有必要的
# 通过TensorSpec创建一个“无实际数据的张量”,指定它的形状,作为模型的输入
shape = tf.TensorSpec(shape = (batch_size,210), dtype=tf.dtypes.float32, name=None)
 
# 设置模型的输入
model._set_inputs(shape)  # 设置模型的输入形状
 
# 开始训练流程
for epoch in range(1,epochs+1):
    ... ...
    ... ...
 
# 现在可以保存完整的模型了
model.save('./model-weights/checkpoint_weights',save_format='tf')

# 查看文档
help(tf.keras.Model._set_inputs)

三、tf.saved_model.save(model, ‘my_saved_model’)

# 保存整个模型成SavedModel格式,注意参数'my_saved_model'是文件夹名称,需要使用fit训练
tf.saved_model.save(model,'my_saved_model')
 
# 加载SavedModel格式的模型
restored_saved_model = keras.models.load_model('my_saved_model')
二、TensorFlow1.x
1、保存为checkpoint文件
saver = tf.train.Saver()  # 通过Saver类创建一个实例对象
saver.save(sess, model_path + model_name)

# 一般保存格式如下,先创建saver对象,然后在session里面训练结束之后开始保存
saver = tf.train.Saver()
with tf.Session() as sess:
    # 训练代码
    saver.save(sees, model_path + model_name)
2、从checkpoint恢复模型
使用低层API中实际上本质上没有层,模型这两个概念,实际上有的仅仅是operation,tensor,graph这几个概念,所谓的通过meta文件恢复模型,也只不过是恢复整个graph的结构,而没有真正的模型,所以要恢复一个模型,必须要知道这个graph的两个信息,即graph的输入是什么,输出是什么;

为了非常清楚的知道模型的“输入”与“输出”,所以,在使用tensorflow1.x的低层API的时候,需要给输入和输出指定比较明确名称,这样才能够在恢复模型的时候选择输入与输出的节点。
一、构建网络
(1)第一:输入在tensorflow1.x版本中都是通过预先设定placeholder来实现的,所以对于输入的placeholder需要取一个好记的名称;
(2)第二:输出是整个计算图graph最后一的运算结果,需要给最后一步运算也起一个好的名称

二、恢复模型
(1)第一步:加载graph结构与保存的各个Variable
new_saver=tf.train.import_meta_graph('mnist_cnn_model/medel.ckpt.meta') # 导入模型的图结构
new_saver.restore(sess,'mnist_cnn_model/medel.ckpt')                    # 载入graph中的各个Variable
等价于
model_path = tf.train.latest_checkpoint('model_filefolder')  # 获取最新的模型,注意这里的是文件夹哦
new_saver.restore(sess,model_path)  

(2)第二步:取得整个graph中的输入与输出
graph = tf.get_default_graph()   # 获取当前图,为了后续训练时恢复变量
# 根据定义graph的时候设置的输入tensor的名称
X = graph.get_tensor_by_name('model_input:0') #从模型中获取输入的那个节点
# 根据定义graph的时候设置的模型最后一步的输出        
model_y = graph.get_tensor_by_name('dense4_output:0')
等价于
# 即直接使用sess.graph
X=sess.graph.get_tensor_by_name('input:0')                
model_y=sess.graph.get_tensor_by_name('output_layer/output:0')

(3)第三步:测试模型,得到预测输出值
 result=sess.run(model_y,feed_dict={X:test_x})  #需要的就是模型预测值model_Y,这里存为result
# 输入通过指定的placeholder来指定
X=tf.placeholder(dtype=tf.float32,shape=[None,img_size,img_size,1],name='input')
Y=tf.placeholder(dtype=tf.float32,shape=[None,num_class])
 
# 第一个卷积层
with tf.name_scope('cnn_layer_01') as cnn_01:     
    w1=tf.Variable(tf.random_normal(shape=[3,3,1,32],stddev=0.01))
    conv1=tf.nn.conv2d(X,w1,strides=[1,1,1,1],padding="SAME")
    conv_y1=tf.nn.relu(conv1)
 
# 第一个池化层
# 第二个卷积层
# 第二个池化层 
... ...
... ...
# 全连接层 
 
# 最后的输出层,model_Y则为神经网络的预测输出
with tf.name_scope('output_layer') as output_layer:
    w5=tf.Variable(tf.random_normal(shape=[625,num_class]))
    model_Y=tf.matmul(FC_y7,w5,name='output')  # 输出其实就是对应最后一步的运算,这里需要取一个好的名字

########################################## 加载模型 ############################################
with tf.Session(config=config) as sess:
    sess.run(tf.global_variables_initializer())
     
    # 通过meta文件,加载模型结构,返回的是一个saver对象
    saver = tf.train.import_meta_graph('./ckpt_model/keypoint_model.ckpt-9.meta')
    # 载入模型参数
    saver.restore(sess,'./ckpt_model/keypoint_model.ckpt-9')
        
    graph = tf.get_default_graph()   # 获取当前图,为了后续训练时恢复变量
       
    # 获取模型的输入名称
    X = graph.get_tensor_by_name('model_input:0') #从模型中获取输入的那个节点
    # 获取模型的输出名称
    model_y = graph.get_tensor_by_name('dense4_output:0')
    
    # 测试模型
    result=sess.run(model_y,feed_dict={X:test_x})  # 需要的就是模型预测值model_Y,这里存为result

graph.get_tensor_by_name(‘model_input:0’) #从模型中获取输入的那个节点
# 获取模型的输出名称
model_y = graph.get_tensor_by_name(‘dense4_output:0’)

# 测试模型
result=sess.run(model_y,feed_dict={X:test_x})  # 需要的就是模型预测值model_Y,这里存为result