tensorflow模型转化为caffe模型并调用预测
本文一共分为三个部分首先根据tensorflow的网络结构代码写caffe的deploy.prototxt,再用python代码写XXXX.caffemodel文档,最后调用caffe模型进行预测.
根据tensorflow的网络结构代码写caffe的deploy.prototxt
写完之后可以将代码输入到这里(工具)检测写法是否正确:
验证工具
书写规则如下,我给的每一种类型的其参数是必须写的参数,如果想知道每一层更详细的参数,可以参考:caffe网络结构详解下载
Name是每一层的名字,top是经过这一层数据传向的层,bottom这一层的上一层数据
(1)输入层Input:
1 |
layer { |
一定要指定shape层,第一个dim为batchsize也就是一次性可以处理多少个数据,第二个dim为channel,如果处理的是图像也就是图片的通道数.如果处理的是向量,这个就是向量的长度,第三个dim为图像的高度,第四个dim为图像的宽度.如果是向量则第三第四都为1.
(2)全连接层InnerProduct
1 |
layer{ |
num_output是下一层向量数目
(3)BatchNorm层
1 |
layer { |
这个参数在测试阶段为true,在训练阶段为false
(4)Scale层
1 |
layer { |
在转换模型的时候,tensorflow的一个 normalization layer相当于caffe的一个连续 batchNorm + Scale:
Convert batch normalization layer in tensorflow to caffe: 1 batchnorm layer in tf is equivalent to a successive of two layer : batchNorm + Scale:
(5)RELU
1 |
layer { |
(6)Eltwise
1 |
layer { |
在残差网络中需要用这个层相加.
用python代码写模型参数文档
(1)读tensorflow的模型
1 |
import tensorflow as tf |
(在tensorflow较高版本中,模型文档三个 分别为xxx.meta xxxx.index xxx.0000-data-0001)
(2)创建caffe网络
1 |
cf_prototxt = "./2dto3d_deploy.prototxt" |
(3)将参数读取写入
全解连接层的w和b
1 |
linear_w=np.squeeze(reader.get_tensor('linear_model/w1')) |
BN层由于tensoflow和caffe有差异
在转化的时候记住caffe的bn+scale层等于tensorflow的bn层次
具体的转化有以下规则:
1 |
net.params[bn_name][0].data[:] = tf_movingmean |
相关的具体讨论可以参考:bn层转化
下面给出bn层转化的一个试例
1 |
bn1_tf_movingmean=np.squeeze(reader.get_tensor('linear_model/batch_normalization/moving_mean')) |
(3)最后写入文档
1 |
net.save('a.caffemodel') |
调用caffe模型预测验证
1 |
import sys |
以上测试数据的正确预测结果为:
{‘linear6’: array([[-1.1093297 , 0.13423912, -0.71337676, -0.3413014 , 0.60594785,
-0.503688 , -0.44055757, 0.61926687, -0.3807128 , 1.1093313 ,
-0.13424 , 0.7133761 , 0.57371044, 0.56901824, -0.12641048,
0.05005788, 0.47413373, 0.14192167, -0.3304365 , -0.7288994 ,
0.4668903 , 0.06698397, -0.6077603 , 0.33841628, 0.02581951,
-0.36136347, -0.09946679, 0.07204475, -0.29733503, 0.13283135,
0.85128194, -1.0867463 , 0.6229229 , 1.1905218 , -3.798849 ,
0.13268307, 1.8069856 , -3.7732291 , -0.5529848 , -0.9289112 ,
-0.9280683 , 0.14142033, -1.392531 , -2.9245243 , -0.55180794,
-1.8918784 , -2.9869053 , -1.0472283 ]], dtype=float32)}
附件下载
最后我给出了一个示例转换的所有文档附件下载地址
其中有如下内容:
(1) linear_model.py 为网络结构的定义文档可以参考这个文档的代码按照规则写出
(2) 2dto3d_deploy.prototxt
(3)checkpoint*文档是tensorflow模型文档
(4)caffe_script.py为写模型参数文档运行之后生产a.caffemodel
(5)predict.py根据2dto3d_deploy.prototxt和a.caffemodel进行预测看结果是否正确已经给出一组测试数据
(6)caffe网络模型深入理解各层详解.pdf
原文链接 大专栏 https://www.dazhuanlan.com/2019/08/19/5d59ba6a9af46/