Tensor
1. 數據類型
類型 | 解釋 |
---|---|
torch.IntTensor | |
torch.FloatTensor | |
torch.rand | 浮點型隨機(0,1)區間均勻分佈 |
torch.randn | 浮點,指定維度 N(0,1)分佈) |
torch.range | 浮點,自定義起止範圍(起,止,步長) |
torch.zeros | 浮點,維度指定,元素值爲0 |
2.Tensor運算
符號 | 解釋 |
---|---|
torch.abs | 取絕對值 |
torch.clamp | 截取上下範圍(a, 上範圍,下範圍) |
torch.mul | 相乘(tensor,tensor)or (tensor, 標量) |
torch.mm | 矩陣乘法 |
torch.add | 求和(tensor+tensor, or tensor+標量) |
torch.div | 除法,(tensor,tensor)or (tensor, 標量) |
torch.pow | 指數,同前 |
torch.mv | 矩陣×向量 |
自動梯度:Tensor變量在前向傳播中生成一張計算圖,根據計算圖和輸出結果計算每個參數需要重新更新的梯度。並通過完成後向傳播完成對參數的梯度更新。
3. A sample example
輸入100個具有1000個特徵的數據,經過隱藏層變成100個具有100個特徵的數據,在經過輸出層輸出100×10的分類結果數據,並計算損失進行後向傳播。
import torch
batch_n = 100 # 輸入數據100
hidden_layer = 100 # 經過隱藏層後保留的特徵數
input_data = 1000 # 輸入數據的特徵數
output_data = 10 # 輸出數據
# 利用隨機生成輸入輸出數據,以及權重數據
x = torch.randn(batch_n, input_data)
y = torch.randn(batch_n, output_data)
w1 = torch.randn(input_data, hidden_layer)
w2 = torch.randn(hidden_layer, output_data)
epoch_n = 10000 # 訓練次數,完成對初始權重參數的優化調整
leaning_rate = 1e-6 # 優化中的學習速率
# 正式訓練
for epoch in range(epoch_n):
h1 = x.mm(w1)
h1 = h1.clamp(min=0)
y_pred = h1.mm(w2) # 前向傳播 X*W1*W2
loss = (y_pred - y).pow(2).sum()
print("Epoch:{}, Loss:{:.4f}".format(epoch, loss)) # 計算損失
# 對每個節點鏈式求導計算出參數的梯度
gray_y_pred = 2 * (y_pred - y)
gray_w2 = h1.t().mm(gray_y_pred) # W2的梯度 h1的轉置*grad_y_pred
grad_h = gray_y_pred.clone()
grad_h = grad_h.mm(w2.t())
grad_h.clamp(min=0)
grad_w1 = x.t().mm(grad_h) # 計算W1的梯度 X轉置*(grad_y_pred * W2的轉置)
# 更新梯度
w1 -= leaning_rate * grad_w1
w2 -= leaning_rate * gray_w2
當然,在這個例子中,參數都是隨機函數生成的並沒有什麼意義,但基本的神經網絡流程則是這樣。