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优化算法来更新参数。最后,我们在测试集上评估了准确性。