详解常见的tensorflow,keras模型保存和加载

 一定要看代码注释,这些模型格式可以互相转化,有兴趣自己查阅学习!

tensorflow保存的文件格式多种多种:TFLite, frozen graph, SavedModel, serving model, TFHub representation, Keras's .h5  .其实tensorflow和keras是一家,可以理解为tensorflow是c,keras则是python ,就是封装成直接调用的简单方法成了keras了。

Tensorflow

1、CheckPoint(.ckpt) :.ckpt方式保存模型,这种模型文件是依赖 TensorFlow 的,只能在其框架下使用(我很少使用这种,初学感觉文件好多,也不好理解)

参考TensorFlow模型保存和提取方法

保存:

利用tf.train.Saver类实现模型的保存和加载,直接上代码!!!



import tensorflow as tf
v1 = tf.Variable(tf.constant(1.0, shape=[1]), name="v1")
v2 = tf.Variable(tf.constant(2.0, shape=[1]), name="v2")
result = v1 + v2
saver = tf.train.Saver()

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    saver.save(sess, "model.ckpt")

这种方式model.ckpt生成4个文件:如图

详解常见的tensorflow,keras模型保存和加载_第1张图片

checkpoint文件:b包含最新的和所有的文件地址
.data文件:包含训练变量的文件(就是神经网络中权重w以及一些其他变量)
.index文件:描述variable中key和value的对应关系
.meta文件:保存完整的网络图结构(也就是graph,你定义好的整个模型运行的框架)
使用这种方法保存模型时会保存成上面这四个文件

加载:

重新加载模型时通常只会用到.meta文件恢复图结构然后用.data文件把各个变量的值再加进去。



with tf.Session() as sess:
    #恢复计算图结构
    saver = tf.train.import_meta_graph(',model.ckpt.meta')

     #恢复所有变量信息
    saver.restore(sess, "model.ckpt")

#现在sess中已经恢复了网络结构和变量信息了,之后直接用节点的名称来调用,相关代码自己查吧!

2..GraphDef(.pb):这种格式一个文件就保存图的结构和变量,方便使用。

代码不完整,参考tensorflow保存模型的几种方法

保存:

tf.train.write_graph(') # 生成.pb, 再通过freeze_graph把.pb与ckpt固化成新的pb文件


# 把变量转成常量之后写入PB文件中
def SaveFrozenPb(nodeNameList, pbFile):
    gd = tf.graph_util.convert_variables_to_constants(sess,
                                        tf.get_default_graph().as_graph_def(),nodeNameList)
    with tf.gfile.GFile(pbFile, 'wb') as f:
        f.write(gd.SerializeToString())
# 通过freeze_graph把tf.train.write_graph()生成的pb文件与tf.train.saver()生成的chkp文件固化之后重新生成一个pb文件
# freeze_graph --input_graph=./hello.pb --input_checkpoint=./hello_model --output_node_names=hello,y --input_node_names=x --output_graph=./hello_frozen.pb
# 如果不调用freeze_graph, 直接使用会报错‘google.protobuf.message.DecodeError: Error parsing message’ 

def SavePbForFreezeGraph(pbDir, pbName):
    tf.train.write_graph(sess.graph_def, pbDir, pbName)



加载:


def RestorePb(sess, name):
    # 二进制读取模型文件
    with tf.gfile.FastGFile(name, 'rb') as f:                     
       graph_def = tf.GraphDef()                     
       graph_def.ParseFromString(f.read())                     
       sess.graph.as_default()                     
       tf.import_graph_def(graph_def, name='') # 导入计算图

if __name__ == '__main__':
    sess = tf.Session()
     RestorePb(sess, './hello_frozen.pb')

Keras

将tensorflow封装起来好多方法形成了keras,它的母体还是tensorflow,所以keras使用起来更方便

1..h5

保存:

keras的模型一般保存为后缀名为h5的文件,但是h5文件用save()和save_weight()保存效果是不一样的。这里我使用其他博主的代码:

from keras.models import Model
from keras.layers import Input, Dense
from keras.datasets import mnist
from keras.utils import np_utils
 
 
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train=x_train.reshape(x_train.shape[0],-1)/255.0
x_test=x_test.reshape(x_test.shape[0],-1)/255.0
y_train=np_utils.to_categorical(y_train,num_classes=10)
y_test=np_utils.to_categorical(y_test,num_classes=10)
 
inputs = Input(shape=(784, ))
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
y = Dense(10, activation='softmax')(x)
 
model = Model(inputs=inputs, outputs=y)
 
model.save('m1.h5')
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=32, epochs=10)
#loss,accuracy=model.evaluate(x_test,y_test)
 
model.save('m2.h5')
model.save_weights('m3.h5')

一共保存了m1.h5, m2.h5, m3.h5 这三个h5文件。

m2表示save()保存的模型结果,它既保持了模型的图结构,又保存了模型的参数。它的size最大的。

m1表示save()保存的训练前的模型结果,它保存了模型的图结构,但应该没有保存模型的初始化参数,它的size要比m2小很多。

m3表示save_weights()保存的模型结果,它只保存了模型的参数,但并没有保存模型的图结构。它的size也要比m2小很多。

加载:

加载模型:

from tensorflow.python.keras.models import load_model

model.load_model(m2.h5)
model.load_weights(‘m3.h5’)

如果需要加载权重到不同的网络结构中,可以通过层名字来加载模型: 
model.load_weights('my_model_weights.h5', by_name=True)

2.pb

因为 .h5格式的模型只适合在本地使用,不适合部署。tensorflow2.x 中keras提供了保存和加载 .pb 格式模型的方法,很简单。

# 保存模型结构和参数到文件
tf.keras.models.save_model(net,"model_save_path") # 默认生成 .pb 格式模型,也可以通过save_format 设置 .h5 格式
print('模型已保存')
# 加载
net=tf.keras.models.load_model("model_save_path")


 

你可能感兴趣的:(python,tensorflow,keras,计算机视觉)