如何学习torch7?怎么才能在torch7上实现自己的网络

Ubuntu安装深度学习平台Torch7以及zbs_torch IDE
1、安装Torch(CPU版本)
Torch的安装直接参考官网的就行了:http://torch.ch/docs/getting-started.html#_
具体如下:
git clone /torch/distro.git ~/torch --recursive #从github中克隆最新版Torch &
cd ~/ bash install- #进入torch根目录,然后安装torch的依赖库 &
./install.sh #安装torch &
安装的依赖库中包含LuaJIT和LuaRocks。其中LuaRocks是Lua用来安装工具包的,这个很重要,因为很多在别人提供的代码中会用到各种各样的工具包。
在安装torch的过程中会提示要不要把torch加入环境变量,请选择yes。
然后用下面的命令使环境变量生效:
source ~/.bashrc&
这样就安装好torch了。接下来就是用luarocks安装各种工具包了,用luarocks安装工具包的时候,如果能够联网就好说,然而事实是经常不能联网。
解决的办法是,把工具包下载下来,具体的下载方法当然是去luarocks的官网搜了。但是torch也给了很多工具包,就在/torch/rocks里面,请自行下载。如果在安装工具包的时候提示要其他的依赖工具,请先安装所需的依赖工具。如果在torch提供的工具包中没有所需的依赖库,就自己网上下载。记住:一定要在工具包的文件夹下安装工具。
2、安装Torch能用的IDE
Torch能用的IDE是基于ZeroBrane Studio 和 MobDebug开发的一个zbs-torch IDE,github的网址是:/soumith/zbs-torch。
按照github中提供的方法是:
luarocks install mobdebug #安装调试工具 &
这个工具torch提供的工具包是没有的,请自己网上下载。安装的过程会提示需要依赖库,请根据提示自行下载。
$ git clone /soumith/zbs-torch.git &
$ cd zbs-torch &
$ ./zbstudio.sh &
这样就安装完zbs-torch了。
接下来是把torch加入zbs-torch中去。
首先是在IDE的菜单栏中进行如下操作:Project-&Start Debugger Server,然后是:Project-&Lua Interpreter-&Torch-7。
最后要调试的时候在代码中加入:require('mobdebug').start(),点击绿色的运行按钮开始调试程序。
调试操作说明:
图中左边第一个按钮是进入函数单步调试(F10),第三个按钮是不进入函数单步调试(shift+F10),第四个是运行到光标处。
本文永久更新地址:
------分隔线----------------------------3220人阅读
Deep Learning(21)
torch7框架学习首先还是应该先看最基本的torch包中有什么。在我的前2篇博客 和 已经较为详细讲了。接下来要看的是神经网络包nn中的内容。可以说,当学习了神经网络包中的内容后,则能看懂给予torch框架的论文代码了,并且已经具备一定的用该框架书写神经网络的能力。
看完这篇博客后,应该能进行最简单的自动训练方式。(⊙o⊙)…,我这样说感觉自己像是个写书的或是老师。
下面将根据不同模块进行介绍
首先对整个nn包进行总览。
神经网络是由不同模块组成。Module是抽象类,子类是container,而container又有三个构建神经网络最重要的子类:Sequential, Parallel和Concat,由这三类构成的神经网络中可以包含简单层,即Linear, Mean, Max和Reshape等,也包括卷积层还有激活函数Tanh, ReLU等。这些都会在后面分别介绍。
当然你上面只是说了如何构建神经网络,那么怎么进行训练呢?首先你要有一个损失函数,在就是
Criterion模块。损失函数众多,常用的由MSECriterion,
ClassNLLCriterion,第一个就是均方误差MSE,第二个就是分类用的交叉熵。有了损失函数后,那么就要开始用算法进行训练了,训练的方式有很多种,有手动挡和自动挡。手动挡就是自己写如何更新权值,这个一般只针对只有简单层的网络,如果有卷积层的话,不太好写。自动挡就是直接调用内部的优化函数包optim来进行训练,当然了,推荐用自动挡啊。
初识Module
这里说的module是啥啊,就是模块啊,你把神经网络看成很多一小块一小块的模块组成的,有的小块是具有参数的,比如Linear或是卷积模块,有些是不带有参数的,比如Max或是Pooling。对于每个小块,总有输入吧,也有输出吧。那么对于那些具有参数的小块,则我们可以计算dLoss_dParams,
注意dLoss_dParams包含了2个,分别是dLoss_dWeight和dLoss_dBias。如果是不具有参数的小块,那么就没有dLoss_dParams了,不过二者都有dLoss_dInput和dLoss_dOutput。这个挺像matcovnet的思想的。如果没明白可以参考这个,
Module是抽象类,包含了4个主要的函数:
1. forward(input) 根据输入计算该module的输出用的。
2. backward(input, gradOutput)
这里的gradOutput就是就是dLoss_dOutput。有了gradOutput和input就可以进行反向传播。值得注意的是,这里内部会计算dLoss_dParams和dLoss_dInput。一般来说只返回dLoss_dInput。事实上,一般来说我们最终要的是整个网络的权值,但是这个不用我们操心,我们也不用管如何更新。只要调用这个函数,则内部会更新网络权值。
3. zeroGradParameters() 这函数一般用于手动挡,自动挡一般用不到。后面会讲解
4. updateParameters(learningRate)
和上面函数一起用于手动挡,后面会讲解。
只有两个成员变量:output,
gradInput。
最简单的自动挡(GSD)训练
这个训练很简单啊。不过对数据集有要求。
数据集有两点要求。首先dataset[index]返回第Index个数据。其次就是dataset:size()函数返回整个数据集的example的个数。
example有两个属性。第一个就是data和label。如果是分类,那么label就是数字,如果是MSECriterion,那么label就是GroundTruth对应的图像矩阵。
然后你就可以用最简单的自动挡了!
训练模板:
criterion = nn.MSECriterion()
trainer = nn.StochasticGradient(mlp,criterion)
trainer.learningRate = 0.001
trainer.maxIteration = 5
trainer:train(dataset)
训练神经网络共五步!
1. 加载数据。 这里要加入a:size()方法和运算符[]到trainset中,这两个是用最简单自动挡的前提!也要正规化数据。
2. 定义网络
3.定义损失函数
这里简单的自动挡训练代码
require 'nn'
require 'cunn'
require 'torch'
require 'cutorch'
trainset = torch.load('cifar10-train.t7')
testset = torch.load('cifar10-test.t7')
setmetatable(trainset,{
__index = function(t,i)
return {t.data[i], t.label[i]}
function trainset:size()
return self.data:size(1)
trainset.data = trainset.data:cuda()
trainset.label = trainset.label:cuda()
meanv = {}
for i = 1,3 do
meanv[i] = trainset.data[ {{}, {i},{}, {}}]:mean()
trainset.data[ {{}, {i},{}, {}}]:add(-meanv[i])
print('mean'..i..'_'..meanv[i])
stdv[i] = trainset.data[ {{}, {i},{}, {}}]:std()
trainset.data[ {{}, {i},{}, {}}]:div(stdv[i])
print('std'..i..'_'..meanv[i])
net = nn.Sequential()
net:add(nn.SpatialConvolution(3, 6, 5, 5))
net:add(nn.ReLU())
net:add(nn.SpatialMaxPooling(2,2,2,2))
net:add(nn.SpatialConvolution(6, 16, 5, 5))
net:add(nn.ReLU())
net:add(nn.SpatialMaxPooling(2,2,2,2))
net:add(nn.View(16*5*5))
net:add(nn.Linear(16*5*5, 120))
net:add(nn.ReLU())
net:add(nn.Linear(120, 84))
net:add(nn.ReLU())
net:add(nn.Linear(84, 10))
net:add(nn.LogSoftMax())
print(net)
criterion =
nn.ClassNLLCriterion()
net = net:cuda()
criterion = criterion:cuda()
timer = torch.Timer()
trainer = nn.StochasticGradient(net, criterion)
trainer.learningRate = 0.001
trainer.maxIteration = 5
trainer:train(trainset)
for i = 1,3 do
testset.data[{{},{i},{},{}}]:add(-meanv[i])
testset.data[{{},{i},{},{}}]:div(stdv[i])
testset.data = testset.data:cuda()
testset.label = testset.label:cuda()
accuracies = {0,0,0,0,0,0,0,0,0,0}
for i=1,10000 do
predict = net:forward(trainset.data[i])
sampleLabel = trainset.label[i]
local confidences , indice = torch.sort(predict,true)
if indice[1] == sampleLabel then
accuracies[sampleLabel] = accuracies[sampleLabel]+1
for i =1,10,1 do
print('accuracies: '..i..'_'..(accuracies[i])/10 ..'%')
print('Elapsed time:'..timer:time().real..'seconds')
结果如下:
mean1_125.
mean2_123.
mean3_114.
nn.Sequential {
[input -& (1) -& (2) -& (3) -& (4) -& (5) -& (6) -& (7) -& (8) -& (9) -& (10) -& (11) -& (12) -& (13) -& output]
(1): nn.SpatialConvolution(3 -& 6, 5x5)
(2): nn.ReLU
(3): nn.SpatialMaxPooling(2x2, 2,2)
(4): nn.SpatialConvolution(6 -& 16, 5x5)
(5): nn.ReLU
(6): nn.SpatialMaxPooling(2x2, 2,2)
(7): nn.View(400)
(8): nn.Linear(400 -& 120)
(9): nn.ReLU
(10): nn.Linear(120 -& 84)
(11): nn.ReLU
(12): nn.Linear(84 -& 10)
(13): nn.LogSoftMax
# StochasticGradient: training
# current error = 2.3
# current error = 1.1
# current error = 1.2
# current error = 1.6
# current error = 1.9
# StochasticGradient: you have reached the maximum number of iterations
# training error = 1.9
accuracies: 1_34.2%
accuracies: 2_67%
accuracies: 3_30.6%
accuracies: 4_36.6%
accuracies: 5_31.6%
accuracies: 6_25%
accuracies: 7_68.2%
accuracies: 8_58%
accuracies: 9_72.7%
accuracies: 10_57.6%
Elapsed time:42.seconds
到此,应该能进行最简单的手动挡GSD的训练。后面将会用optim包进行更加专业更加自定义的训练方式。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:70481次
积分:1301
积分:1301
排名:千里之外
原创:58篇
转载:11篇
评论:34条
阅读:1607
文章:17篇
阅读:24352
(2)(8)(13)(2)(1)(1)(2)(9)(1)(1)(4)(2)(5)(3)(2)(1)(1)(2)(1)(1)(1)(2)(1)(2)(1)Torch7深度学习教程(三)_词汇网
Torch7深度学习教程(三)
责任编辑:词汇网 发表时间: 14:33:43
函数的使用
这是函数的定义方式,声明的关键字+定义的函数名+形参的名字,在此博主返回两个值,具体的函数功能在后面再说
这是初始化一个5x2的矩阵,并且初值都为1。这里有多了一种初始化矩阵的方法。
这是先声明一个2x5的矩阵,然后再调用fill()方法其值全部初始化为4。
将a,b矩阵输入到addTensors函数里面,注意这里是实参,前面定义的a,b是形参,这个有点c基础的应该都分的清楚吧。打印结果就是返回a矩阵和axb的矩阵。
这样子写更像matlab,返回的a和axb分别按顺序赋值给c,d。CUDA的Tensor 抱歉了,我的电脑不是NVIDIA的显卡,这里以后再补上吧,看不到运行结果 这里就是多调用一下cuda()函数,然后计算axb矩阵的乘机运算就可以了。开头的require ‘cutorch’就是导入cuda运算包,类似于c语言里面的include。下一章,开始进入主题――神经网络
上一集:没有了 下一集:
相关文章:&&&&&&&&&&&&&&
最新添加资讯
24小时热门资讯
附近好友搜索

我要回帖

 

随机推荐