如何安装pytorch在torch7上增加一个新的层

如何学习torch7?怎么才能在torch7上实现自己的网络? - 知乎129被浏览6571分享邀请回答/torch/torch7/blob/master/README.md3.学习nn包的使用,文档在
,这里就不像caffe那么容易了,需要对网络有较多的理解,网络的定义,数据的供给,minibatch实现,梯度求解,优化(如自定义学习率衰减),模型保存等等均要自己写代码实现了。不过也是有比较固定的流程的理解后写了一个以后就容易了,可以参照相关的例子。推荐课程
,使用了torch进行教学和实验的。4.完成了基本的学习后,可了解一些torch的包, ,这里面有许多资源汇总,如学习资料,教程,各种包。这里重点推荐的包有:nngraph,可以很方便的构建复杂的网络;
torch-opencv,可在torch中调用opencv的函数;
loadcaffe, 导入caffe的模型; nninit, 设置权值初始化方式; torch-hdf5,读取和存储数据。5.查看实现代码,如nn的各个模块定义在 torch/extra/nn/中的同名lua代码中,具体c实现在torch/extra/nn/lib/THNN/generic/目录下。注意torch利用了自己定义的torch.class来实现面向对象编程。如何写自己的模块见
,这里感觉比caffe简单些,如果不写c代码的话。6.问题讨论group,7.其他的各种问题只能谷歌了,如保存的模型为什么那么大,如何对各个层使用不同的学习率,如何在gpu和cpu间切换。有个简单的FAQ,包括了常见的疑惑,43添加评论分享收藏感谢收起Torch7深度学习教程
这一章不涉及太多的神经网络的原理,重点是介绍如何使用Torch7神经网络首先require(相当于c语言的include)nn包,该包是神经网络的依赖包,记得在语句最后加上“;”,这个跟matlab一样不加的话会打印出来数据。Torch可以让我们自己一层一层的设计自己的网络,像是容器一样可以一层一层地把你自己的Layer(神经网络的中的层)往里面添加。首先,要构造一个神经网络容器,即用上面的形式声明一个神经网络容器,网络名为net,博主目前知道的Torch提供了三种形式构建的神经网络的容器,如下图这里使用的是第一种,看名字大概也能猜到就是队列形式的,一层接一层地加载,第二种,第三种,图像展示应该比我文字描述的更形象。(有时间找个其他的列子把后面的两种的试验补充上)。这里代码行的序号没截屏好,第3行是没有的,第2行代码后直接接的是第4行代码。这里是net神经网络容器调用add添加方法,向里面添加层,nn.SpatialConvolution是创建一个卷基层,里面的参数值的含义分别为:1表示输入图片的通道为1,这个改写成3就是输入3通道的图片;6表示经过该层的卷积运算输出的通道数;5,5这两个参数代表的是用5x5的核进行卷积运算。总结,该层是把1通道的图片输入进来然后利用5x5的卷积核进行卷积运算,最后输出6通道的图片。module = nn.SpatialConvolution(nInputPlane, nOutputPlane, kW, kH, [dW], [dH], [padW], [padH])
Ctrl+D&将本页面保存为书签,全面了解最新资讯,方便快捷。先附加几个有用的。
replace(function)
这个可以是将function应用到net中每一层上。比如,我们可以将model中的nn.Dropout替换成nn.Identity(),显然传入的参数module随便写成什么变量,都指某一层。
model:replace(function(module)
if torch.typename(module) == 'nn.Dropout' then
return nn.Identity()
return module
apply(function)
这个和上面的类似,也是对每一层进行操作。
local function weights_init(m)
local name = torch.type(m)
if name:find('Convolution') then
m.weight:normal(0.0, 0.02)
m.bias:fill(0)
elseif name:find('BatchNormalization') then
if m.weight then m.weight:normal(1.0, 0.02) end
if m.bias then m.bias:fill(0) end
net:apply(weights_init)
remove和insert
有时候我们想直接移除某一层,或是中间添加一层。
model = nn.Sequential()
model:add(nn.Linear(10, 20))
model:add(nn.Linear(20, 20))
model:add(nn.Linear(20, 30))
model:remove(2)
nn.Sequential {
[input -& (1) -& (2) -& output]
(1): nn.Linear(10 -& 20)
(2): nn.Linear(20 -& 30)
对于insert,
model = nn.Sequential()
model:add(nn.Linear(10, 20))
model:add(nn.Linear(20, 30))
model:insert(nn.Linear(20, 20), 2)
nn.Sequential {
[input -& (1) -& (2) -& (3) -& output]
(1): nn.Linear(10 -& 20)
(2): nn.Linear(20 -& 20)
(3): nn.Linear(20 -& 30)
training()和evaluate()
对于Dropout和BN之类的层,训练和测试的操作不一样。
这时候可以用
model:training()或是model:evaluate()进行。
apply函数类似上面的replace函数。
下面是training()的实现方式。
model:apply(function(module)
module.train = true
convolution
一般来说用的最多的还是SpatialConvolution和反卷积SpatialFullConvolution. 当然你可能会加点SpatialBatchNormalization之类的。
我们也可以用convolution的方式来单独padding。分为0 padding,’反射 padding’以及和复制 padding.
module = nn.SpatialZeroPadding(padLeft, padRight, padTop, padBottom)
module = nn.SpatialReflectionPadding(padLeft, padRight, padTop, padBottom)
module = nn.SpatialReplicationPadding(padLeft, padRight, padTop, padBottom)
对于这3种中的任意一种,我们可以直接通过pad的值为负数,从而实现裁剪的功能。
module = nn.SpatialZeroPadding(-1,0,-1,0)就是左边和上面分别裁去一个像素。
Table Layers
正因为由table layers才能使得Torch能够构建非常灵活强大的网络。
ConcatTable与ParrelTable
对于ConcatTable就是,将一个输入喂入每一个成员里,每个成员接收到的内容都是一样的。相当于复制了n份。
mlp = nn.ConcatTable()
mlp:add(nn.Linear(5, 2))
mlp:add(nn.Linear(5, 3))
pred = mlp:forward(torch.randn(5))
for i, k in ipairs(pred) do print(i, k) end
[torch.Tensor of dimension 2]
[torch.Tensor of dimension 3]
对应的是ParallelTable,它是输入是几份,就要有几个成员,是按顺序一一对应的!而ConcatTable是输入是一份,但是成员是n个,输入是”复制成n份“,然后给每个成员一份的。
+----------+
+-----------+
, +---------& ,
, +---------&
+---------&
+----------+
+-----------+
mlp = nn.ParallelTable()
mlp:add(nn.Linear(10, 2))
mlp:add(nn.Linear(5, 3))
x = torch.randn(10)
y = torch.rand(5)
pred = mlp:forward{x, y}
for i, k in pairs(pred) do print(i, k) end
[torch.Tensor of dimension 2]
[torch.Tensor of dimension 3]
这个主要是将多个输出联合起来,那自然就要指定联合的维度。
module = JoinTable(dimension, nInputDims)
第一个参数是在第几个维度上联合,第二个参数表示每个输入的维度大小
值得注意的是,联合起来的table必须在除了第dimension的维度之外,其他维度必须相同!这个,显然的。否则就乱套了。
x = torch.randn(5, 1)
y = torch.randn(5, 1)
z = torch.randn(2, 1)
print(nn.JoinTable(1):forward{x, y})
print(nn.JoinTable(2):forward{x, y})
print(nn.JoinTable(1):forward{x, z})
[torch.DoubleTensor of dimension 10x1]
0.4256 -1.7362
[torch.DoubleTensor of dimension 5x2]
[torch.Tensor of dimension 7x1]
常用的应该就是这3个,当然还有其他很多。
table和tensor之间相互转换的除了JoinTable。还有SplitTable等。
每个输入的相似性度量
CosineDistance
这个属于module之间相互计算测量值的一种层。
mlp = nn.CosineDistance()
x = torch.Tensor({{1,2,3},{1,2,-3}})
y = torch.Tensor({{4,5,6},{-4,5,6}})
print(mlp:forward({x,y}))
-- {1 2 3}与{4 5 6}
-- {1 2 -3}与{-4 5 6}
[torch.DoubleTensor of size 2]
这个和的Cosine的用法还是有很大区别的。
类似的还有PairewiseDistance和DotProduct.
每个输入进行element-wise 操作
就是加减乘除以及最大最小,6种运算。
比如CAddTable,…, CDivTable(),以及CMaxTable和CMinTable。
m = nn.CDivTable()
a = torch.randn(4,5):mul(4):floor()
b = torch.Tensor(a:size()):fill(2)
[torch.DoubleTensor of size 4x5]
&th m:forward({a,b})
1.0000 -3.0000
0.0000 -1.0000
4.0000 -4.0000
-0.5000 -0.5000
-3.5000 -2.5000 -2.0000
[torch.DoubleTensor of size 4x5]
CriterionTable
mlp = nn.CriterionTable(nn.MSECriterion())
x = torch.randn(5)
y = torch.randn(5)
print(mlp:forward{x, x})
print(mlp:forward{x, y})
本文已收录于以下专栏:
相关文章推荐
身为一个女子应该要清楚自己主要的并不是虚无漂亮的表面而是一颗睿智的心。     模样会被时间磨损甚至堕落,但思维却可以永世长存。这事短暂与永恒的差别。     生活中许多轻微的情节都应当留神不要执迷不...
|-Container
   |-Sequential
   |-Parallel
   |-Concat
      |-DepthConcat
安装使用torch以后,接...
网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。
我已经不太想写Torch的博客了~~没劲。
总说上篇博客已经初步介绍了Module类。这里将更加仔细的介绍。并且还将介绍Container, Transfer Functions Layers和 Simple Layers模块。Module主要...
总说torch的多gpu还是有点繁琐。。测试了一个最初的版本。
简单来说,要进行torch的多gpu,得加个require 'optim'
require 'nn'
require 'cutorch...
在项目开发中,我们会涉及到不同的环境,如开发、测试、集成和发布环境。因此在不同的环境上我们要灵活切换,如连接不同的数据库。Maven为了支持灵活的构建,内置了三大特性:属性、Profile和资源过滤。...
他的最新文章
讲师:董西成
讲师:唐宇迪
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)torch中添加新层 - 简书
torch中添加新层
经过实践,补充了一些细节。
分两种情况:
所有运算均能通过Tensor自带的操作来完成,这样只要写一个lua文件就行,然后直接require就可以使用了,非常方便。
所有运算均能通过Tensor自带的操作来完成,这样只要写一个lua文件就行,然后直接require就可以使用了,非常方便。
对于第一种情况:
具体来说,lua文件写在哪呢,经过我自己的实验,我们首先来看torch目录树中的两个包含相似内容的路径:
torch/install/share/lua/5.1/nn
torch/extra/nn第二个路径可以看作是源代码路径,在该路径下放置新编好的.lua文件,并在该路径的 "init.lua" 文件末尾增添 require('nn.NewLayer') 语句。NB: init.lua 文件在 require('nn')语句后会自动执行。
接着执行如下命令:
cd torch/extra/nn/luarocks make rocks/nn-scm-1.rockspec
.lua文件(包括 NewLayer.lua 和 init.lua )就会被复制(也就是安装)到第一个路径,这样才可以在终端th中使用。当然也可以直接在第一个路径中写一个新的 .lua 文件,但是这样貌似不规范(请大神解释luarocks这样设计的机制)
对于第二种情况:
具体来说,这种情况必须经过编译安装。也就是必须执行如下命令:
cd torch/extra/nn/luarocks make rocks/nn-scm-1.rockspec
例子以后再补充。先附加几个有用的。
replace(function)
这个可以是将function应用到net中每一层上。比如,我们可以将model中的nn.Dropout替换成nn.Identity(),显然传入的参数module随便写成什么变量,都指某一层。
model:replace(function(module)
if torch.typename(module) == 'nn.Dropout' then
return nn.Identity()
return module
apply(function)
这个和上面的类似,也是对每一层进行操作。
local function weights_init(m)
local name = torch.type(m)
if name:find('Convolution') then
m.weight:normal(0.0, 0.02)
m.bias:fill(0)
elseif name:find('BatchNormalization') then
if m.weight then m.weight:normal(1.0, 0.02) end
if m.bias then m.bias:fill(0) end
net:apply(weights_init)
remove和insert
有时候我们想直接移除某一层,或是中间添加一层。
model = nn.Sequential()
model:add(nn.Linear(10, 20))
model:add(nn.Linear(20, 20))
model:add(nn.Linear(20, 30))
model:remove(2)
nn.Sequential {
[input -& (1) -& (2) -& output]
(1): nn.Linear(10 -& 20)
(2): nn.Linear(20 -& 30)
对于insert,
model = nn.Sequential()
model:add(nn.Linear(10, 20))
model:add(nn.Linear(20, 30))
model:insert(nn.Linear(20, 20), 2)
nn.Sequential {
[input -& (1) -& (2) -& (3) -& output]
(1): nn.Linear(10 -& 20)
(2): nn.Linear(20 -& 20)
(3): nn.Linear(20 -& 30)
training()和evaluate()
对于Dropout和BN之类的层,训练和测试的操作不一样。
这时候可以用
model:training()或是model:evaluate()进行。
apply函数类似上面的replace函数。
下面是training()的实现方式。
model:apply(function(module)
module.train = true
convolution
一般来说用的最多的还是SpatialConvolution和反卷积SpatialFullConvolution. 当然你可能会加点SpatialBatchNormalization之类的。
我们也可以用convolution的方式来单独padding。分为0 padding,’反射 padding’以及和复制 padding.
module = nn.SpatialZeroPadding(padLeft, padRight, padTop, padBottom)
module = nn.SpatialReflectionPadding(padLeft, padRight, padTop, padBottom)
module = nn.SpatialReplicationPadding(padLeft, padRight, padTop, padBottom)
对于这3种中的任意一种,我们可以直接通过pad的值为负数,从而实现裁剪的功能。
module = nn.SpatialZeroPadding(-1,0,-1,0)就是左边和上面分别裁去一个像素。
Table Layers
正因为由table layers才能使得Torch能够构建非常灵活强大的网络。
ConcatTable与ParrelTable
对于ConcatTable就是,将一个输入喂入每一个成员里,每个成员接收到的内容都是一样的。相当于复制了n份。
mlp = nn.ConcatTable()
mlp:add(nn.Linear(5, 2))
mlp:add(nn.Linear(5, 3))
pred = mlp:forward(torch.randn(5))
for i, k in ipairs(pred) do print(i, k) end
[torch.Tensor of dimension 2]
[torch.Tensor of dimension 3]
对应的是ParallelTable,它是输入是几份,就要有几个成员,是按顺序一一对应的!而ConcatTable是输入是一份,但是成员是n个,输入是”复制成n份“,然后给每个成员一份的。
+----------+
+-----------+
, +---------& ,
, +---------&
+---------&
+----------+
+-----------+
mlp = nn.ParallelTable()
mlp:add(nn.Linear(10, 2))
mlp:add(nn.Linear(5, 3))
x = torch.randn(10)
y = torch.rand(5)
pred = mlp:forward{x, y}
for i, k in pairs(pred) do print(i, k) end
[torch.Tensor of dimension 2]
[torch.Tensor of dimension 3]
这个主要是将多个输出联合起来,那自然就要指定联合的维度。
module = JoinTable(dimension, nInputDims)
第一个参数是在第几个维度上联合,第二个参数表示每个输入的维度大小
值得注意的是,联合起来的table必须在除了第dimension的维度之外,其他维度必须相同!这个,显然的。否则就乱套了。
x = torch.randn(5, 1)
y = torch.randn(5, 1)
z = torch.randn(2, 1)
print(nn.JoinTable(1):forward{x, y})
print(nn.JoinTable(2):forward{x, y})
print(nn.JoinTable(1):forward{x, z})
[torch.DoubleTensor of dimension 10x1]
0.4256 -1.7362
[torch.DoubleTensor of dimension 5x2]
[torch.Tensor of dimension 7x1]
常用的应该就是这3个,当然还有其他很多。
table和tensor之间相互转换的除了JoinTable。还有SplitTable等。
每个输入的相似性度量
CosineDistance
这个属于module之间相互计算测量值的一种层。
mlp = nn.CosineDistance()
x = torch.Tensor({{1,2,3},{1,2,-3}})
y = torch.Tensor({{4,5,6},{-4,5,6}})
print(mlp:forward({x,y}))
-- {1 2 3}与{4 5 6}
-- {1 2 -3}与{-4 5 6}
[torch.DoubleTensor of size 2]
这个和的Cosine的用法还是有很大区别的。
类似的还有PairewiseDistance和DotProduct.
每个输入进行element-wise 操作
就是加减乘除以及最大最小,6种运算。
比如CAddTable,…, CDivTable(),以及CMaxTable和CMinTable。
m = nn.CDivTable()
a = torch.randn(4,5):mul(4):floor()
b = torch.Tensor(a:size()):fill(2)
[torch.DoubleTensor of size 4x5]
&th m:forward({a,b})
1.0000 -3.0000
0.0000 -1.0000
4.0000 -4.0000
-0.5000 -0.5000
-3.5000 -2.5000 -2.0000
[torch.DoubleTensor of size 4x5]
CriterionTable
mlp = nn.CriterionTable(nn.MSECriterion())
x = torch.randn(5)
y = torch.randn(5)
print(mlp:forward{x, x})
print(mlp:forward{x, y})
本文已收录于以下专栏:
相关文章推荐
身为一个女子应该要清楚自己主要的并不是虚无漂亮的表面而是一颗睿智的心。     模样会被时间磨损甚至堕落,但思维却可以永世长存。这事短暂与永恒的差别。     生活中许多轻微的情节都应当留神不要执迷不...
|-Container
   |-Sequential
   |-Parallel
   |-Concat
      |-DepthConcat
安装使用torch以后,接...
网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。
我已经不太想写Torch的博客了~~没劲。
总说上篇博客已经初步介绍了Module类。这里将更加仔细的介绍。并且还将介绍Container, Transfer Functions Layers和 Simple Layers模块。Module主要...
总说torch的多gpu还是有点繁琐。。测试了一个最初的版本。
简单来说,要进行torch的多gpu,得加个require 'optim'
require 'nn'
require 'cutorch...
在项目开发中,我们会涉及到不同的环境,如开发、测试、集成和发布环境。因此在不同的环境上我们要灵活切换,如连接不同的数据库。Maven为了支持灵活的构建,内置了三大特性:属性、Profile和资源过滤。...
他的最新文章
讲师:董西成
讲师:唐宇迪
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 torch检查 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信