将tensorflow的ckpt模型转化为pb模型

标签:tensorflow
作者:炼己者


本博客所有内容以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,并且是非商业用途,谢谢!


1.摘要

为什么好好的ckpt模型我要把它转为pb模型呢?因为我打算把python版本的代码转化为c++版本,最好的方法就是把python训练好的模型直接移植过去。但是ckpt模型不能用,所以我要想办法把训练好的ckpt模型转化为pb模型,然后再用c++调用这个模型。

2.ckpt转化为pb

我们用tensorflow训练模型,一般是用tf.train.Saver()保存模型,然后得到多个文件,一般长这个样子

这四个文件主要是记录了神经网络的网络结构以及这个结构中涉及到的权重参数等内容。

具体怎么转呢?详细代码看ckpt转化为pb
点进去之后,直接clone即可。然后可以得到以下文件

checkpoints里面装着模型文件,点进去会发现里面有一个textcnn文件夹,这里面装着ckpt模型的四个文件。通过convert_ckpt_to_pb.py可以得到pb模型文件,这个文件也保存在checkpoints文件夹中,是frozen_model.pb。

def freeze_graph(input_checkpoint,output_graph):
    '''
    :param input_checkpoint:
    :param output_graph: PB模型保存路径
    :return:
    '''
    # 指定输出的节点名称,该节点名称必须是原模型中存在的节点
    # 直接用最后输出的节点,可以在tensorboard中查找到,tensorboard只能在linux中使用
    output_node_names = "score/output"
    saver = tf.train.import_meta_graph(input_checkpoint + '.meta', clear_devices=True)
    graph = tf.get_default_graph() # 获得默认的图
    input_graph_def = graph.as_graph_def()  # 返回一个序列化的图代表当前的图
 
    with tf.Session() as sess:
        saver.restore(sess, input_checkpoint) #恢复图并得到数据
        output_graph_def = graph_util.convert_variables_to_constants(  # 模型持久化,将变量值固定
            sess=sess,
            input_graph_def=input_graph_def,# 等于:sess.graph_def
            output_node_names=output_node_names.split(","))# 如果有多个输出节点,以逗号隔开
 
        with tf.gfile.GFile(output_graph, "wb") as f: #保存模型
            f.write(output_graph_def.SerializeToString()) #序列化输出
        print("%d ops in the final graph." % len(output_graph_def.node)) #得到当前图有几个操作节点

代码很简单,里面你唯一要改动的就是output_node_names,指定的最后一层输出节点名称,这个是你自己设定的。怎么找到它呢?首先你要去查看你的代码,
下面的代码是我自己定义的,你可以点击 训练ckpt模型,clone到本地,然后你会找到cnn_model.py这个文件,这里面就是定义着我的cnn模型

        with tf.name_scope("score"):
            # 全连接层,后面接dropout以及relu激活
            fc = tf.layers.dense(gmp, self.config.hidden_dim, name='fc1')
            fc = tf.contrib.layers.dropout(fc, self.keep_prob)
            fc = tf.nn.relu(fc)

            # 分类器
            self.logits = tf.layers.dense(fc, self.config.num_classes, name='fc2')
            self.y_pred_cls = tf.argmax(tf.nn.softmax(self.logits), 1,name='output')  # 预测类别

我一开始也没明白,然后翻阅大量资料才发现的,这个要自己改动,记得是最后输出的那层,你要自己把这个节点命名出来。另外怎么才能确定你得图结构里有这个节点呢?去查看tensorboard。不知道为啥在windows下得到的tensorboard查看不了,得到的是乱码文件。在linux下就不会,所以我把代码放到linux环境下跑,就可以得到tensoboard了。现在要跑的这个代码是指你自己训练ckpt模型的代码,如果你的tensorboard可以查看,那么就不用重新到linux环境下跑了。

查看tensorboard

tensorboard --logdir = “保存tensorboard的绝对路径”

敲入上面的命令,然后就可以得到一个网址,把这个网址复制到浏览器上打开,就可以得到图的结构,然后你点开看看,有没有output这个节点,也可以顺便看一下你自己的网络图
查看tensorboard的方法可以看这篇博客,TensorBoard:计算图的查看

有的话,把节点写入output_node_names,改这一个就行了。
改好之后,运行这个文件,便可以得到pb模型了。

3.pb模型文件测试数据

然后怎么用pb模型像ckpt模型那样来测试呢?c++版本的我还没开始做,但是Python版本的可以跑通测试了。这意味着我离c++跑通更进一步了。
这个具体去看pb_test.py文件,里面有很完整的注释。网上很多都是针对图像的资料,我这里是针对的文本的,相信对大家会有所帮助!
另外注意tensorflow是一个batch一个batch的逐批次输入,一次性输入的话会报内存错误!

4.总结

这两份代码大家可以对着看,很相似,理解怎么训练出来的ckpt模型,又是怎么把ckpt模型转化为pb模型的,怎么用pb模型去测试数据,代码很好理解的。有不懂的欢迎在博客下面评论提问,我们一起交流解决
等后期我用c++调用pb模型成功后,再来和大家分享!!!

以下是我所有文章的目录,大家如果感兴趣,也可以前往查看
👉戳右边:打开它,也许会看到很多对你有帮助的文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容