Torch 框架介绍与使用指南
Torch 是一款基于 LuaJIT 的开源机器学习框架,它提供了一系列用于构建机器学习和深度学习模型的工具和算法。Torch 中的张量操作是它的核心工具,其被实现为使用高效的 CUDA 和 OpenCL 库的矩阵运算。它还包括广泛使用的科学计算和技术计算库,例如:Math、Image、Signal、NN 等模块。
一、快速入门
Torch 是一款灵活性很高的深度学习框架,为了快速入门,我们需要做如下准备工作:
- 安装 Torch 和相关工具,可以从官网上下载的二进制安装包,也可以使用源码手动编译;
- 学习基础语法和 API,可以通过参考 Torch 官方文档,其中包括入门指南、教程和示例代码等;
- 根据实际需求选择合适的扩展模块和库,例如: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 优化算法来更新参数。最后,我们在测试集上评估了准确性。