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

前言

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

需要说明的是这个例子也并非原原本本的使用caffe自带的LSTM,而是加入了一些东西,所以我们还是得新增层

国际惯例,代码链接:

作者提供GitHub:https://github.com/christopher5106/last_caffe_with_stn

博主提供云盘:链接:http://pan.baidu.com/s/1i474Dd7 密码:31x8

第一步

首先对比一下两个proto,看看我们的caffe-Windows少了哪几个层。一般而言,操作多了就会发现,我们的第一反应去看看message LayerParameter这里面登记的ID,可以发现作者添加了以下几层:

①LSTM层:对应lstm_layer.hpp和lstm_layer.cpp注意这个地方由于上一篇博客配置过LSTM,而且此处的LSTM与上一篇博客实现不同,所以最好是重新解压一个caffe-Windows执行添加层的操作

添加ID为

  optional LSTMParameter lstm_param = 201;
添加参数为

message LSTMParameter {optional uint32 num_output = 1; // The number of outputs for the layeroptional float clipping_threshold = 2 [default = 0.0];optional FillerParameter weight_filler = 3; // The filler for weightoptional FillerParameter bias_filler = 4; // The filler for the biasoptional uint32 batch_size = 5 [default = 1];
}

②Repeat层:对应repeat_layer.hpp和repeat_layer.cpp

添加ID为

  optional RepeatParameter repeat_param = 202;
添加参数为

message RepeatParameter {optional uint32 num_repeats = 1; // The number of outputs for the layeroptional int32 axis = 2 [default = 1];
}
③PowerFile层:对应power_file_layer.hpp和power_file_layer.cpp

添加ID为

  optional PowerFileParameter power_file_param = 146;

添加参数为

// added by Kaichun Mo
message PowerFileParameter {optional string shift_file = 1;
}
④loc_loss层:对应loc_loss_layer.hpp和loc_loss_layer.cpp

添加ID为

  optional LocLossParameter loc_loss_param = 147;
添加参数为

message LocLossParameter {required double threshold = 1;
}
⑤SpatialTransformer层:对应st_layer.hpp和st_layer.cpp

添加ID为

  optional SpatialTransformerParameter st_param = 148;
添加参数为
⑥STLoss层:对应st_loss_layer.hpp和st_loss_layer.cpp

添加ID为

optional STLossParameter st_loss_param = 145;
添加内容为

message STLossParameter {// Indicate the resolution of the output images after ST transformationrequired int32 output_H = 1;required int32 output_W = 2;
}
⑦smooth_L1_loss层:对应smooth_L1_loss_layer.hpp和smooth_L1_loss_layer.cpp

无ID无参数

这一步的主要问题在于:

新拷贝一个caffe-Windows再添加层,因为我第一次是将lstm_layer.hpp和lstm_layer.cpp都换了个名字,但是一直编译不成功出错。有C++大牛的话可以尝试一下,也算是一种挑战。

②添加层的方法没有写详细,强烈建议大家一层一层添加,否则很容易出错,而且你不知道错误原因何在。而且每一层添加完成测试的方法在上上篇博客有说明,就是单独对这个cpp编译会显示成功。

多句嘴:仔细、仔细、仔细

第二步

很多人在使用matlab接口的时候会说:“哎呀,咋有崩溃了啊”,“哎呀,又闪退了”,“又未响应了”。这种情况我的解决方法是使用exe调试,当然每个人有每个人的调试方法,都靠自己探索的。

所以第二步,先不在MATLAB中进行使用,而是测试一下我们书写的LSTM的prototxt文件是否正确,新手一般都会出现什么parameterfailed什么的错误,反正大概意思就是不存在这个层。那么你就得回到第一步再检查一遍了,提示的是谁,就检查谁

废话说多了,下面开始测试。使用的模型来源于参考博客,先看看网络结构


看着挺简单的,先介绍一下输入(从原始博客翻译过来):

data:是T*N*I维度,其中I代表序列每一步中数据的维度(例子中为1),T*N代表序列长度,其中N是batchsize批大小。约束是数据大小必须是N的整数倍
clip:是T*N维度,如果clip=0,隐状态和记忆单元就会被初始化为0,如果不是的话,之前的值将会被使用
label:每一步的预测输出

根据模型搭建网络(lstm.prototxt)如下:

name: "LSTM"
input: "data"
input_shape { dim: 320 dim: 1 }
input: "clip"
input_shape { dim: 320 dim: 1 }
input: "label"
input_shape { dim: 320 dim: 1 }
layer {name: "Silence"type: "Silence"bottom: "label"include: { phase: TEST }
}
layer {name: "lstm1"type: "Lstm"bottom: "data"bottom: "clip"top: "lstm1"lstm_param {num_output: 15clipping_threshold: 0.1weight_filler {type: "gaussian"std: 0.1}bias_filler {type: "constant"%偏置初始化为0}}
}
layer {name: "ip1"type: "InnerProduct"bottom: "lstm1"top: "ip1"inner_product_param {num_output: 1weight_filler {type: "gaussian"std: 0.1}bias_filler {type: "constant"}}
}
layer {name: "loss"type: "EuclideanLoss"bottom: "ip1"bottom: "label"top: "loss"include: { phase: TRAIN }
}
有了网络模型,需要配置一个solver.prototxt去调用它

net: "lstm.prototxt"
test_iter: 1
test_interval: 2000000
base_lr: 0.0001
momentum: 0.95
lr_policy: "fixed"
display: 200
max_iter: 100000
solver_mode: CPU
average_loss: 200
#debug_info: true
接下来建立一个test.bat用于测试我们的caffe是否搭建好,是否适用于此prototxt,其中test.bat的内容如下

E:\CaffeDev2\caffe-windows\Build\x64\Release\caffe.exe train -solver=solver.prototxt
pause

看看我的目录结构,主要还是为了强调路径问题


运行之

如果这一步出错,请重新操作第一步

第三步

既然模型没问题了,那么就可以添加数据进行预测了。采用参考博文中的输入函数进行测试。

在此之前,参考前面的配置MATLAB接口的博文,确保自带的classification.m能够正常运行。

之后我们来测试一下模型预测效果:

①添加环境变量

clear
clc
addpath('../..')
caffe.reset_all
caffe.set_mode_cpu
②加载模型

solver=caffe.Solver('solver.prototxt');
运行看看,崩溃了请重新核对路径以及MATLAB接口的配置还有第二步是否能成功

>> solversolver = Solver (具有属性):net: [1x1 caffe.Net]test_nets: [1x1 caffe.Net]
设置遗忘门的偏置为5.0

③创建数据集

a=0:0.01:32;
a=a(1:end-1);
d=0.5 * sin(2*a) - 0.05 * cos( 17*a + 0.8  ) + 0.05 * sin( 25 * a + 10 ) - 0.02 * cos( 45 * a + 0.3);
d = d / max(max(d), -min(d));
d = d - mean(d);
④训练

niter=5000;
solver.net.blobs('clip').set_data(solver.net.blobs('clip').get_data*0+1);
train_loss =zeros(1,niter);
for i=1:niterif mod(i,1000)==0fprintf('iter=%d\n',i);endseq_idx = mod(i ,(length(d) / 320));mid=solver.net.blobs('clip').get_data();solver.net.blobs('clip').set_data([seq_idx > 0,mid(2:end)]);solver.net.blobs('label').set_data(d( seq_idx * 320+1 : (seq_idx+1) * 320 ));solver.step(1)train_loss(i)= solver.net.blobs('loss').get_data();
end
画出来看看

plot(1:niter,train_loss)

再测试一下

preds=zeros(length(d));
solver.test_nets.blobs('clip').set_data(solver.test_nets.blobs('clip').get_data*0+1)
for i=1:length(d)mid2=solver.test_nets.blobs('clip').get_data();solver.test_nets.blobs('clip').set_data([i>0,mid2(2:end)]);solver.test_nets.forward_prefilled()mid2=solver.test_nets.blobs('ip1').get_data();preds(i)=mid2(1);
end
figure
plot(preds)
hold on 
plot(d)
hold off

第四步

感觉和参考博文中的结果差距很大啊,去Python中测试一下

import caffe
solver = caffe.SGDSolver('solver.prototxt')
solver.net.params['lstm1'][2].data[15:30]=5
import numpy as np
a = np.arange(0,32,0.01)
d = 0.5*np.sin(2*a) - 0.05 * np.cos( 17*a + 0.8  ) + 0.05 * np.sin( 25 * a + 10 ) - 0.02 * np.cos( 45 * a + 0.3)
d = d / max(np.max(d), -np.min(d))
d = d - np.mean(d)
niter=5000
train_loss = np.zeros(niter)
solver.net.params['lstm1'][2].data[15:30]=5
solver.net.blobs['clip'].data[...] = 1
for i in range(niter) :seq_idx = i % (len(d) / 320)solver.net.blobs['clip'].data[0] = seq_idx > 0solver.net.blobs['label'].data[:,0] = d[ seq_idx * 320 : (seq_idx+1) * 320 ]solver.step(1)train_loss[i] = solver.net.blobs['loss'].data
import matplotlib.pyplot as plt
plt.plot(np.arange(niter), train_loss)solver.test_nets[0].blobs['data'].reshape(2,1)
solver.test_nets[0].blobs['clip'].reshape(2,1)
solver.test_nets[0].reshape()
solver.test_nets[0].blobs['clip'].data[...] = 1
preds = np.zeros(len(d))
for i in range(len(d)):solver.test_nets[0].blobs['clip'].data[0] = i > 0preds[i] =  solver.test_nets[0].forward()['ip1'][0][0]
plt.plot(np.arange(len(d)), preds)
plt.plot(np.arange(len(d)), d)
plt.show()
然而也无法复现原文效果,有对Python比较了解的大牛希望能够在评论区给出相关测试意见。



难道是作者博文写错了?这个以后再探讨。

总结:

通过这两个关于LSTM的博客发现,不同的人对LSTM的改编都有所不同,根据不同的任务,可以对LSTM做相应的改动,使用方法也不尽相同。
但是语法结构应该是相似的,对比一下两篇博文中关于LSTM层的写法可能就会有不同的收获


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

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

相关文章

概率有向图模型

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

概率无向图模型

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

softmax理论及代码解读——UFLDL

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

马尔科夫链和马尔科夫链蒙特卡洛方法

前言 译自:《Training Restricted Boltzmann Machines: An Introduction 》 马尔科夫链在RBM的训练中占据重要地位,因为它提供了从复杂的概率分布(比如马尔科夫随机场MRF的吉布斯分布)中提取样本。这一部分主要就是对马尔科夫链做个基本的理论介绍,将…

二值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 基本线性代数子程序 BLACS : Basic Linear Algebra Communication Subprograms 基本线性代数通信子程序 LAPACK : Linear Algebra PACKage 线性代数包 ScaLAPACK : Scalable LAPACK PBLAS : Parallel Basic Linear Alg…

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…

MKL学习——矩阵向量操作

前言 前面介绍的BLAS Level 1是向量-向量的操作&#xff0c;而这里的BLAS Level 2主要还是对矩阵-向量之间的操作。命名规则与前面的一样&#xff0c;主要记住定义的是数据类型 s实数域&#xff0c;单精度c复数域&#xff0c;单精度d实数域&#xff0c;双精度z复数域&#xf…

MKL学习——矩阵矩阵操作

前言 前面介绍了BLAS Level 1中向量-向量操作&#xff0c;以及BLAS Level 2中矩阵-向量的操作&#xff0c;就剩下这一篇的BLAS Level 3中的矩阵-矩阵的操作了。对稀疏矩阵的操作以后等要用再看看。对基本的矩阵和向量运算的函数有所了解以后&#xff0c;就进行常用参数分析&am…

MKL学习——线性代数概念相关

前言 回顾一下BLAS Level 1 2 3中的运算都有什么类型 BLAS Level 1 在BLAS Level 1中&#xff0c;进行的是向量-向量的操作。其中相关概念有 向量类型: 实数域&#xff0c;复数域&#xff0c;共轭运算操作: 元素求和&#xff0c;向量相加&#xff0c;向量拷贝&#xff0c;点乘…

MKL学习——基本操作C++实现

前言 前面介绍了各种向量-向量&#xff0c;矩阵-向量&#xff0c;矩阵-矩阵的函数简介。根据自身目前状况&#xff0c;主要使用实数域的操作&#xff0c;也就是说关注单精度float类型的s和双精度double类型的d。还有就是用的基本都是全矩阵&#xff0c;没有经过压缩&#xff0…

相机矩阵(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】以mnist为例的hdf5单标签处理——matlab实现

前言 主要是想尝试看一下多标签的caffe是如何进行输入输出的&#xff0c;但是目前还未找到基于原始caffe做多标签输入的代码&#xff0c;大部分都是基于源码做了一部分修改实现多标签分类&#xff0c;caffe官网倒是有一个多标签的Python程序&#xff0c;这个我慢慢研究研究&am…

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

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

【theano-windows】学习笔记一——theano中的变量

前言 因为目前需要搭建一些关于RBM或者其他之类的模型&#xff0c;感觉不太会折腾caffe&#xff0c;然而我发现了几个有趣网址&#xff0c;使用theano实现了各种各样的模型&#xff0c;所以&#xff0c;尝试学一下theano。主要以官方教程为主&#xff0c;所以博客会以译文的方…