【caffe-Windows】新层添加——LSTM

前言

原始的【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和其实现就很简单,关键在于写法结构。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【caffe-Windows】关于LSTM的使用-coco数据集

前言 建议大家使用Linux,因为Linux下的配置就没这么麻烦,各种make就行啦。Linux用户请绕道,因为此博客只针对Windows,可能比Linux麻烦很多倍。 在caffe-Windows新增LSTM层以后,相信很多人和我一样很好奇如何使用这一…

【caffe-Windows】关于LSTM的简单小例子

前言 这里主要是看到了一个简单的LSTM例子,比上一个coco简单很多,所以在这里记录一下,便于后续的分析,参考博客在上一篇文章的末尾提到过:Recurrent neural nets with Caffe 需要说明的是这个例子也并非原原本本的使…

概率有向图模型

1. 前言 主要参考书籍《深度学习导论及案例分析》、维基百科“贝叶斯网络”、老笨妞的博客、PRML中文翻译,重点还是概念的掌握和几个小理论的推导,比较枯燥。加入了自己的一些简单理解。 个人感觉概率有向图模型最大的意义在于:一个特定的有…

概率无向图模型

1. 前言 前面看了概率有向图模型,必然对无向图模型也要研究一下。而且这个概率无向图模型对学习RBM有很大的帮助,它关系到能量函数的来源,所以还是看看吧。参考资料依旧是概率有向图模型中参考的三个资料。 有向图将一组变量上的联合概率分…

softmax理论及代码解读——UFLDL

前言 看了各种softmax以后迷迷糊糊的,还是研究一下UFLDL的教程稳点。当然还是得参考挺多教程的:UFLDL-softmax 、Softmax的理解与应用 、Logistic 分类器与 softmax分类器 、详解softmax函数以及相关求导过程 、Exercise:Softmax Regression 。 【UFLDL…

二值RBM与实值RBM理论及代码解读

1. 前言 虽然推导过二值形式的RBM,但是对于可见层为实值的输入还是半知半解的。最近写个深度学习相关综述,看了一些关于RBM的文献,这里做一下对比总结。但是不倾向于对实值RBM的推导,而是相关代码的实现。 2. RBM回顾 RBM是具有…

【caffe-Windows】添加工程-以classification为例

前言 兴趣所向,研究一下如何在caffe工程之外建立一个属于自己的工程,这里以分类为例,将classification.cpp提取出来,然后调用相应的三方库和libcaffe.lib进行编译。这里比较建议有一丢丢C功底的同志参考学习,主要涉及…

MKL学习——数学运算库安装调试

前言 最近要用C折腾一些东西,涉及到矩阵运算,看了一下网上推荐的数学库,貌似MKL还是蛮不错滴,放到VS2013里面试试 国际惯例,来波地址 blas, cblas, openblas, atlas, lapack, mkl性能对比 Compiling and Linking I…

MKL学习——向量操作

前言 推荐两个比较好的教程: BLAS (Basic Linear Algebra Subprograms) LAPACK for Windows 命名规范 BLAS基本线性代数子程序的函数命令都有一定规范&#xff0c;便于记忆 <character> <name> <mod> () character 定义的是数据类型 s实数域&#…

【caffe-Windows】识别率批量输出——matlab实现

前言 今天看到群里有人问”用matlab输出测试集的精度“&#xff0c;瞎试了一下&#xff0c;好像还成功了。主要还是依据前面所有在matlab中操作caffe的博客。 这里说一下&#xff1a;classification.m是适用单张图片的精度&#xff0c;类似于classification.exe的功能&#x…

相机矩阵(Camera Matrix)

前言 最近翻阅关于从2D视频或者图片中重构3D姿态的文章及其源码&#xff0c;发现都有关于摄像机参数的求解&#xff0c;查找了相关资料&#xff0c;做一下笔记。 国际惯例&#xff0c;来一波参考网址 透视变换、透镜畸变及校正模型、相机校正(Camera Calibration)、Matlab相…

损失函数梯度对比-均方差和交叉熵

前言 我们都知道在机器学习中&#xff0c;希望算法或者网络收敛更快&#xff0c;有些是对数据预处理&#xff0c;尤其是Batch Normalization&#xff0c;有些是采用不同的激活函数&#xff0c;尤其是Relu激活函数取得了巨大的成功&#xff0c;还有一种加速收敛方法是更换损失函…

如何选择深度学习优化器

前言 转载地址&#xff1a;如何选择深度学习优化器 作者&#xff1a;不会停的蜗牛 CSDN AI专栏作家 在很多机器学习和深度学习的应用中&#xff0c;我们发现用的最多的优化器是 Adam&#xff0c;为什么呢&#xff1f; 下面是 TensorFlow 中的优化器&#xff0c; https://w…

【caffe-Windows】基于Python多标签方法——VOC2012数据集

前言 按照上一篇博客所遗留的话题&#xff1a;多标签分类&#xff0c;进行初步探索&#xff0c;此篇博客针对caffe官网的多分类进行配置&#xff0c;只不过是Python接口的&#xff0c;不过官网在开头说明可以使用HDF5或者LMDB进行操作&#xff0c;只不过Python更加方便罢了 国…

【theano-windows】学习笔记二——theano中的函数和共享参数

前言 上一篇博客中学到了theano中的变量类型&#xff0c;也就是dscalar、dvector之类的, 然后还有一个theano.function和eval函数, 将我们所定义的操作转换成theano可执行的函数&#xff0c;类似于def, 还有就是简单的线性代数运算操作。 在神经网络(NN)中, 我们声明了权重、…

【theano-windows】学习笔记三——theano中的导数

前言 就一个NN而言&#xff0c;包含梯度、偏置、参数更新&#xff0c;而前面第一篇博客学习了theano中符号变量的定义, 第二篇博客学习了变量的随机初始化, 变量之间的互相操作(类似于sigmoid(w∗xb)), 但是参数更新还应涉及到损失函数的偏导计算&#xff0c;这一章节就是看看…

【theano-windows】学习笔记五——theano中张量部分函数

前言 至此感觉应该可以写出一个logistic回归程序了&#xff0c;但是为了达到对theano中张量的更灵活的使用, 还是先看一下thenao.tensor对变量都提供了哪些操作&#xff0c;最全的文档戳这里或者这里, 这里就稍微摘取一点自我感觉以后可能用得多的函数 基本张量函数 创建张量…

【theano-windows】学习笔记六——theano中的循环函数scan

前言 Scan是Theano中最基础的循环函数, 官方教程主要是通过大量的例子来说明用法. 不过在学习的时候我比较习惯先看看用途, 然后是参数说明, 最后再是研究实例. 国际惯例, 参考网址 官网关于Scan的11个例子 官网更全面的介绍 简介 用途 递归的一般形式, 可以被用于循环s…

【theano-windows】学习笔记九——softmax手写数字分类

前言 上一篇博客折腾了数据集的预备知识, 接下来按照官方的Deep learning 0.1 documentation一步步走, 先折腾softmax, 关于softmax和logistic回归分类的联系, 我在之前写过一个小博客 国际惯例, 参考博客走一波: Classifying MNIST digits using Logistic Regression soft…

【theano-windows】学习笔记十——多层感知机手写数字分类

前言 上一篇学习了softmax, 然后更进一步就是学习一下基本的多层感知机(MLP)了. 其实多层感知机同时就是w*xb用某个激活函数激活一下, 得到的结果作为下一层神经元的输入x, 类似于 output⋯f3(f2(f1(x∗w1b2)∗w2b2)∗w3b3)⋯output=\cdots f^3(f^2(f^1(x*w^1+b^2)*w^2+b^2)*…