pytorch模型转caffe模型

qbdj qbdj     2022-12-19     371

关键词:

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

如何将 caffe prototxt 转换为 pytorch 模型?

】如何将caffeprototxt转换为pytorch模型?【英文标题】:Howtoconvertcaffeprototxttopytorchmodel?【发布时间】:2018-05-2107:30:50【问题描述】:到目前为止,我使用的是pytorch-caffe-darknet-convert存储库。在克服了许多问题(concat和eltwise层不可转... 查看详情

pytorch1.0中文官方教程:使用onnx将模型从pytorch传输到caffe2和移动端(代码片段)

译者:冯宝宝在本教程中,我们将介绍如何使用ONNX将PyTorch中定义的模型转换为ONNX格式,然后将其加载到Caffe2中。一旦进入Caffe2,我们就可以运行模型来仔细检查它是否正确导出,然后我们展示了如何使用Caffe2功能(如移动导出... 查看详情

解析caffe框架的prototxt模型文件(代码片段)

...目录前言1.解析示例2.层解析3.完整文件4.caffe模型权重转pytorch模型权重前言  Caffe全称为ConvolutionalArchitectureforFastFeatureEmbedding,是一个应用广泛的开源深度学习框架,在TensorFlow出现之前一直是深度学习领域GitHubstar最多... 查看详情

[pytorch]pytorch保存模型与加载模型(转)(代码片段)

转自:知乎目录:保存模型与加载模型冻结一部分参数,训练另一部分参数采用不同的学习率进行训练1.保存模型与加载简单的保存与加载方法:#保存整个网络torch.save(net,PATH)#保存网络中的参数,速度快,占空间少torch.save(net.state... 查看详情

模型转换pytorch转onnx入门(代码片段)

前言本文主要介绍如何将PyTorch模型转换为ONNX模型,为后面的模型部署做准备。转换后的xxx.onnx模型,进行加载和测试。最后介绍使用Netron,可视化ONNX模型,看一下网络结构;查看使用了那些算子,以便开... 查看详情

我可以在 Pytorch 中使用啥来代替 caffe 重量填充物

】我可以在Pytorch中使用啥来代替caffe重量填充物【英文标题】:WhatcanIuseinPytorchtoremplacecaffe\'sweightfiller我可以在Pytorch中使用什么来代替caffe重量填充物【发布时间】:2021-01-2003:35:58【问题描述】:我正在基于下面的caffe模型编写... 查看详情

swintransformer模型转化:pytorch模型转keras。(代码片段)

SwinTransformer官方模型只有pytorch,没有keras,需要转换才可以用。这篇文章记录一下如何实现模型的转化:新建model.py,插入如下代码:这段代码是SwinTransformer模型的keras实现。importtensorflowastffromtensorflow.kerasimportModel,l... 查看详情

pytorch模型(.pth)转onnx模型(.onnx)(代码片段)

...存储训练好的模型。它使得不同的人工智能框架(如Pytorch,MXNet)可 查看详情

[转]从零开始山寨caffe·贰:主存模型

你左手是内存,右手是显存,内存可以打死显存,显存也可以打死内存。                            ——请协调好你的主存从硬件说起物理之觞大部分Caffe源码解读都喜欢跳过这部分,我不知... 查看详情

ppocrv3模型转pytorch(代码片段)

序言前段时间PaddleOCRv3版本发布,更新了检测和识别模型,性能有很大提升,本着能嫖就嫖的原则,刚出来的第一天就开始嫖上了,虽然新模型的性能相较于之前有较大提升,但是乍一看模型结构复杂了很... 查看详情

[pytorch]pytorch中模型的参数初始化的几种方法(转)(代码片段)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~本文目录1.xavier初始化2.kaiming初始化3.实际使用中看到的初始化3.1ResNeXt,densenet中初始化3.2wide-residual-networks中初始化(MSRinit)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~转载请注明出处:http://www.cnbl 查看详情

tensorflow和pytorch模型之间转换

参考链接:https://github.com/bermanmaxim/jaccardSegment/blob/master/ckpt_to_dd.py一.tensorflow模型转pytorch模型importtensorflowastfimportdeepdishasddimportargparseimportosimportnumpyasnpdeftr(v):#tensorflowweigh 查看详情

pytorch模型保存与加载cpu转gpu(代码片段)

model.eval()的重要性,在2)中最后用到了model.eval(),是因为,只有在执行该命令后,"dropout层"及"batchnormalization层"才会进入evalution模态.而在"训练(training)模态"与"评估(evalution)模态"下,这两层有不同的表现形式.模态... 查看详情

pytorch模型保存与加载cpu转gpu(代码片段)

model.eval()的重要性,在2)中最后用到了model.eval(),是因为,只有在执行该命令后,"dropout层"及"batchnormalization层"才会进入evalution模态.而在"训练(training)模态"与"评估(evalution)模态"下,这两层有不同的表现形式.模态... 查看详情

pytorch自定义数据集模型训练流程(代码片段)

文章目录Pytorch模型自定义数据集训练流程1、任务描述2、导入各种需要用到的包3、分割数据集4、将数据转成pytorch标准的DataLoader输入格式5、导入预训练模型,并修改分类层6、开始模型训练7、利用训好的模型做预测Pytorch模... 查看详情

模型推理谈谈caffe的bn和scale算子(代码片段)

...一聊caffe的bn和scale算子。 caffe中的bn算子和其他框架如pytorch、darknet中的有点区别,故这里拎出来聊一聊,避免大家走坑。前面也写过一篇关于bn的文章,有兴趣的同学可以查阅《【模型推理】从部署 查看详情

caffe的model和prototxt转pytorch的model(代码片段)

#由于系统没有同时安装caffe和pytorch,一个在系统下,一个在conda中,应该是隔离的python环境,一般不能用。#因而只能用numpy当做中间媒介,下面代码是numpy存储的caffe网络,将之转成pytorch#我没有自动化那个prototxt的转换,没没必... 查看详情

pytorch转tensorflow注意

参考技术A最近在作pytorch模型转tensorflow,通过onnx中间转换和容易,但是再转换时有一个注意事项,即如何处理batchpytorch模型转tensorflow:https://www.jianshu.com/p/3e5623696a8e通过onnx手动修改batch为动态值:model_onnx.graph.input[0].type.tensor_typ... 查看详情