Torch - 迴圈神經網路
Torch 中的迴圈神經網路 (RNN) 專門用於處理順序資料,透過對捕獲先前輸入資訊的隱藏狀態進行分類來實現。在 Torch 中,我們可以使用torch.nn.RNN 模組來建立 RNN。這有助於我們理解輸入大小、層數、非線性性和隱藏大小。RNN 適用於自然語言處理和序列預測等任務,在這些任務中,資料的順序至關重要。RNN 可以處理變長序列作為輸入,並提供變長序列作為輸出。
處理向量和序列的神經網路
在 Torch 中,神經網路是使用torch.nn 模組構建的。這提供了一種靈活且高效的方式來構建和訓練神經網路。
向量: 向量是傳統的神經網路,例如前饋網路,它處理固定大小的輸入向量。向量中的每一層都透過一系列線性運算和非線性運算將輸入向量轉換為另一個向量。
序列: RNN 專門用於處理順序資料,其中資料點的順序很重要。它們維護一個隨時間演變的隱藏狀態,該狀態捕獲來自其他輸入的資訊。
下面的程式碼允許 RNN 處理序列並捕獲時間依賴性,使其適用於各種任務。在 Torch 中實現 RNN:
import torch
import torch.nn as nn
class SimpleRNN(nn.Module):
def __init__(self,int_size, hdn_size, ott_size):
super(SimpleRNN, self).__init__()
self.rnn = nn.RNN(int_size, hdn_size, batch_first=True)
self.fc = nn.Linear(hdn_size, ott_size)
def forward(self, x):
h0 = torch.zeros(1, x.size(0), hdn_size)
out, _ = self.rnn(x, h0)
out = self.fc(out[:, -1, :])
return out
int_size = 20 #input
hdn_size = 30 #hidden
ott_size = 2 #output
model = SimpleRNN(int_size, hdn_size, ott_size)
y = torch.randn(2, 4, input_size)
output = model(y)
print(output)
神經網路中的前向和反向傳播
在神經網路訓練中,前向傳播涉及將輸入資料饋送到網路以生成預測和損失。反向傳播計算損失相對於模型引數的梯度。這些梯度由最佳化器用來更新模型引數,從而在迭代過程中最佳化損失。
前向傳播
在前向傳播中,輸入資料逐層饋送到神經網路。每一層都應用變換以產生輸出。最後一層生成預測,這些預測使用損失函式與真實標籤進行比較,以計算誤差。
輸入資料: 資料被饋送到神經網路。
逐層計算: 資料按順序透過網路的每一層。
輸出和損失計算: 最後一層產生網路的輸出,損失函式將預測與真實標籤進行比較並計算損失,量化誤差。
反向傳播
在反向傳播中,損失函式被反向傳播到網路中,以計算損失相對於每個引數的梯度。這是使用反向傳播完成的。這些梯度由最佳化器用來更新模型引數,從而在後續迭代中減少損失。
# Compute gradients loss.backward() # Updates the parameters optimizer.step() # Zero gradients optimizer.zero_grad()
nngraph 包
nngraph 包透過允許使用者將神經網路定義為計算圖來擴充套件 Torch 中 nn 包的功能。這種方法為複雜的架構(如迴圈神經網路和卷積神經網路)提供了更大的清晰度和靈活性。每個 nn 模組都表示為圖中的一個節點。視覺化包使用graphviz 等工具支援計算圖。這有助於我們理解和除錯網路結構。它允許靈活地建立具有多個輸入和輸出的網路。這支援使用順序模型難以實現的複雜架構。
要使用 nngraph,我們需要安裝它以及用於視覺化的graphviz:
brew install graphviz # Mac users sudo apt-get install graphviz -yellow #Ubuntu users