【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…

二值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)*…

【theano-windows】学习笔记十一——theano中与神经网络相关函数

前言 经过softmax和MLP的学习, 我们发现thenao.tensor中除了之前的博客【theano-windows】学习笔记五——theano中张量部分函数提到的张量的定义和基本运算外, 还有一个方法称为nnet, 如果自己实现过前面两篇博客中的代码就会发现用到了theano.tensor.nnet.sigmoid和thenao.te…

【caffe-windows】全卷积网络特征图分析

前言 突然就想分析一下全卷积网络的转置卷积部分了, 就是这么猝不及防的想法, 而且这个网络对图片的输入大小无要求&#xff0c;这么神奇的网络是时候分析一波了&#xff0c;我个人的学习方法调试代码&#xff0c;然后对照论文看理论 本次分析主要针对每层的权重大小和特征图…