深度學習 – 初步認識Torch
文章目錄
- 深度學習 -- 初步認識Torch
- 一,認識人工智能
- 1.1 人工智能的本質
- 1.2 人工智能的實現過程
- 二,認識Torch
- 2.1簡介
- 2.2 概述
- 2.3 Tensor的創建
- 2.3.1 torch.tensor
- 2.3.2 torch.Tensor
- 三,創建線性和隨機張量
- 3.1創建線性張量
- 3.2 隨機張量
- 3.2.1 隨機數種子
- 3.2.2 隨機張量
- 四,Tensor常見屬性
- 4.1常見屬性
- 4.2 切換設備
- 4.3類型轉換
一,認識人工智能
1.1 人工智能的本質
- 本質是數學計算
- 數學是理論關鍵
- 計算機是實現關鍵:算力
- 新的有效算法,需要更大的算力
? NLP(說話,聽)、CV(眼睛)、自動駕駛、機器人(肢體動作)、大模型
1.2 人工智能的實現過程
三要素:數據、網絡、算力
① 神經網絡:找到合適的數學公式;
② 訓練:用已有數據訓練網絡,目標是求最優解;
③ 推理:用模型預測新樣本;
二,認識Torch
2.1簡介
PyTorch是一個基于Python的深度學習框架,它提供了一種靈活、高效、易于學習的方式來實現深度學習模型。PyTorch最初由Facebook開發,被廣泛應用于計算機視覺、自然語言處理、語音識別等領域。
? PyTorch使用張量(tensor)來表示數據,可以輕松地處理大規模數據集,且可以在GPU上加速。
? PyTorch提供了許多高級功能,如**自動微分(automatic differentiation)、自動求導(automatic gradients)**等,這些功能可以幫助我們更好地理解模型的訓練過程,并提高模型訓練效率。
2.2 概述
PyTorch會將數據封裝成張量(Tensor)進行計算,所謂張量就是元素為相同類型的多維矩陣。
張量可以在 GPU 上加速運行。
-
張量是一個多維數組,通俗來說可以看作是擴展了標量、向量、矩陣的更高維度的數組。張量的維度決定了它的形狀(Shape),例如:
-
標量 是 0 維張量,如
a = torch.tensor(5)
-
向量 是 1 維張量,如
b = torch.tensor([1, 2, 3])
-
矩陣 是 2 維張量,如
c = torch.tensor([[1, 2], [3, 4]])
-
更高維度的張量,如3維、4維等,通常用于表示圖像、視頻數據等復雜結構。
-
動態計算圖:PyTorch 支持動態計算圖,這意味著在每一次前向傳播時,計算圖是即時創建的。
-
GPU 支持:PyTorch 張量可以通過
.to('cuda')
移動到 GPU 上進行加速計算。 -
自動微分:通過
autograd
模塊,PyTorch 可以自動計算張量運算的梯度,這對深度學習中的反向傳播算法非常重要。 -
PyTorch中有3種數據類型:浮點數、整數、布爾。其中,浮點數和整數又分為8位、16位、32位、64位,加起來共9種。原因是:場景不同,對數據的精度和速度要求不同。通常,移動或嵌入式設備追求速度,對精度要求相對低一些。精度越高,往往效果也越好,自然硬件開銷就比較高。
-
2.3 Tensor的創建
2.3.1 torch.tensor
根據指定的數據創建張量
import torch#使用tensor創建張量
def text1():t1=torch.tensor([1,2,3],dtype=torch.float32,device='cuda')print(t1)print(t1.shape)print(t1.size())#和shapS作用一樣print(t1.dtype)if __name__ == '__main__':text1()
tensor([1., 2., 3.], device='cuda:0')
torch.Size([3])
torch.Size([3])
torch.float32
2.3.2 torch.Tensor
根據形狀創建張量,其也可用來創建指定數據的張量
#使用Tensor構造函數,構建張量
#強制將數據類型裝換位float32
def text2():t1=torch.Tensor([1,2,3])print(t1)print(t1.size())print(t1.dtype)if __name__ == '__main__':# text1()text2()
python
tensor([1., 2., 3.])
torch.Size([3])
torch.float32
torch.Tensor與torch.tensor區別
特性 | torch.Tensor() | torch.tensor() |
---|---|---|
數據類型推斷 | 強制轉為 torch.float32 | 根據輸入數據自動推斷(如整數→int64 ) |
顯式指定 dtype | 不支持 | 支持(如 dtype=torch.float64 ) |
設備指定 | 不支持 | 支持(如 device='cuda' ) |
輸入為張量時的行為 | 創建新副本(不繼承原屬性) | 默認共享數據(除非 copy=True ) |
推薦使用場景 | 需要快速創建浮點張量 | 需要精確控制數據類型或設備 |
三,創建線性和隨機張量
3.1創建線性張量
import torch
import numpy as np
# 設置打印精度
torch.set_printoptions(sci_mode=False)def test01():#創建線性張量r1=torch.arange(1,10,2)print(r1)#在指定空間按照元素個數生成張量r2=torch.linspace(1,10,10)#創建一個從一到十的線性張量print(r2)r3=torch.linspace(3,10000,10)#創建一個從3到10000的線性張量print(r3)if __name__ == '__main__':test01()
tensor([1, 3, 5, 7, 9])
tensor([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
tensor([ 3.0000, 1113.7778, 2224.5557, 3335.3335, 4446.1113, 5556.8887,6667.6665, 7778.4443, 8889.2227, 10000.0000])
3.2 隨機張量
使用torch.randn 創建隨機張量
3.2.1 隨機數種子
隨機數種子(Random Seed)是一個用于初始化隨機數生成器的數值。隨機數生成器是一種算法,用于生成一個看似隨機的數列,但如果使用相同的種子進行初始化,生成器將產生相同的數列。
import torchdef test01():torch.manual_seed(1)print(torch.initial_seed())
1
3.2.2 隨機張量
在 PyTorch 中,種子影響所有與隨機性相關的操作,包括張量的隨機初始化、數據的隨機打亂、模型的參數初始化等。通過設置隨機數種子,可以做到模型訓練和實驗結果在不同的運行中進行復現。
def test02():#首先設置隨機數種子torch.manual_seed(225)#生成一個5*5的矩陣,1到3的隨機數x = torch.randint(1, 6, (5, 5))print(x)#randn 生成正太分布的隨機數Ss1=torch.randn(2,3)print(s1)
tensor([[5, 1, 5, 3, 3],[2, 5, 4, 3, 2],[1, 4, 3, 2, 3],[1, 2, 5, 3, 4],[4, 1, 5, 5, 2]])
tensor([[ 0.5403, 1.1903, 0.5832],[ 1.5792, 1.5763, -0.6938]])
四,Tensor常見屬性
張量有device、dtype、shape等常見屬性
4.1常見屬性
import torchdef test01():x = torch.tensor([1, 2, 3])print(x.dtype)# torch.int64print(x.device)# cpuprint(x.requires_grad)# Falseprint(x.shape)# torch.Size([3]),表示一維向量,長度為3print(x.size())# torch.Size([3]),表示一維向量,長度為3print(x.ndimension())# 1,張量維度print(x.numel())# 3,元素總數print(x.dim())# 1,張量維度數if __name__ == '__main__':test01()
torch.int64
cpu
False
torch.Size([3])
torch.Size([3])
1
3
1
4.2 切換設備
import torchdef test01():#在創建當量時制定devicex = torch.randint(1, 3, (5, 5), device='cuda')print(x)#使用to方法將數據移動到GPU#轉換后要重新賦值y=torch.tensor([1,2,3])y = y.to('cuda')print(y.device)#使用cuda()或cpu()方法 z=torch.tensor([1,2,3],device='cuda')z=z.cpu()print(z.device)if __name__ == '__main__':test01()
tensor([[2, 2, 1, 2, 2],[1, 2, 1, 2, 1],[1, 1, 2, 1, 1],[1, 2, 1, 2, 2],[2, 2, 2, 1, 2]], device='cuda:0')
cuda:0
cpu
4.3類型轉換
import torchdef test01():#在創建當量時制定devicex = torch.randint(1, 3, (5, 5), device='cuda')print(x)#使用to方法將數據移動到GPU#轉換后要重新賦值y=torch.tensor([1,2,3])y = y.to('cuda')print(y.device)#使用cuda()或cpu()方法 z=torch.tensor([1,2,3],device='cuda')z=z.cpu()print(z.device)def test02():data = torch.tensor([1,2,3])#創建張量print(data.dtype)#使用type()方法轉換數據類型data = data.type(torch.float32)print(data.dtype)data = data.type(torch.int32)print(data.dtype)#使用類型方法data = data.float()#轉換為float32print(data.dtype)data = data.int()#轉換為int32print(data.dtype)data = data.long()#轉換為int64print(data.dtype)data = data.short()#轉換為int16print(data.dtype)#使用dtype屬性data = torch.tensor([1,2,3],dtype=torch.float32)#轉換為float32print(data.dtype)if __name__ == '__main__':# test01()test02()
torch.int64
torch.float32
torch.int32
torch.float32
torch.int32
torch.int64
torch.int16
torch.float32