前言

原始的【caffe-Windows】是没有LSTM层的,维护以后的caffe的windows版本也懒得配置了,因为大部分文章的代码还是基于老版caffe。其实大部分的添加层方法都可以参考本博客,仅限Windows。

需要的文件有:

1. 原始的caffe-Windows:这个第一个博客有写网盘地址,戳这里或者

caffe-windows官方:https://github.com/BVLC/caffe/tree/windows

caffe-windows旧网盘:链接:http://pan.baidu.com/s/1bPZHoi 密码:gzc0

2. 具有LSTM对应代码文件的caffe版本,此处我们使用caffe的Linux版本

caffe-linux官方:https://github.com/BVLC/caffe

caffe-linux网盘:链接:http://pan.baidu.com/s/1eR8W9Lw 密码:c7hv

【注】官网新版的caffe编译方法变了,但是如果依旧按照VS的配置方法,可能和老版的并没有什么区别,这里的原始caffe-Windows也可以直接去官网下载。

在进行第一步之前,请确保已按照博客配置好了caffe的无GPU版本。且本博客是添加新层,而非对caffe添加新工程。下面的参考博客介绍的是一个自定义的层的添加方法,主要还是在此基础上研究如何添加LSTM的,道理基本一样

参考博客:http://blog.csdn.net/u014565333/article/details/54017025

一定一定要注意proto中新添加的ID不要重复,否则会出现问题,切记切记

第一步

检查一下检查一下Linux中的caffe和Windows中的caffe有什么区别,主要核对一下两类文件夹:

1. E:\caffe-linux\caffe-master\include\caffe\layers与E:\CaffeDev\caffe-master\include\caffe\layers的对比

2. E:\caffe-linux\caffe-master\src\caffe\layers与E:\CaffeDev\caffe-master\src\caffe\layers的对比

这里我主要发现了windows下的caffe缺少了以下文件:

在include文件中缺少:lstm_layer.hpp、parameter_layer.hpp、recurrent_layer.hpp、rnn_layer.hpp

在src文件中缺少:lstm_layer.cpp、lstm_unit_layer.cpp、parameter_layer.cpp、recurrent_layer.cpp、rnn_layer.cpp

可以先把这些文件全部都拷贝到caffe-windows的对应位置,即1和2分别的layers文件夹内部

每一层的意义Google或者在caffe的官网的namespace目录都有介绍。

第二步

2.1 添加parameter_layer层

此层作用:add parameter layer for learning any bottom

(1)先添加头文件libcaffe->include->layers->添加->现有项

添加第一步拷贝到E:\CaffeDev\caffe-master\include\caffe\layers中的parameter_layer.hpp

(2)再添加提供实现的源文件libcaffe->src->layers->添加->现有项

添加第一步拷贝到E:\CaffeDev\caffe-master\src\caffe\layers中的parameter_layer.cpp

(3)尝试编译一下cpp

会出现类似这样的错误

主要原因就在于我们常听到的prototxt的用户接口,它与第三方包protobuf有关,简单的说这个工具就是一个序列化和反序列化工具,具体可以搜索这两个词。在caffe中,这个接口一般需要在E:\CaffeDev\caffe-master\src\caffe\proto\caffe.proto中声明,名称与每一个实现的cpp的末尾所注册的名字相同

★★★★此处为自己实现cpp所需要注意的一个细节,一定要添加注册★★★★

INSTANTIATE_CLASS(ParameterLayer);
REGISTER_LAYER_CLASS(Parameter);

知道了错误原因,那么就在caffe.proto中添加对应的描述。

说一下题外话,因为我还没尝试自己写层添加,所以调试的时候,参考的就是Linux下的caffe.proto的写法,MATLAB中有一个对比工具叫做 “比较”,比如我在学习如何加层的时候就是这样折腾的

闲话不多说,继续添加caffe.proto对应的东西:

在382行下面添加一个ID,注意此ID与内部的其它ID不能重复

optional ParameterParameter parameter_param = 145; 

【注】这里的行可以随便选定,但是一定要注意在message LayerParameter 的内部,与后面的两个message V1LayerParameter 、message V0LayerParameter 区分开来,听说后两个部分已经弃用了。
以后凡是见到下面这句话

this->layer_param_.parameter_param().

★★ ★★ 它后面所指向的参数也需要在caffe.proto中指定出来,此为caffe自定义层的第二个注意事项 ★★ ★★

指定的方法是将下面这句话添加到caffe.proto的第873行以后

message ParameterParameter {optional BlobShape shape = 1;
}

(4)接下来的是一个是容易忽视的细节:当ID和参数都添加到caffe.proto以后,需要对libcaffe重新生成一次,而非直接对着cpp右键编译。可能这一步与E:\CaffeDev\caffe-master\windows\scripts下的ProtoCompile.cmd有关

如果弹出一个窗口XXX已在外部改动什么的,点击全是就好。

最后重新右键编译一次parameter_layer.cpp,就会无错误直接通过。

2.2添加LSTM层

(1)添加头文件lstm_layer.hpp、recurrent_layer.hpp、rnn_layer.hpp到libcaffe->include->layers->添加->现有项

(2)添加源文件lstm_layer.cpp、lstm_unit_layer.cpp、recurrent_layer.cpp、rnn_layer.cpp到libcaffe->src->layers->添加->现有项

观察注册部分

lstm_layer层的注册

INSTANTIATE_CLASS(LSTMLayer);
REGISTER_LAYER_CLASS(LSTM);

lstm_unit_layer层的注册

INSTANTIATE_CLASS(LSTMUnitLayer);
REGISTER_LAYER_CLASS(LSTMUnit);

rnn_layer层的注册

INSTANTIATE_CLASS(RNNLayer);
REGISTER_LAYER_CLASS(RNN);

注意一下这几层的结构区别

此两图显示了caffe的每一层即caffe::layer的组成情况,可以发现LSTMUnitLayer是单独成一层的。

(3)编译尝试一下。

发现lstm_unit_layer.cpp无需添加到caffe.proto中便可直接编译成功,但是其使用方法还有待斟酌,因为没有添加到caffe.proto中,那么使用是如何序列化的呢?以后学习。

先解决当下问题,其它的层都无法直接编译成功,那么就得添加到caffe.proto中了。

在caffe.proto的387行添加对应recurrent层的ID(因为它是由LSTM和RNN层组成的,因而给一个ID即可,在参数中进行区分)

optional RecurrentParameter recurrent_param = 146;  

(4)添加对应参数描述

// Message that stores parameters used by RecurrentLayer
message RecurrentParameter {// The dimension of the output (and usually hidden state) representation --// must be explicitly set to non-zero.optional uint32 num_output = 1 [default = 0];optional FillerParameter weight_filler = 2; // The filler for the weightoptional FillerParameter bias_filler = 3; // The filler for the bias// Whether to enable displaying debug_info in the unrolled recurrent net.optional bool debug_info = 4 [default = false];// Whether to add as additional inputs (bottoms) the initial hidden state// blobs, and add as additional outputs (tops) the final timestep hidden state// blobs.  The number of additional bottom/top blobs required depends on the// recurrent architecture -- e.g., 1 for RNNs, 2 for LSTMs.optional bool expose_hidden = 5 [default = false];
}

最后一行注释解释了RNN和LSTM的代号。具体使用方法后续学习到了再写入博客。

(5)添加完毕ID和参数描述,不要忽略了对libcaffe重新生成一次,然后尝试对lstm_layer.cpp、recurrent_layer.cpp、rnn_layer.cpp重新编译试试。

第三步

关于如何搭建一个LSTM网络,本文就不介绍了,在下面这个博客中有三个实例,有兴趣可以配置一下试试

(Caffe)LSTM层分析:http://blog.csdn.net/mounty_fsc/article/details/53114698

当然在后面的博客还是需要继续探索LSTM的使用的,下一篇博客将介绍如何配置caffe-recurrent训练coco数据集。

【注】一定要细心做每一步,因为每一步都可能导致各种错误,不然这个十分钟不到就能配置好的东东怎么会折腾我一天呢。如果需要自己手写层,添加方法与本文一样,但是一定要注意先分析自带的代码,比如parameter_layer.h和其实现就很简单,关键在于写法结构。

最后:细节决定成败,耐心成就未来

【caffe-Windows】新层添加——LSTM相关推荐

  1. Android P HAL层添加HIDL实例(详细实现步骤)

    Android P HAL层添加HIDL实例 本文是参照 https://www.jianshu.com/p/b80865c61d8e 教程介绍实现,原理请参考原作者. 本文将介绍如何在P OS上添加 ...

  2. caffe网络模型各层详解(中文版)

    caffe网络模型各层详解(中文版) 参考网址:https://blog.csdn.net/qq_34220460/article/details/79872830 一.数据层及参数 要运行caffe ...

  3. Caffe Windows版本的编译

    2019独角兽企业重金招聘Python工程师标准>>> 1:Caffe的主版本只支持Linux,所以要下载专门的Caffe Windows版本,网址为 https://github. ...

  4. 在Windows中将目录添加到PATH环境变量

    本文翻译自:Adding directory to PATH Environment Variable in Windows I am trying to add C:\\xampp\\php to ...

  5. caffe中各层的作用

    caffe中各层的作用: 关于caffe中的solver: cafffe中的sover的方法都有: Stochastic Gradient Descent (type: "SGD" ...

  6. sql server父节点_将新节点添加到现有SQL Server Always On可用性组中

    sql server父节点 This is the 5th article in the series of a comprehensive guide to SQL Server Always On ...

  7. 无线打印服务器怎么安装,【DDwifi打印服务器】Windows 7系统添加打印机步骤(离线安装打印机驱动)...

    [DDwifi打印服务器]Windows 7系统添加打印机步骤(离线安装打印机驱动) 时间:2020-06-15 04:29:05 / 来源:你好多多DIY / 作者:多多 [DDwifi打印服务器] ...

  8. Windows用户层技术工具与源码分享

    Windows用户层技术工具与源码分享 文章目录 Windows用户层技术工具与源码分享 一.注入与隐藏 1.窗口界面介绍 2.远程线程注入 3.APC注入 4.突破SESSION0隔离的远程注入 5 ...

  9. 无线打印机服务器安装步骤,【DDwifi打印服务器】Windows 10系统添加打印机步骤(离线安装打印机驱动)...

    [DDwifi打印服务器]Windows 10系统添加打印机步骤(离线安装打印机驱动) 时间:2020-06-15 04:31:43 / 来源:你好多多DIY / 作者:多多 [DDwifi打印服务器 ...

最新文章

  1. 理解 angular2 基础概念和结构 ----angular2系列(二)
  2. vue element 框架 自定义轮播图,点击上下翻图,并让图片居中
  3. android-apt-compiler: Cannot run program D:\android-sdk\platform-tools\aapt
  4. 898. 子数组按位或操作
  5. C++ : STL常用算法: inner_product , sort ,itoa
  6. 用 Hasor 谈一谈MVC设计模式
  7. 基于JSON Web Tokens的单点登录(SSO)或通行证(Passport)系统方案
  8. 面向对象之三大特性:继承,封装,多态
  9. matlab tsai手眼标定程序代码_标定系列一 | 机器人手眼标定的基础理论分析
  10. 某大型IT公司招网络工程师认证试题精选(要求:CCNA或 HCNE以上)
  11. 【转】基于SQL的Web系统安全防范——SQL注入漏洞
  12. Sql Update Alter Rename
  13. 标准的Java编码规范手册
  14. [la P4487] Exclusive-OR
  15. NAT64实例(ENSP实现)
  16. 关于Hbase手动实现Major Compact的办法
  17. 【Android -- 写作工具】Markdown 脚注尾注
  18. x requested with php,跨域Ajax访问header中 x-requested-with丢失
  19. 事务是什么?干什么用?
  20. 正大国际:做外盘期货主帐户有什么风险?

热门文章

  1. kl散度度量分布_强化学习新思潮1:值分布强化学习(04)
  2. Rotation Matching CodeForces - 1365C(贪心)
  3. 教职工使用计算机管理制度,【学校管理规章制度】教师笔记本电脑使用与管理制度...
  4. *PAT_B_1030_Java(22分)_C++(25分)
  5. LQ训练营(C++)学习笔记_背包问题
  6. 2020年国家电网计算机类考纲,终于发布!详解2020届国家电网考试大纲,带你读懂考纲变化!...
  7. web目录字典_Metasploit -- 目录详解及常用命令
  8. 数学--图论--莫比乌斯线性筛模板
  9. AngularStrap -- Popovers
  10. memcache、Redis与MongoDB的学习-1