caffe增加新的layer

---恢复内容开始---

在caffe中如果想要增加新的功能层,必须要自己在caffe的安装目录下(source code)中增加相应的文件

大体步骤如下:

  1. 在caffe/src/caffe/proto/caffe.proto中增加对应layer的parameter message,  有两部分,现在LayerParameter中注册新层名字,注意选取不重复的ID, 然后写上新层的message传递的参数
  2. 在caffe/include/caffe/layers/中添加相应的新层的hpp文件,看其他层的实现,仿照着写
  3. 在caffe/src/caffe/layers/增加相应的.cpp和.cu的文件,进行类的实现, 在文件的末尾仿照着写个注册的语句REGISTE....
  4. 在caffe/src/caffe/gtest中增加新层的测试代码,这样可以保证所添加的层是正确的,不会在之后的运行中报错

参考教程: https://blog.csdn.net/tangwei2014/article/details/46815231

https://www.cnblogs.com/denny402/p/5071126.html

tensorflow ckpt转 caffemodel遇到的坑

龙明盛老师的论文基本都是caffe   可以看他是怎么实现的一些层

一个别人实现的新层例子:

https://github.com/luoyetx/OrdinalRegression

具体实现:

  1. 在newlayer.hpp中常定义一些常量或者变量,用来在前传中存储中间计算结果,因为如果定义在forward计算过程中,那么反传时还要重复计算,所以定义在hpp文件中比较合适
  2. 在newlayer.cpp中,主要有三个功能需要实现: 
    1. LayerSetUp: 主要是做一些CHECK工作,然后根据bottom和top对类中的数据成员初始化    注意一般都是继承基类,如果基类实现了就不要再实现了
    2. Forward_cpu: 前传
    3. backward_cpu: 反传,计算梯度  
  3. 在newlayer.cu中,实现GPU下的前传和反传
  4. 测试代码
  5. 重新编译, make all      make test    make runtest

一些基础知识:

  1. Blob 是一个模板类,相当于是个结构体,主要的成员变量有 data_, diff_, shape_, count_, capacity_,   成员函数主要有Reshape, ReshapeLike, SharedData, Updata

    1. 参考:https://blog.csdn.net/seven_first/article/details/47398613
    2. https://www.jianshu.com/p/59e77efcce83
  2. Layer:  卷积层
    1. 参考: https://blog.csdn.net/xizero00/article/details/51049858
    2. 官网api查找:  https://caffe.berkeleyvision.org/doxygen/namespacecaffe.html

Kevin 老师帮忙整理的资料

1.  bottom是个blob指针的数组,bottom[0]第一个输入的指针, bottom[1]第二个输入指针, top[0]第一个输出指针

LayerSetUp函数中:

int bottom_batch_size_ = bottom[0]->num();
int bottom_channels_ = bottom[0]->channels();
int bottom_height_ = bottom[0]->height();
int bottom_width_ = bottom[0]->width();

注意,对于指针取数据用->  对于单纯blob取数据 用 .

blob<Dtype>*  表示指向blob的指针,其中blob的数据类型是Dtype

但是如果要取blob对应的数据地址要用 ->cpu_data()  这个类似于取数据的地址操作

Forward_cpu函数中:

Dtype* top_data = top[0]->mutable_cpu_data();  //mutable_cpu_data()表示top[0]数据可修改

const Dtype* bottom_data = bottom[0]->cpu_data();   //-> cpu_data()表示只可读

caffe自带的数学函数 https://blog.csdn.net/seven_first/article/details/47378697

2.  shape操作

vector<int> top_shape = bottom[0]->shape();
top[0]->Reshape(top_shape);

如果top[0]的channel是bottom[0]的channel+bottom[1]的channel,其他的都一样,可以这样定义:
vector<int> top_shape = bottom[0]->shape();
top_shape[1] = bottom[0]->shape(1)+bottom[0]->shape(1);
top[0]->Reshape(top_shape);

如果这个变量是一个中间变量的话,可以这样定义:
Blob<Dtype> conf_permute_; //一般写在.hpp里
然后在.cpp中的LayerSetUp或者Reshape中定义 conf_permute_.ReshapeLike(*(bottom[1]));

注意成员函数的参数都是类型的,比如是blob指针,就可以直接输bottom[0], 如果要求参数是blob,

如果有取地址符,那么只需要传入实体,这样也能修改内容

如果是指针的话是 *的形式

3. 关于count

const int count = bottom[0]->count();表示 count = bottom[0]的num * channel * height * width
const int count = bottom[0]->count(0, 1); 表示 count = bottom[0]的num * channel
const int count = bottom[0]->count(0, 2); 表示 count = bottom[0]的num * channel* height
const int count = bottom[0]->count(1); 表示 count = bottom[0]的 channel * height * width
const int count = bottom[0]->count(2); 表示 count = bottom[0]的 height * width

const int num = bottom[0]->shape(0); //bottom[0]的batch_size
const int channel = bottom[0]->shape(1); //bottom[0]的channel
const int height = bottom[0]->shape(2); //bottom[0]的height
const int width = bottom[0]->shape(3); //bottom[0]的width

3.printf:
const int count = bottom[0]->count();
printf("count %d\n", count);

4.gdb Debug调试:
https://zhuanlan.zhihu.com/p/28146796

原文地址:https://www.cnblogs.com/lainey/p/9026381.html

时间: 2024-09-29 10:18:45

caffe增加新的layer的相关文章

Caffe中增加新的layer以及Caffe中triplet loss layer的实现

关于Tripletloss的原理,目标函数和梯度推导在上一篇博客中已经讲过了,具体见:Tripletloss原理以及梯度推导,这篇博文主要是讲caffe下实现Tripletloss,编程菜鸟,如果有写的不优化的地方,欢迎指出. 尊重原创,转载请注明:http://blog.csdn.net/tangwei2014 1.如何在caffe中增加新的layer 新版的caffe中增加新的layer,变得轻松多了,概括说来,分四步: 1)在./src/caffe/proto/caffe.proto 中增

如何给caffe添加新的layer ?

如何给caffe添加新的layer ? 初学caffe难免会遇到这个问题,网上搜来一段看似经典的话, 但是问题来了,貌似新版的caffe并没有上面提到的vision_layer:

如何在caffe中增加layer以及caffe中triple loss layer的实现

关于triplet loss的原理,目标函数和梯度推导在上一篇博客中已经讲过了,具体见:triplet loss原理以及梯度推导,这篇博文主要是讲caffe下实现triplet loss,编程菜鸟,如果有写的不优化的地方,欢迎指出. 1.如何在caffe中增加新的layer 新版的caffe中增加新的layer,变得轻松多了,概括说来,分四步: 1)在./src/caffe/proto/caffe.proto 中增加 对应layer的paramter message: 2)在./include/

如何在caffe中添加新的Layer

如何在caffe中添加新的Layer 本文分为两部分,先写一个入门的教程,然后再给出自己添加maxout与NIN的layer的方法 (一) 其实在Github上已经有答案了(https://github.com/BVLC/caffe/issues/684) Here's roughly the process I follow. Add a class declaration for your layer to the appropriate one of common_layers.hpp, 

SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-010-Introduction为类增加新方法

一. 1.Introduction的作用是给类动态的增加方法 When Spring discovers a bean annotated with @Aspect , it will automatically create a proxy that delegates calls to either the proxied bean or to the introduction implementation, depending on whether the method called be

(笔记)Mysql命令grant on:增加新用户并控制其权限

grant on命令用于增加新用户并控制其权限. grant on命令格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码”; 1) 增加一个用户test1,密码为abc,让他可以在任何主机上登录,并对所有数据库有查询.插入.修改.删除的权限.首先用root用户连入MYSQL,然后键入以下命令:    grant select,insert,update,delete on *.* to [[email protected]”%][emai

给zencart产品增加新字段

经常遇到一些产品具有很丰富的信息,可zencart后台添加产品的时候,就只有那么几个字段.例如产品model,产品库存等等. 想给某个产品定制一个像magento一样的短描述功能,或者想显示该产品在亚马逊上的链接. 这个方法就派上用场了. 我这里讲的就是如何给产品添加一个product_color字段. 1,先去phpmyadmin,找到你网站的数据库,然后找到products表,给该表添加一个product_color字段,不会用sql语句的可手动添加. 2,编辑文件admin/include

ECSHOP 商品字段增加新字段的方法

结合ecshop后台“商品编辑”.“商品录入”来谈谈如何给ecshop商品增加一个新字段,假设我们将这个新字段命名为 new_add 1.首先要修改数据表结构,给表 ecs_goods 增加新字段:new_add, 进入ECSHOP后台 >数据库管理 >SQL查询,输入下面SQL语句,提交.注意如果你的数据表前缀不是ecs_ 请自行修改之 alter table ecs_goods add column new_add varchar(64); 2.在ecshop后台的admin\templa

C#WinForm 用textbox与button控件,向xml文件中增加新的数据

1 旧的xml 1 <?xml version="1.0" encoding="utf-8"?> 2 <datas> 3 <XianJia> 4 <ShengHao>女娲娘娘</ShengHao> 5 <Password>nwnn</Password> 6 </XianJia> 7 <XianJia> 8 <ShengHao>后土娘娘</Sh