PYTORCH

什么是 PyTorch ?

PyTorch是一個(gè)python庫(kù),它主要提供了兩個(gè)高級(jí)功能:

  • GPU加速的張量計(jì)算
  • 構(gòu)建在反向自動(dòng)求導(dǎo)系統(tǒng)上的深度神經(jīng)網(wǎng)絡(luò)

1.定義數(shù)據(jù)

一般定義數(shù)據(jù)使用torch.Tensortensor的意思是張量,是數(shù)字各種形式的總稱(chēng)

#導(dǎo)入pytorch包
import torch

#數(shù)字
x = torch.tensor(0)
print(x)

#一維數(shù)組(向量)
x = torch.tensor([1,2,3,4,5,6])
print(x)

#二維數(shù)組(矩陣)
x = torch.ones(2,3)
print(x)

#任意維度的數(shù)組(張量)
x = torch.ones(2,3 4)
print(x)


輸出結(jié)果:

創(chuàng)建Tensor有多種方法,包括:ones, zeros, eye, arange, linspace, rand, randn, normal, uniform, randperm:

# 創(chuàng)建一個(gè)空張量
x = torch.empty(5,3)
print(x)

# 創(chuàng)建一個(gè)隨機(jī)初始化的張量
x = torch.rand(5,3)
print(x)

# 創(chuàng)建一個(gè)全0的張量,里面的數(shù)據(jù)類(lèi)型為 long
x = torch.zeros(5,3,dtype=torch.long)
print(x)

# 基于現(xiàn)有的tensor,創(chuàng)建一個(gè)新tensor,
# 從而可以利用原有的tensor的dtype,device,size之類(lèi)的屬性信息
y = x.new_ones(5,3)   #tensor new_* 方法,利用原來(lái)tensor的dtype,device
print(y)

z = torch.randn_like(x, dtype=torch.float)    # 利用原來(lái)的tensor的大小,但是重新定義了dtype
print(z)

運(yùn)行結(jié)果:

2.定義操作

凡是用Tensor進(jìn)行各種運(yùn)算的,都是Function

最終,還是需要用Tensor來(lái)進(jìn)行計(jì)算的,計(jì)算無(wú)非是

  • 基本運(yùn)算,加減乘除,求冪求余
  • 布爾運(yùn)算,大于小于,最大最小
  • 線(xiàn)性運(yùn)算,矩陣乘法,求模,求行列式

基本運(yùn)算包括: abs/sqrt/div/exp/fmod/pow ,及一些三角函數(shù) cos/ sin/ asin/ atan2/ cosh,及 ceil/round/floor/trunc 等具體在使用的時(shí)候可以百度一下

布爾運(yùn)算包括: gt/lt/ge/le/eq/ne,topk, sort, max/min

線(xiàn)性計(jì)算包括: trace, diag, mm/bmm,t,dot/cross,inverse,svd 等

螺旋數(shù)據(jù)分類(lèi)

  1. 初始數(shù)據(jù)
import random
import torch
from torch import nn, optim
import math
from IPython import display
from plot_lib import plot_data, plot_model, set_default

# 因?yàn)閏olab是支持GPU的,torch 將在 GPU 上運(yùn)行
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print('device: ', device)

# 初始化隨機(jī)數(shù)種子。神經(jīng)網(wǎng)絡(luò)的參數(shù)都是隨機(jī)初始化的,
# 不同的初始化參數(shù)往往會(huì)導(dǎo)致不同的結(jié)果,當(dāng)?shù)玫奖容^好的結(jié)果時(shí)我們通常希望這個(gè)結(jié)果是可以復(fù)現(xiàn)的,
# 因此,在pytorch中,通過(guò)設(shè)置隨機(jī)數(shù)種子也可以達(dá)到這個(gè)目的
seed = 12345
random.seed(seed)
torch.manual_seed(seed)

N = 1000  # 每類(lèi)樣本的數(shù)量
D = 2  # 每個(gè)樣本的特征維度
C = 3  # 樣本的類(lèi)別
H = 100  # 神經(jīng)網(wǎng)絡(luò)里隱層單元的數(shù)量

X = torch.zeros(N * C, D).to(device)
Y = torch.zeros(N * C, dtype=torch.long).to(device)
for c in range(C):
    index = 0
    t = torch.linspace(0, 1, N) # 在[0,1]間均勻的取10000個(gè)數(shù),賦給t
    # 下面的代碼不用理解太多,總之是根據(jù)公式計(jì)算出三類(lèi)樣本(可以構(gòu)成螺旋形)
    # torch.randn(N) 是得到 N 個(gè)均值為0,方差為 1 的一組隨機(jī)數(shù),注意要和 rand 區(qū)分開(kāi)
    inner_var = torch.linspace( (2*math.pi/C)*c, (2*math.pi/C)*(2+c), N) + torch.randn(N) * 0.2
    
    # 每個(gè)樣本的(x,y)坐標(biāo)都保存在 X 里
    # Y 里存儲(chǔ)的是樣本的類(lèi)別,分別為 [0, 1, 2]
    for ix in range(N * c, N * (c + 1)):
        X[ix] = t[index] * torch.FloatTensor((math.sin(inner_var[index]), math.cos(inner_var[index])))
        Y[ix] = c
        index += 1

print("Shapes:")
print("X:", X.size())
print("Y:", Y.size())

# visualise the data
plot_data(X, Y)


1.構(gòu)建線(xiàn)性模型分類(lèi)


learning_rate = 1e-3
lambda_l2 = 1e-5

# nn 包用來(lái)創(chuàng)建線(xiàn)性模型
# 每一個(gè)線(xiàn)性模型都包含 weight 和 bias
model = nn.Sequential(
    nn.Linear(D, H),
    nn.Linear(H, C)
)
model.to(device) # 把模型放到GPU上

# nn 包含多種不同的損失函數(shù),這里使用的是交叉熵(cross entropy loss)損失函數(shù)
criterion = torch.nn.CrossEntropyLoss()

# 這里使用 optim 包進(jìn)行隨機(jī)梯度下降(stochastic gradient descent)優(yōu)化
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, weight_decay=lambda_l2)

# 開(kāi)始訓(xùn)練
for t in range(1000):
    # 把數(shù)據(jù)輸入模型,得到預(yù)測(cè)結(jié)果
    y_pred = model(X)
    # 計(jì)算損失和準(zhǔn)確率
    loss = criterion(y_pred, Y)
    score, predicted = torch.max(y_pred, 1)
    acc = (Y == predicted).sum().float() / len(Y)
    print('[EPOCH]: %i, [LOSS]: %.6f, [ACCURACY]: %.3f' % (t, loss.item(), acc))
    display.clear_output(wait=True)

    # 反向傳播前把梯度置 0 
    optimizer.zero_grad()
    # 反向傳播優(yōu)化 
    loss.backward()
    # 更新全部參數(shù)
    optimizer.step()
    
print(y_pred.shape)
print(y_pred[10, :])
print(score[10])
print(predicted[10])

# Plot trained model
print(model)
plot_model(X, Y, model)


心得體會(huì)

通過(guò)本次的pytorch練習(xí),我熟悉了pytorch的基本操作,通過(guò)tensor來(lái)進(jìn)行定義數(shù)據(jù)和定義操作等,以及初步學(xué)習(xí)螺旋數(shù)據(jù)的分類(lèi)。在螺旋數(shù)據(jù)分類(lèi)中,發(fā)現(xiàn)兩層神經(jīng)網(wǎng)絡(luò)的分類(lèi)準(zhǔn)確率比線(xiàn)性模型分類(lèi)的準(zhǔn)確率高出了很高。