Torch是一款基于LuaJIT的开源机器学习框架,它提供了一系列用于构建机器学习和深度学习模型的工具和算法。Torch中的张量操作是它的核心工具,其被实现为使用高效的CUDA和OpenCL库的矩阵运算。它还包括广泛使用的科学计算和技术计算库,例如:Math、Image、Signal、NN等模块。
一、快速入门
Torch是一款灵活性很高的深度学习框架,为了快速入门,我们需要做如下准备工作:
1、安装Torch和相关工具,可以从官网上下载的二进制安装包,也可以使用源码手动编译;
2、学习基础语法和API,可以通过参考Torch官方文档,其中包括入门指南、教程和示例代码等;
3、根据实际需求选择合适的扩展模块和库,例如:Torch的NN模块用于深度学习模型的构建,而Torch的image模块用于图像处理,需要根据具体情况进行选择和使用。
接下来,我们将使用一个简单的例子来介绍如何使用Torch构建和训练一个神经网络模型。下面是示例代码:
require 'torch'
-- 创建一个两个类别的测试数据集
dataset={};
function dataset:size() return 100 end
for i=1,dataset:size() do
local input = torch.randn(2);
if input[1]*input[2]>0 then -- XOR问题
dataset[i] = {input,torch.Tensor({1})}
else
dataset[i] = {input,torch.Tensor({-1})}
end
end
-- 构建一个基本的神经网络模型
model = nn.Sequential()
model:add(nn.Linear(2,10))
model:add(nn.Tanh())
model:add(nn.Linear(10,1))
-- 定义损失函数和优化器
criterion = nn.MSECriterion()
trainer = torch.Trainer(model,criterion)
-- 训练模型
for epoch=1,800 do -- 学习800次
for i=1,dataset:size() do
local example = dataset[i]
trainer:train(example[1],example[2])
end
end
-- 预测未知数据
for i=1,10 do
local input = torch.randn(2);
local output=model:forward(input)
print(input[1]..","..input[2].."=>"..output[1])
end
这个例子中,我们创建了一个包含两个输入和一个输出的神经网络模型。我们使用自定义数据集训练该模型,并使用MSE损失函数和随机梯度下降优化器来更新参数。最后,我们使用模型对新的未知数据进行了预测。
二、教程
2.1 Torch的张量
Tensor是Torch的核心组件之一,类似于NumPy中的多维数组,并提供了一组高效的数学操作。Torch Tensor可以使用torch.Tensor函数创建,其中可以指定一个大小的列表,指定数据类型等。例如:
require 'torch' a=torch.Tensor(2,3) -- 创建一个2x3的tensor a:resize(3,2) -- 重设大小为3x2 b=torch.Tensor(2,3):fill(1) -- 用1填充一个2x3的tensor c=torch.randn(2,3) -- 创建2x3个均值为0,标准差为1的随机值的tensor d=torch.eye(3) -- 创建一个3x3的单位矩阵 e=torch.ones(2,3) -- 创建2x3的全为1的tensor
Tensor支持多种数学操作,例如:矩阵乘法、按位加减、reshape等。可以参考Torch官方文档中的API介绍了解更多细节。也可以参考下面的代码展示其功能:
require 'torch' a=torch.randn(2,3) b=torch.randn(3,2) c=torch.randn(2,3) d=torch.randn(2,3) e=torch.randn(3,4) -- 矩阵乘法 print(torch.mm(a,b)) -- 按位加减 print(a+c) print(c-d) -- flatten and reshape print(e:view(12)) print(e:resize(6,2))
2.2 Torch的AUTOGRAOPHER
Torch提供了一个很好的工具,叫做autograd,它可以非常方便的计算张量上的导数。在深度学习中,我们通常需要计算误差关于模型参数的导数,而手动计算非常麻烦,autograd可以自动计算这些导数。使用autograd,只需要在Torch张量上定义操作,可以自动计算导数。
在下面的示例中,我们可以看到如何使用autograd计算张量上的导数:
require 'torch'
a=torch.Tensor{2,3}
x=torch.autograd.variable(a) -- 定义一个需要求导的变量
y=x+torch.sin(x); -- 定义一个带有sin运算的张量
dy=torch.Tensor{1,1}; -- 定义y对应的导数
y:backward(dy) -- 自动求得x的导数
print(x.grad) -- 导数为:1.9329,2.9894
三、示例
3.1 Torch的神经网络
神经网络是深度学习的核心组件之一,它可以用于分类、回归和其他机器学习问题。典型的神经网络是由许多连续的线性和非线性层组成的,通过梯度下降来训练。在这里,我们将使用Torch的NN模块来构建一个简单的前馈神经网络,通过手写数字识别的数据集MNIST来进行分类训练。
下面是示例代码:
require 'torch'
require 'nn'
-- load MNIST dataset
trainset = torch.load('mnist/trainset.t7')
testset = torch.load('mnist/testset.t7')
-- create a neural network
model = nn.Sequential()
model:add(nn.View(28*28)) -- 展平输入数据
model:add(nn.Linear(28*28, 64))
model:add(nn.Tanh())
model:add(nn.Linear(64, 10))
model:add(nn.LogSoftMax()) -- 输出log probabilities
criterion = nn.ClassNLLCriterion() -- Negative Log-Likelihood
-- 定义优化器
sgd_params = {
learningRate = 1e-3,
learningRateDecay = 1e-4,
weightDecay = 1e-3,
momentum = 1e-4
}
sgd_state = {}
-- 训练模型
trainer = nn.StochasticGradient(model, criterion)
trainer.learningRate=0.01
trainer.maxIteration = 5
trainer:train(trainset)
-- 验证测试集
accuracy = 0
for i=1,testset:size() do
local x = testset.data[i]:double() -- convert from ByteTensor to DoubleTensor
local y = testset.labels[i]
local out = model:forward(x)
local d = out[y]-torch.max(out)
local p = torch.exp(out-d)/torch.sum(torch.exp(out-d))
local _,yp = torch.max(p,1)
if yp[1] == y then accuracy = accuracy + 1 end
end
accuracy = accuracy/testset:size()
print('Test set accuracy:', accuracy)
在这个例子中,我们创建了一个具有两个线性层和一个非线性tanh层的前馈神经网络。我们使用MNIST数据集进行训练,并使用StochasticGradient优化算法来更新参数。最后,我们在测试集上评估了准确性。
3.2 Torch的卷积神经网络
卷积神经网络通常用于处理图像和视觉任务,因为它可以利用特征的空间相关性和局部性来提高模型的准确性。在这里,我们将使用Torch的NN模块来构建一个简单的卷积神经网络,通过CIFAR-10数据集来进行分类训练。
下面是示例代码:
require 'torch'
require 'nn'
-- load CIFAR-10 dataset
trainset = torch.load('cifar10-train.t7')
testset = torch.load('cifar10-test.t7')
-- create convolutional neural network
model = nn.Sequential()
model:add(nn.SpatialConvolution(3, 16, 5, 5)) -- 16@28x28
model:add(nn.ReLU())
model:add(nn.SpatialMaxPooling(2,2,2,2)) -- 16@14x14
model:add(nn.SpatialConvolution(16, 32, 5, 5)) -- 32@10x10
model:add(nn.ReLU())
model:add(nn.SpatialMaxPooling(2,2,2,2)) -- 32@5x5
model:add(nn.View(32*5*5)) -- 展平输入数据
model:add(nn.Linear(32*5*5, 1024))
model:add(nn.ReLU())
model:add(nn.Linear(1024, 10))
criterion = nn.CrossEntropyCriterion() -- 多分类交叉熵
-- 定义优化器
sgd_params = {
learningRate = 1e-3,
learningRateDecay = 1e-4,
weightDecay = 1e-3,
momentum = 1e-4
}
sgd_state = {}
-- 训练模型
trainer = nn.StochasticGradient(model, criterion)
trainer.learningRate=0.01
trainer.maxIteration = 5
trainer:train(trainset)
-- 验证测试集
accuracy = 0
for i=1,testset:size() do
local x = testset.data[i]:double() -- convert from ByteTensor to DoubleTensor
local y = testset.labels[i]
local out = model:forward(x)
local _,yp = torch.max(out,1)
if yp[1] == y then accuracy = accuracy + 1 end
end
accuracy = accuracy/testset:size()
print('Test set accuracy:', accuracy)
在这个例子中,我们创建了一个具有两个卷积层和一个全连接层的卷积神经网络。我们使用CIFAR-10数据集进行训练,并使用StochasticGradient优化算法来更新参数。最后,我们在测试集上评估了准确性。
原创文章,作者:DRIPX,如若转载,请注明出处:https://www.506064.com/n/317089.html
微信扫一扫
支付宝扫一扫