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-tw/n/317089.html