慢慢學AI--tensor

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

  當然,在這個例子中,參數都是隨機函數生成的並沒有什麼意義,但基本的神經網絡流程則是這樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章