经过一段时间,笔者又回来了!
从2017年7月开始,笔者结束了研一繁重的考试月任务(因为平常不常上课,突击考试大家懂的),然后就进入了研二生涯。在七八月笔者就开始了自己的课题实验(由于太忙累坏了身体,先是眼睛不太好,然后又犯了胃病被迫去做胃镜,在此深切提醒各位,工作的时候不能太拼,身体很重要)。研二生涯笔者在实验室又要做学术又要兼顾项目,因此相当繁忙。但是笔者向大家做下承诺,一定不放弃博客的更新,笔者会在第一时间将自己的实验经验与小技巧科普给大家。
废话少说,下面开启正题!
还记得我们的上一篇博客吗?讲述了caffemodel到底记录了什么,那么,笔者带领大家回顾一下我们目前做的是什么工程:目前是将一个模型在tensorflow下面训练,然后转换到caffe框架上执行,这样,模型就可以在嵌入式平台上面运作了(nvidia TX2,nvidia TK1等)。我们在tensorflow2caffe(1)中,已经讲述了如何搞清楚caffemodel里面记录了什么,也就弄明白了我们的数据转换目标。那么,待转换的数据从哪里来呢?从tensorflow中来对吧。那么,针对tensoeflow训练所得的结果,我们来看一下我们得到了什么:
从上图中,我们看到,tensorflow框架训练得到的结果里面,首先有一个checkpoint,这是一个训练结果的索引,从这个里面,我们可以看到我们保存了哪些模型?(对应保存模型的程序在tensorflow的训练程序中,笔者就比较爱使用tf.Train.Saver.save接口存储模型参数),ckeckpoint文件可以被打开,我们可以看看里面记录了什么。
大家可以看到,里面记录的是这个我们在训练不同阶段保存的模型。首先大家要记住,这是一个很有用的文件。
然后,在图1中,我们发现了还有其他类型的文件,首先有一个.meta文件,了解tensorflow的同学知道,这是一个记录Graph的文件,在tensorflow中,Graph记录了所有数据的流向,规定了整个模型的结构。然后有一种data-00000-of-00001结构的文件,这个文件比较大(往往几十上百M),这个文件是记录了我们训练得到的数据,是以压缩性形式存储的。还有一个index类型的文件,这个文件是做什么的?这个文件记录了数据的index,就是需要提取参数的时候,在meta文件中找到了参数名,然后通过这个index,再从训练数据文件中提取数据具体的值。还有一个events文件,记录了一些其他日志。
那么,到这里,我们就明白了如何去提取出tensorflow的训练参数。
(1)载入数据流图
(2)通过checkpoint找到目前最新的训练保存结果
(3)提取训练得到的所有参数
具体代码如下:
-
#!/usr/bin/python
-
-
import tensorflow
as tf
-
import numpy
as np
-
-
with tf.Session()
as sess:
-
new_saver = tf.train.import_meta_graph(
'model.ckpt-189200.meta')
#load graph
-
for var
in tf.trainable_variables():
#get the param names
-
print var.name
#print parameters' names
-
new_saver.restore(sess, tf.train.latest_checkpoint(
'./'))
#find the newest training result
-
all_vars = tf.trainable_variables()
-
for v
in all_vars:
-
v_4d = np.array(sess.run(v))
#get the real parameters
在上面的代码中,tf.train.import_meta_graph导入了训练数据流图,tf,train.latest_checkpoint找到了最新的训练数据,还打印了参数名字,并且最后使用sess.run(v)得到了各个参数。
我们运行一下代码,大家可以看到,参数名称源源不断地打印出来。
在我们找到参数之后,下面,我们就要把tensorflow框架格式规定的参数转化为caffe框架规定格式规范的参数,具体该怎么做,且听下回分解。
欢迎阅读笔者后续博客,各位读者朋友的支持与鼓励是我最大的动力!
written by jiong
岂能尽如人意,但求无愧于心