日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

【深度学习】深度学习之Pytorch基础教程!

發(fā)布時間:2025/3/8 pytorch 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【深度学习】深度学习之Pytorch基础教程! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者:李祖賢,Datawhale高校群成員,深圳大學(xué)

隨著深度學(xué)習的發(fā)展,深度學(xué)習框架開始大量的出現(xiàn)。尤其是近兩年,Google、Facebook、Microsoft等巨頭都圍繞深度學(xué)習重點投資了一系列新興項目,他們也一直在支持一些開源的深度學(xué)習框架。目前研究人員正在使用的深度學(xué)習框架不盡相同,有 TensorFlow 、Pytorch、Caffe、Theano、Keras等。

這其中,TensorFlow和Pytorch占據(jù)了深度學(xué)習的半壁江山。前幾天分享了TensorFlow的基本教程后,很多人在后臺留言說能不能寫寫Pytorch入門。本著粉絲的訴求必須滿足的原則,熬夜干,有了今天的文章。所以你懂我意思吧,記得轉(zhuǎn)發(fā)、點贊、在看三聯(lián)。

本文結(jié)合Pytorch官方教程、邱錫鵬老師的《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習》和李沐老師的《動手學(xué)深度學(xué)習》,為大家介紹的一下Pytorch深度學(xué)習框架。具體目錄如下:

一、數(shù)據(jù)操作

import torch

1.1 創(chuàng)建TENSOR

# 創(chuàng)建未初始化的Tensor x = torch.empty(5,3) print(x)

# 創(chuàng)建隨機初始化的Tensor x = torch.rand(5,3) print(x)

# 創(chuàng)建全為0的Tensor x = torch.zeros(5,3,dtype=torch.long) print(x)

# 根據(jù)數(shù)據(jù)創(chuàng)建Tensor x = torch.tensor([5.5,3]) print(x)

# 修改原Tensor為全1的Tensor x = x.new_ones(5,3,dtype=torch.float64) print(x)# 修改數(shù)據(jù)類型 x = torch.rand_like(x,dtype=torch.float64) print(x)

# 獲取Tensor的形狀 print(x.size()) print(x.shape) # 注意:返回的torch.Size其實就是?一個tuple, ?支持所有tuple的操作。


這些創(chuàng)建方法都可以在創(chuàng)建的時候指定數(shù)據(jù)類型dtype和存放device(cpu/gpu)。

1.2 操作

1.2.1 算術(shù)操作

在PyTorch中,同?種操作可能有很多種形式,下?面?用加法作為例子。

# 形式1: y = torch.rand(5,3) print(x+y)

# 形式2 print(torch.add(x,y)) # 還可以指定輸出 result = torch.empty(5, 3) torch.add(x, y, out=result) print(result)

# 形式3 y.add_(x) print(y)

1.2.2 索引

我們還可以使?類似NumPy的索引操作來訪問 Tensor 的一部分,需要注意的是:索引出來的結(jié)果與原數(shù)據(jù)共享內(nèi)存,也即修改?個,另?個會跟著修改。

y = x[0,:] y += 1 print(y) print(x[0,:]) # 觀察x是否改變了

1.2.3 改變形狀

注意 view() 返回的新tensor與源tensor共享內(nèi)存(其實是同?個tensor),也即更改其中的?個,另 外?個也會跟著改變。(顧名思義,view僅是改變了對這個張量的觀察角度)

y = x.view(15) z = x.view(-1,5) # -1所指的維度可以根據(jù)其他維度的值推出來 print(x.size(),y.size(),z.size())

x += 1 print(x) print(y)

所以如果我們想返回?個真正新的副本(即不共享內(nèi)存)該怎么辦呢?Pytorch還提供了? 個 reshape() 可以改變形狀,但是此函數(shù)并不能保證返回的是其拷貝,所以不推薦使用。推薦先 ? clone 創(chuàng)造一個副本然后再使? view 。

x_cp = x.clone().view(15) x -= 1 print(x) print(x_cp)

另外?個常用的函數(shù)就是 item() , 它可以將?個標量 Tensor 轉(zhuǎn)換成?個Python

number:x = torch.randn(1) print(x) print(x.item())


1.2.4 線性代數(shù)

官方文檔:https://pytorch.org/docs/stable/torch.html

1.3 廣播機制

前?我們看到如何對兩個形狀相同的 Tensor 做按元素運算。當對兩個形狀不同的 Tensor 按元素運算時,可能會觸發(fā)廣播(broadcasting)機制:先適當復(fù)制元素使這兩個 Tensor 形狀相同后再按元素運算。例如:

x = torch.arange(1,3).view(1,2) print(x) y = torch.arange(1,4).view(3,1) print(y) print(x+y)

1.4 Tensor和Numpy相互轉(zhuǎn)化

我們很容易? numpy() 和 from_numpy() 將 Tensor 和NumPy中的數(shù)組相互轉(zhuǎn)換。但是需要注意的?點是:這兩個函數(shù)所產(chǎn)生的的 Tensor 和NumPy中的數(shù)組共享相同的內(nèi)存(所以他們之間的轉(zhuǎn)換很快),改變其中?個時另?個也會改變!!!

a = torch.ones(5) b = a.numpy() print(a,b)

a += 1 print(a,b)

b += 1 print(a,b)

使? from_numpy() 將NumPy數(shù)組轉(zhuǎn)換成 Tensor :

import numpy as np a = np.ones(5) b = torch.from_numpy(a) print(a,b)

a += 1 print(a,b) b += 1 print(a,b)

1.5 GPU運算

# let us run this cell only if CUDA is available # We will use ``torch.device`` objects to move tensors in and out of GPU if torch.cuda.is_available():device = torch.device("cuda") # a CUDA device objecty = torch.ones_like(x, device=device) # directly create a tensor on GPUx = x.to(device) # or just use strings ``.to("cuda")``z = x + yprint(z)print(z.to("cpu", torch.double)) # ``.to`` can also change dtype together!

二、自動求梯度(非常重要)

很多人看到這里是懵的,因為為什么會得出導(dǎo)數(shù)的結(jié)果,在這里我給出自動求導(dǎo)的一些原理性的知識,希望能幫助大家更好的學(xué)習pytorch這個重要的框架。

該autograd軟件包是PyTorch中所有神經(jīng)網(wǎng)絡(luò)的核心。讓我們首先簡要地訪問它,然后我們將去訓(xùn)練我們的第一個神經(jīng)網(wǎng)絡(luò)。

該autograd軟件包可自動區(qū)分張量上的所有操作。這是一個按運行定義的框架,這意味著您的backprop是由代碼的運行方式定義的,并且每次迭代都可以不同。

如果想了解數(shù)值微分數(shù)值積分和自動求導(dǎo)的知識,可以查看邱錫鵬老師的《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習》第四章第五節(jié):

下載地址:https://nndl.github.io/

在這里簡單說說自動微分的原理吧:我們的目標是求

??

在??處的導(dǎo)數(shù)。我們的做法是利用鏈式法則分解為一系列的操作:

2.1 張量及張量的求導(dǎo)(Tensor)

# 加入requires_grad=True參數(shù)可追蹤函數(shù)求導(dǎo) x = torch.ones(2,2,requires_grad=True) print(x) print(x.grad_fn)

# 進行運算 y = x + 2 print(y) print(y.grad_fn) # 創(chuàng)建了一個加法操作<AddBackward0 object at 0x0000017AF2F86EF0>

像x這種直接創(chuàng)建的稱為葉子節(jié)點,葉子節(jié)點對應(yīng)的 grad_fn 是 None 。

print(x.is_leaf,y.is_leaf)

# 整點復(fù)雜的操作 z = y * y * 3 out = z.mean() print(z,out)

.requires_grad_( ... )改變requires_grad 的屬性。
a = torch.randn(2,2) # 缺失情況下默認 requires_grad = False a = ((a*3)/(a-1)) print(a.requires_grad) # False a.requires_grad_(True) print(a.requires_grad) b = (a*a).sum() print(b.grad_fn)

2.2 梯度

現(xiàn)在讓我們反向傳播:因為out包含單個標量,out.backward()所以等效于out.backward(torch.tensor(1.))。

out.backward() print(x.grad)

# 再來反向傳播?次,注意grad是累加的 out2 = x.sum() out2.backward() print(x.grad)out3 = x.sum() x.grad.data.zero_() out3.backward() print(x.grad)

三、神經(jīng)網(wǎng)絡(luò)設(shè)計的pytorch版本

這是一個簡單的前饋網(wǎng)絡(luò)。它獲取輸入,將其一層又一層地饋入,然后最終給出輸出。神經(jīng)網(wǎng)絡(luò)的典型訓(xùn)練過程如下:

  • 定義具有一些可學(xué)習參數(shù)(或權(quán)重)的神經(jīng)網(wǎng)絡(luò)

  • 遍歷輸入數(shù)據(jù)集

  • 通過網(wǎng)絡(luò)處理輸入

  • 計算損失(輸出正確的距離有多遠)

  • 將梯度傳播回網(wǎng)絡(luò)參數(shù)

  • 通常使用簡單的更新規(guī)則來更新網(wǎng)絡(luò)的權(quán)重:weight = weight - learning_rate * gradient

3.1 定義網(wǎng)絡(luò)import torch import torch.nn as nn import?torch.nn.functional?as?Fclass Net(nn.Module):def __init__(self):super(Net,self).__init__()# 1 input image channel, 6 output channels, 3x3 square convolution# kernelself.conv1 = nn.Conv2d(1,6,3)self.conv2 = nn.Conv2d(6,16,3)# an affine operation: y = Wx + bself.fc1 = nn.Linear(16*6*6,120) # 6*6 from image dimensionself.fc2 = nn.Linear(120,84)self.fc3 = nn.Linear(84,10)def forward(self,x):# Max pooling over a (2, 2) windowx = F.max_pool2d(F.relu(self.conv1(x)),(2,2)) # CLASStorch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)x = F.max_pool2d(F.relu(self.conv2(x)),2)x = x.view(-1,self.num_flat_features(x))x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return xdef num_flat_features(self,x):size = x.size()[1:] # all dimensions except the batch dimensionnum_features = 1for s in size:num_features *= sprint(num_features)return num_featuresnet = Net() print(net)

# 模型的可學(xué)習參數(shù)由返回 net.parameters() params = list(net.parameters()) print(len(params)) print(params[0].size()) # conv1's .weight

# 嘗試一個32x32隨機輸入 input = torch.randn(1,1,32,32) out = net(input) print(out)

# 用隨機梯度將所有參數(shù)和反向傳播器的梯度緩沖區(qū)歸零: net.zero_grad() out.backward(torch.randn(1,10))

3.2 損失函數(shù)

output = net(input) target = torch.randn(10) # a dummy target, for example target = target.view(-1,1) # # make it the same shape as output criterion = nn.MSELoss()loss = criterion(output,target) print(loss)

我們現(xiàn)在的網(wǎng)絡(luò)結(jié)構(gòu):

# 如果loss使用.grad_fn屬性的屬性向后移動,可查看網(wǎng)絡(luò)結(jié)構(gòu) print(loss.grad_fn) # MSELoss print(loss.grad_fn.next_functions[0][0]) # Linear print(loss.grad_fn.next_functions[0][0].next_functions[0][0]) # ReLU

3.3 更新權(quán)重

實踐中使用的最簡單的更新規(guī)則是隨機梯度下降(SGD):

weight = weight - learning_rate * gradient

import torch.optim as optim# create your optimizer optimizer = optim.SGD(net.parameters(),lr = 0.01)# in your training loop: optimizer.zero_grad() # zero the gradient buffers output = net(input) loss = criterion(output,target) loss.backward() optimizer.step()

576

四、寫到最后

今天,要講的Pytorch基礎(chǔ)教程到這里就結(jié)束了,相信大家通過上邊的學(xué)習已經(jīng)對Pytorch基礎(chǔ)教程有了初步的了解。

關(guān)于Pytorch的項目實踐,阿里天池「零基礎(chǔ)入門NLP」學(xué)習賽中提供了Pytorch版實踐教程,供學(xué)習參考(閱讀原文直接跳轉(zhuǎn)):

https://tianchi.aliyun.com/competition/entrance/531810/forum

往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習及深度學(xué)習筆記等資料打印機器學(xué)習在線手冊深度學(xué)習筆記專輯《統(tǒng)計學(xué)習方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機器學(xué)習的數(shù)學(xué)基礎(chǔ)專輯獲取一折本站知識星球優(yōu)惠券,復(fù)制鏈接直接打開:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群請掃碼進群:

總結(jié)

以上是生活随笔為你收集整理的【深度学习】深度学习之Pytorch基础教程!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。