动手深度学习——Pytorch 入门语法一
生活随笔
收集整理的這篇文章主要介紹了
动手深度学习——Pytorch 入门语法一
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
持續更新ing
數據操作
import torchx = torch.arange(12) # 創建?個?向量x。這個?向量包含從0開始的前12個整數 print(x.shape) # 通過張量的shape屬性來訪問張量(沿每個軸的?度)的形狀。 print(x.numel()) # 檢查它的?小(size)X = x.reshape(3,4) print(X) print(x.view(3,4))# 輸出和上面一樣。 # view()和reshape()功能一樣,都可以改變張量形狀。z = torch.zeros((2,3,4)) # 全零張量 print(z)z1 = torch.ones((2,3,4)) # 全1張量 print(z1)randomNumber = torch.randn(3,4) # 創建?個形狀為(3,4)的張量。其中的每個元素都從均值為0、標準差為1的標準?斯分布(正態分布)中隨機采樣print(torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])) # 給張量直接賦值 import torchx= torch.tensor([1.0, 2, 4, 8]) y = torch.tensor([2,2,2,2]) print(x+y,x-y,x*y,x/y, x**y) # **運算符是求冪運算print(torch.exp(x)) # 計算e的冪X = torch.arange(12,dtype=torch.float32).reshape((3,4)) Y = torch.tensor([[2.0,1,4, 3],[1, 2, 3, 4], [4, 3, 2, 1]])torch.cat((X,Y),dim=0) # 豎直連接,增加行。 torch.cat((X,Y),dim=1) # 橫向連接,增加列print(X == Y) # 結果為Ture 和 Falseprint(X.sum()) # 張量內元素求和 a = torch.arange(3).reshape((3,1)) b = torch.arange(2).reshape((1,2))print(a,b) print(a + b) # 沿著數組中?度為1的軸進??播,矩陣a將復制列,矩陣b將復制?,然后再按元素相加。print(X[-1],X[1:3]) # 索引和切片,與列表相似X[1,2] = 9 # 指定索引來將元素寫?矩陣。 print(X)X[0:2,:] = 12 # 為多個元素賦值相同的值 print(X)A =X.numpy() # 將深度學習框架定義的張量轉換為NumPy張量(ndarray) B = torch.tensor(A) print(type(A), type(B))a = torch.tensor([3.5]) print(a,a.item(), float(a), int(a)) #將?小為1的張量轉換為Python標量A = torch.arange(20).reshape((5,4))print(A) print(A.T) # 轉置A = torch.arange(20,dtype=torch.float32).reshape(5,4) B = A.clone() # 通過分配新內存,將A的?個副本分配給B print(A,A+B)Tensor的合并與拆分
對于需要拼接的張量,維度數量必須相同,進行拼接的維度的尺寸可以不同,但是其它維度的尺寸必須相同。
沿著一個新維度對輸入張量序列進行連接。 序列中所有的張量都應該為相同形狀
>>> x1 = torch.randn(2, 3) >>> x2 = torch.randn(2, 3) >>> torch.stack((x1, x2), 0).size() # 在 0 維插入一個維度,進行區分拼接。也可以對一個張量序列進行拼接,即將多個相同維度的張量合并到一個高維度的張量中。 torch.Size([2, 2, 3]) >>> torch.stack((x1, x2), 1).size() # 在 1 維插入一個維度,進行組合拼接 torch.Size([2, 2, 3]) >>> torch.stack((x1, x2), 2).size() torch.Size([2, 3, 2]) >>> torch.stack((x1, x2), 0) tensor([[[-0.3499, -0.6124, 1.4332],[ 0.1516, -1.5439, -0.1758]],[[-0.4678, -1.1430, -0.5279],[-0.4917, -0.6504, 2.2512]]]) >>> torch.stack((x1, x2), 1) tensor([[[-0.3499, -0.6124, 1.4332],[-0.4678, -1.1430, -0.5279]],[[ 0.1516, -1.5439, -0.1758],[-0.4917, -0.6504, 2.2512]]]) >>> torch.stack((x1, x2), 2) tensor([[[-0.3499, -0.4678],[-0.6124, -1.1430],[ 1.4332, -0.5279]],[[ 0.1516, -0.4917],[-1.5439, -0.6504],[-0.1758, 2.2512]]])數據預處理
import torchA = torch.arange(20,dtype=torch.float32).reshape(5,4) B = A.clone() # 通過分配新內存,將A的?個副本分配給B print(A,'\n',A+B)print(A*B) # 兩個矩陣的按元素乘法稱為Hadamard積# 將張量乘以或加上?個標量不會改變張量的形狀,其中張量的每個元素都將與標量相加或相乘。 a = 2 X = torch.arange(24).reshape(2,3,4) print(a+X,'\n', (a*X).shape)x= torch.arange(4,dtype=torch.float32) print(x,'\n',x.sum())'''為了通過求和所有?的元素來降維(軸0),我們可以在調?函數時指定axis=0。 由于輸?矩陣沿0軸降維以?成輸出向量,因此輸?軸0的維數在輸出形狀中消失。''' A_sum_axis0=A.sum(axis=0) print(A_sum_axis0) print(A_sum_axis0.shape)# 指定axis=1將通過匯總所有列的元素降維(軸1)。因此,輸?軸1的維數在輸出形狀中消失。 A_sum_axis1=A.sum(axis=1) print(A_sum_axis1) print(A_sum_axis1.shape)# 沿著?和列對矩陣求和,等價于對矩陣的所有元素進?求和。 print(A.sum(axis=[0,1])) print(A.sum()) # 和上面一句等價,所有元素求和# 平均值 print(A.mean(),A.sum()/A.numel())# 計算平均值的函數也可以沿指定軸降低張量的維度。 print(A.mean(axis=0),A.sum(axis=0)/A.shape[0])# 計算總和或均值時保持軸數不變 sum_A = A.sum(axis=1,keepdims=True) print(sum_A)# 由于sum_A在對每?進?求和后仍保持兩個軸,我們可以通過?播將A除以sum_A。 print(A/sum_A)'''如果我們想沿某個軸計算A元素的累積總和,?如axis=0(按?計算),我們可以調?cumsum函數。此函數 不會沿任何軸降低輸?張量的維度''' print(A.cumsum(axis=0))# 點積 y = torch.ones(4,dtype=torch.float32) print(x) print(y) print(torch.dot(x,y))'''在代碼中使?張量表?矩陣-向量積,我們使?與點積相同的mv函數. 注意,A的列維數(沿軸1的?度)必須與x的維數(其?度)相同。''' print('矩陣向量積') print(A.shape) print(x.shape) print(torch.mv(A,x))'''將矩陣-矩陣乘法AB看作是簡單地執?m次矩陣-向量積,并將結果拼接在?起,形成?個n*m矩陣。''' B = torch.ones(4,3) print(torch.mm(A,B))# 范數 u = torch.tensor([3.0, -4.0]) print(torch.norm(u)) #這里使用的范數默認是第二范數L2print(torch.abs(u).sum()) # 計算第一范數L1# Frobenius范數(Frobenius norm)是矩陣元素平?和的平?根,它就像是矩陣形向量的L2范數 print(torch.norm(torch.ones((4,9))))torch.matmul(a,b)——高維矩陣乘積
import torcha = torch.ones(3,4) print("a:",a) b = torch.ones(4,2) print("b:", b)print(torch.matmul(a, b))運行截圖
維數相同的高維張量相乘
要求第一維度相同,后兩個維度能滿足矩陣相乘條件。
A.shape =(b,m,n);B.shape = (b,n,k)
numpy.matmul(A,B) 結果shape為(b,m,k)
運行截圖
維數不同的高維張量相乘
比如 A.shape =(m,n); B.shape = (b,n,k); C.shape=(k,l)
numpy.matmul(A,B) 結果shape為(b,m,k)
numpy.matmul(B,C) 結果shape為(b,n,l)
2D張量要和3D張量的后兩個維度滿足矩陣相乘條件。
運行截圖
微積分
import torchimport numpy as np from IPython import display from d2l import torch as d2ldef f(x):return 3*x**2-4*xdef numerical_lim(f,x,h):return (f(x+h)-f(x))/hh=0.1 for i in range(5):print(f'h={h:.5f},numerical_lim={numerical_lim(f,1,h):.5f}')h *= 0.1def use_svg_display(): #@sava'''使用svg格式顯示繪圖'''display.set_matplotlib_formats('svg')def set_figsize(figsize=(3.5,2.5)): #@save'''設置matplotlib的圖表大小'''use_svg_display()d2l.plt.rcParams['figure.figsize'] = figsizedef set_axes(axes,xlabel, ylabel,xlim, ylim, xscale, yscale, legend):'''設置matplotlib的軸'''axes.set_xlabel(xlabel)axes.set_ylabel(ylabel)axes.set_xscale(xscale)axes.set_yscale(yscale)axes.set_xlim(xlim)axes.set_ylim(ylim)if legend:axes.legend(legend)axes.grid()def plot(X,Y=None, xlabel=None,ylabel=None, legend=None, xlim=None,ylim=None,xscale='linear',yscale='linear',fmts=('-','m--', 'g-', 'r:'),figsize=(3.5, 2.5),axes=None):'''繪制數據點'''if legend is None:legend = []set_figsize(figsize)axes = axes if axes else d2l.plt.gca()#如果'X'有一個軸,輸出Truedef has_one_axis(X):return (hasattr(X, 'ndim') and X.ndim == 1 or isinstance(X, list) and nothasattr(X[0], '__len__'))if has_one_axis(X):X=[X]if Y is None:X,Y = [[]]*len(X),Xelif has_one_axis(Y):Y = [Y]if len(X) != len(Y):X = X*len(Y)axes.cla()for x, y, fmt in zip(X, Y, fmts):if len(x):axes.plot(x,y, fmt)else:axes.plot(y,fmt)set_axes(axes,xlabel,ylabel,xlim, ylim,xscale,yscale,legend)d2l.plt.show()x = np.arange(0,3,0.1) plot(x,[f(x), 2*x-3], 'x', 'f(x)', legend=['f(x)', 'Tangent line (x=1)'])自動微分
''' python3.7 -*- coding: UTF-8 -*- @Project -> File :Code -> __init__.py @IDE :PyCharm @Author :YangShouWei @USER: 296714435 @Date :2022/2/19 10:19:49 @LastEditor: '''import torchx = torch.arange(4.0) print("x:",x)x.requires_grad_(True) # 等價于x = torch.arange(4.0, requires_grad=True) print("x.grad:",x.grad) # 默認值是Noney = 2*torch.dot(x,x) print("y:",y)# 調?反向傳播函數來?動計算y關于x每個分量的梯度. y.backward() # 反向傳播 x.grad print("x.grad:",x.grad)x.grad.zero_() y = x.sum() y.backward() print("x.grad:",x.grad)# 非標量變量的反向傳播 #對?標量調?`backward`需要傳??個`gradient`參數,該參數指定微分函數關于`self`的梯度。 # 在我們的例?中,我們只想求偏導數的和,所以傳遞?個1的梯度是合適的 x.grad.zero_() y = x*x# 等價于y.backward(torch.ones(len(x))) y.sum().backward() print("x.grad:",x.grad)x.grad.zero_() # 梯度置0 y = x*x u = y.detach() z = u*x z.sum().backward() print("x.grad==u:",x.grad==u)# 由于記錄了y的計算結果,我們可以隨后在y上調?反向傳播,得到y=x*x關于的x的導數,即2*x。 x.grad.zero_() y.sum().backward() print("x.grad == 2*x:",x.grad == 2*x)# Python 控制流的梯度計算 def f(a):b = a*2while b.norm() < 1000:b=b*2if b.sum() > 0:c = belse:c = 100*breturn c# 計算梯度 a = torch.randn(size=(), requires_grad=True) d = f(a) d.backward()print("a.grad == d/a:",a.grad == d/a)運行截圖
概率
基本概率論
''' python3.7 -*- coding: UTF-8 -*- @Project -> File :Code -> probability @IDE :PyCharm @Author :YangShouWei @USER: 296714435 @Date :2022/2/19 14:46:22 @LastEditor: '''import torch from torch.distributions import multinomial from d2l import torch as d2l# 為了抽取?個樣本,即擲骰?,我們只需傳??個概率向量。 # 輸出是另?個相同?度的向量:它在索引i處的值是采樣結果中i出現的次數。fair_prob = torch.ones([6]) / 6 # 表示骰子的六個面被擲到的概率都是1/6 print(multinomial.Multinomial(1,fair_prob).sample()) # 相當于擲骰子一次,擲到哪個數字,對應位置就顯示1,print(multinomial.Multinomial(10,fair_prob).sample()) # 相當于擲骰子10次,打印的結果是每個面被擲到的次數counts = multinomial.Multinomial(1000,fair_prob).sample() print(counts/1000) # 相對頻率作為估計值# 進行500組實驗,每組抽取10個樣本 counts = multinomial.Multinomial(10,fair_prob).sample((500,)) cum_counts = counts.cumsum(dim=0) estimates = cum_counts / cum_counts.sum(dim=1, keepdims=True)d2l.set_figsize((6, 4.5)) for i in range(6):d2l.plt.plot(estimates[:, i].numpy(),label=("P(die="+str(i+1)+")")) d2l.plt.axhline(y=0.167,color='black',linestyle='dashed') d2l.plt.gca().set_xlabel("Groups of experiments") d2l.plt.gca().set_ylabel("Estimated probability") d2l.plt.legend(); d2l.plt.show()運行截圖
正太分布與平方損失
import math import numpy as np from d2l import torch as d2ldef normal(x, mu, sigma):"""計算正太分布"""p = 1/math.sqrt(2 * math.pi * sigma**2)return p*np.exp(-0.5/sigma**2 * (x-mu)**2)if __name__ == '__main__':#使用numpy進行可視化x = np.arange(-7, 7, 0.01)#均值和標準差對params = [(0, 1),(0, 2),(3,1)]d2l.plot(x, [normal(x, mu, sigma) for mu, sigma in params], xlabel='x',ylabel='p(x)', figsize=(5.5, 4.0),legend=[f'mean {mu}, std{sigma}'for mu, sigma in params])d2l.plt.show()運行截圖
生成數據集
from d2l import torch as d2l import torchdef synthetix_data(w,b, num_examples):"""?成y = Xw + b + 噪聲。""""""返回一個張量,包含從給定參數means,std的離散正態分布中抽取隨機數。 均值means是一個張量,包含每個輸出元素相關的正態分布的均值。std是一個張量,包含每個輸出元素相關的正態分布的標準差。 均值和標準差的形狀不須匹配,但每個張量的元素個數須相同。"""X = torch.normal(0, 1, (num_examples, len(w)))# print(X)y = torch.matmul(X, w) +b # 張量乘法# print(y)y += torch.normal(0, 0.01, y.shape)return X, y.reshape((-1, 1))true_w = torch.tensor([2, -3.4]) true_b = 4.2 features, labels = synthetix_data(true_w, true_b, 1000)d2l.set_figsize() d2l.plt.scatter(features[:,(1)].detach().numpy(), labels.detach().numpy(),1) d2l.plt.show()數據分布圖
總結
以上是生活随笔為你收集整理的动手深度学习——Pytorch 入门语法一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IBM Verse On-Premise
- 下一篇: PyTorch常用的张量创建、变形及运算