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/zh-hk/n/317089.html
微信掃一掃
支付寶掃一掃