pytorch模型转caffe模型

Pytorch模型转换Caffe模型踩坑指南,代码使用的是Github上的工程,地址:https://github.com/longcw/pytorch2caffe

操作环境:ubuntu = 14.04
         miniconda 3
         caffe
         pytorch = 0.2.0    torchvision = 0.1.8
         python = 2.7

  

环境配置:
第一步 : 在miniconda创建一个虚拟环境pytorch2caffe : conda create -n pytorch2caffe python=2.7
第二步 : 激活虚拟环境 source activate pytorch2caffe
第三步 : 在该虚拟环境下安装对应版本的pytorch和torchvision : conda install pytorch=0.2.0 torchvision=0.1.8 安装完成后conda list看一看有没有安装成功对应的版本
第四步 : 在该虚拟环境下编译caffe,官网指南链接 : http://caffe.berkeleyvision.org/install_apt.html
第五步 : 编译配置caffe的python接口pycaffe,操作指南链接 : https://www.cnblogs.com/lyyang/p/6573846.html

配置环境的时候因Github上没有关于这个项目的环境介绍,所以我以前用的是习惯的python 3.6和pytorch 0.4.0 ,而这个项目是用python 2.7写的,所以在创建虚拟环境的时候使用python 2.7的环境,要不然之后也会有很多问题,pytorch和torchvision版本很重要。

博主调代码时老是遇到:KeyError: ‘ExpandBackward’这个错误,在改变pytorch和torchvision版本后这个问题解决了,这个Github的项目比较久了,并不支持新版本的Pytorch,这就是我在配置操作环境下帮大家踩得坑啦。

在转换自己的模型之前,先调通项目中的demo,验证配置环境已经配置成功。项目中的demo是转换Google的inception-v3模型,我们根据终端里提示的模型地址将模型下载到本地,然后将模型载入进行转换。转换成功之后在项目的demo文件夹中生成model.prototxt与model.caffemodel两个新文件。测试的话将demo中设置test_mod = True,给定同样的随机输入数据,测试两个模型得出的结果。
遇到的问题:

caffe支持的卷积和池化层操作都是2D的,我的这个模型所做的卷积和池化操作都是1D的,当时找这个问题也花了很久的时间,没想到caffe只支持2D的操作。我将原来的input_size=(1, 1, 1024)修改成了(1, 1, 1, 1024),然后做相应的2D卷积和池化操作。

我还遇到过的一个Import问题是:Segmentation fault (core dumped)这个问题的原因我不是很清楚,我在查看是哪个inport出问题时发现import caffe在import torch之后是并不会报这个错误,但是import torch之后再import caffe就会报这个错误。

在调试代码时遇到过这个问题:ValueError: could not broadcast input array from shape (3,128) into shape (3,512),这个问题和caffe的源码有关,需要在caffe的proto文件中修改pooling层的参数optional bool ceil_mode = 13 [default = true],而因为caffe版本的原因,我的caffe并没有这个参数,所以要往现在caffe的源码pooling层中将ceil_mode相关参数和代码添加进去,然后重新编译caffe与pycaffe。

1、在pooling_layer.hpp中往PoolingLayer类中添加ceil_mode_这个参数:
    int height_, width_;
    int pooled_height_, pooled_width_;
    bool global_pooling_;
    bool ceil_mode_;   //添加的类成员变量
    Blob<Dtype> rand_idx_;
    Blob<int> max_idx_;

2、修改pooling_layer.cpp文件中相关参数,主要涉及到LayerSetUp函数和Reshape函数。

LayerSetUp函数修改如下:
|| (!pool_param.has_stride_h() && !pool_param.has_stride_w()))
    << "Stride is stride OR stride_h and stride_w are required.";
global_pooling_ = pool_param.global_pooling();
     ceil_mode_ = pool_param.ceil_mode();    //添加的代码,主要作用是从参数文件中获取ceil_mode_的参数数值。

Reshape函数修改如下:
if (global_pooling_) {
  kernel_h_ = bottom[0]->height();
  kernel_w_ = bottom[0]->width();

 //删除下面四行代码--------------------------------
 pooled_height_ = static_cast<int>(ceil(static_cast<float>(
 height_ + 2 * pad_h_ - kernel_h_) / stride_h_)) + 1;
 pooled_width_ = static_cast<int>(ceil(static_cast<float>(
 width_ + 2 * pad_w_ - kernel_w_) / stride_w_)) + 1;
 // Specify the structure by ceil or floor mode

  // 添加下面的代码------------------------
   if (ceil_mode_) {
 pooled_height_ = static_cast<int>(ceil(static_cast<float>(
     height_ + 2 * pad_h_ - kernel_h_) / stride_h_)) + 1;
 pooled_width_ = static_cast<int>(ceil(static_cast<float>(
     width_ + 2 * pad_w_ - kernel_w_) / stride_w_)) + 1;
   } else {
 pooled_height_ = static_cast<int>(floor(static_cast<float>(
     height_ + 2 * pad_h_ - kernel_h_) / stride_h_)) + 1;
 pooled_width_ = static_cast<int>(floor(static_cast<float>(
     width_ + 2 * pad_w_ - kernel_w_) / stride_w_)) + 1;
   }    

3、修改caffe.proto文件中PoolingParameter的定义:
// Specify floor/ceil mode
optional bool ceil_mode = 13 [default = true];

4、重新编译caffe与pycaffe

  

原文:https://blog.csdn.net/weixin_38501242/article/details/82624071

原文地址:https://www.cnblogs.com/qbdj/p/11024587.html

时间: 2024-11-06 16:59:01

pytorch模型转caffe模型的相关文章

布局模型 之 层模型(position的relative、absolute与fixed区别?)

css的布局模型分为流动模型(Flow).浮动模型(Float).层模型(Layer). 浮动模型(Float)和层模型(Layer)有什么显著区别?     浮动模型(Float):浮动是让某元素脱离文档流的限制,在浮动框之前和之后的非定位元素会当它不存在一样,可能沿着它的另一侧垂直流动:浮动的元素仍然会占据文档流的物理空间.关于浮动模型的详细说明请看另一篇文章的介绍.http://ycgit.blog.51cto.com/8590215/1958452 层模型(Layer):设置为层模型的元

机器学习之判别式模型和生成式模型

判别式模型(Discriminative Model)是直接对条件概率p(y|x;θ)建模.常见的判别式模型有 线性回归模型.线性判别分析.支持向量机SVM.神经网络等. 生成式模型(Generative Model)则会对x和y的联合分布p(x,y)建模,然后通过贝叶斯公式来求得p(yi|x),然后选取使得p(yi|x)最大的yi,即: 常见的生成式模型有 隐马尔可夫模型HMM.朴素贝叶斯模型.高斯混合模型GMM.LDA.高斯.混合多项式.专家的混合物.马尔可夫的随机场 更多更详细的内容参见 

生成模型和判别模型(转)

引入 监督学习的任务就是学习一个模型(或者得到一个目标函数),应用这一模型,对给定的输入预测相应的输出.这一模型的一般形式为一个决策函数Y=f(X),或者条件概率分布P(Y|X).监督学习方法又可以分为生成方法(generative approach)和判别方法(discriminative approach).所学到的模型分别为生成模型(generative model)和判别模型(discriminative model). 决策函数和条件概率分布 决策函数Y=f(X) 决策函数Y=f(X)

生成模型和判别模型

对于输入x,类别标签Y: 判别模型:由数据直接学习决策面Y=f(x)或条件概率P(Y|x)作为预测模型 生成模型:由数据学习联合概率分布P(x,Y),然后求出条件概率P(Y|x)作为预测模型 模型区别: 判别模型寻找不同类别之间的分离面,反映不同类别之间的差异. 生成模型通过统计反映同类数据的相似度. 模型的优点和缺点: 判别模型主要缺点: 1,不能反映数据本身的特征 判别模型主要优点: 1,模型简单,容易学习. 2,分类性能好,分类边界灵活. 生成模型的主要缺点: 1,模型复杂 生成模型主要优

计算机网络原理和OSI模型与TCP模型

计算机网络原理和OSI模型与TCP模型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.计算机网络的概述 1.计算机网络的定义 计算机网络是一组自治计算机的互连的集合 2.计算机网络的基本功能 a.资源共享 b.分布式处理与负载均衡 c.综合信息服务 3.计算机网络的演进 4.按照地域范围 a>.LAN(Local Area Network) 通常指几千米以内的,可以通过某种介质互联的计算机.打印机.modem或其他设备的集合 MAN(Metropolitan Area N

TP框架---Model模型层---做模型对象

TP框架----Model模型层---------------做模型对象 Model模型层是用来做什么的呢???? 主要是用来做操作数据库访问的. 也就说明TP框架自带了一种访问数据库的方式,使用的是Model模型. Model模型怎样使用呢??? 要使用Model模型层访问数据库的话,需要做配置,因为必须把数据库的一些参数配置好之后,才能连接,所以找到Config.php 配置文件,打开 这些是关于数据库的配置, 要把这些粘贴到config.php 进行修改. config.php配置文件(修

&nbsp; Css中的盒模型及盒模型宽度计算

CSS假定所有的HTML文档元素都生成了一个描述该元素在HTML文档布局中所占空间的矩形元素(element box),可以形象地将其看作是一个盒子.CSS围绕这些盒子产生了一种"盒子模型"概念. 盒模型,实际上就是把某些标签元素看成为一个箱子.箱子与其他箱子之间的距离,是箱子的最外围,它不是一条边线而是添加在边框外面的空间.这个外边距使元素盒子之间不必紧凑地连接在一起,是CSS布局的一个重要手段.用margin(外边距)属性来表示,margin-top,margin-right,ma

CSS框模型(框模型概述、内边距、边框、外边距、外边距合并)

CSS 框模型概述 CSS 框模型 (Box Model) 规定了元素框处理元素内容.内边距.边框 和 外边距 的方式. 元素框的最内部分是实际的内容,直接包围内容的是内边距.内边距呈现了元素的背景.内边距的边缘是边框.边框以外是外边距,外边距默认是透明的,因此不会遮挡其后的任何元素. 内边距.边框和外边距都是可选的,默认值是零.但是,许多元素将由用户代理样式表设置外边距和内边距.可以通过将元素的 margin 和 padding 设置为零来覆盖这些浏览器样式.这可以分别进行,也可以使用通用选择

失血模型,充血模型

一.失血模型 失血模型简单来说,就是domain object只有属性的getter/setter方法的纯数据类. 简单来说,就是domain ojbect包含了不依赖于持久化的领域逻辑,而那些依赖持久化的领域逻辑被分离到Service层. Service(业务逻辑,事务封装) --> DAO ---> domain object 这种模型的优点: 1.各层单向依赖,结构清楚,易于实现和维护 2.设计简单易行,底层模型非常稳定 这种模型的缺点: 1.domain object的部分比较紧密依赖