一、PyTorch簡介與安裝
1.核心概念
????????PyTorch 是一款 Python 深度學習框架,其核心是張量(Tensor)?—— 元素為同一種數據類型的多維矩陣,以 “類” 的形式封裝,內置了張量運算、處理等方法,是深度學習中數據存儲和計算的基礎單元。
2.安裝命令
????????pip install torch===1.10.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
二、張量的創建與類型轉換
1.基本創建方式
創建函數 | 功能描述 | 示例代碼 | 輸出結果 |
---|---|---|---|
torch.tensor() | 根據指定數據(標量、列表、NumPy 數組等)創建張量,自動匹配數據類型 | torch.tensor(10) torch.tensor([[10.,20.,30.],[40.,50.,60.]]) | tensor(10) tensor([[10.,20.,30.],[40.,50.,60.]]) |
torch.Tensor() | 1. 傳入形狀參數時,創建指定形狀的未初始化張量(默認float32 )2. 傳入列表時,創建包含指定元素的張量 | torch.Tensor(2,3) torch.Tensor([10,20]) | tensor([[0.0000e+00, 3.6893e+19, 2.2018e+05],[4.6577e-10, 2.4158e-12, 1.1625e+33]]) tensor([10.,20.]) |
torch.IntTensor()/FloatTensor()/DoubleTensor() | 創建指定數據類型的張量,支持形狀參數或元素列表(元素會自動類型轉換) | torch.IntTensor(2,3) torch.IntTensor([2.5,3.3]) | tensor([[0, 1610612736, 1213662609],[805308409, 156041223, 1]], dtype=torch.int32) tensor([2,3], dtype=torch.int32) |
2.線性與隨機張量創建
? ? ? ? 線性張量
? ? ? ? ? ? ? ? torch.arange(start,end,step):在(start,end)區間內按步長step
生成 1 維張量,元素類型為int64。示例:torch.arange(0,10,2)
?→?tensor([0,2,4,6,8])
。
? ? ? ? ? ? ? ? torch.linspace(start,end,step):在[start, end]
區間內生成steps
個等間隔元素的 1 維張量,默認float32
。示例:troch.linspace(0,11,10)-->tensor([0.00,1.22,...,11.00])。
????????隨機張量與種子設置
? ? ? ? torch.randn(shape):生成符合標準正態分布(均值 0、方差 1)的指定形狀張量,默認float32
。示例:torch.randn(2,3)
?→ 2 行 3 列的隨機張量。
? ? ? ? 隨機種子:torch.random.manual_seed(seed)
固定隨機種子,確保每次運行生成相同的隨機張量;torch.random.initial_seed()
查看當前隨機種子。示例:
torch.random.manual_seed(100)
print(torch.randn(2,3)) # 每次運行結果一致
print(torch.random.initial_seed()) # 輸出100
3.0-1及指定值張量創建
? ? ? ? 全1張量:torch.ones(shape)
創建指定形狀全 1 張量;torch.ones_like(tensor)
根據已有張量形狀創建全 1 張量,示例:
data = torch.ones(2,3) # tensor([[1.,1.,1.],[1.,1.,1.]])
data_like = torch.ones_like(data) # 與data形狀相同的全1張量
? ? ? ? 全0張量:torch.zeros(shape)
創建指定形狀全 0 張量;torch.zeros_like(tensor)
根據已有張量形狀創建全 0 張量,用法與全 1 張量一致。
? ? ? ? 指定量張量:torch.full(shape, value)
創建指定形狀、元素均為value
的張量;torch.full_like(tensor, value)
根據已有張量形狀創建指定值張量,示例:
data = torch.full([2,3],10) # tensor([[10,10,10],[10,10,10]])
data_like = torch.full_like(data,20) # 元素均為20的張量
4.張量類型轉換
? ? ? ? data.type(torch.目標類型)顯式指定目標類型,支持torch.ShortTensor
(int16)、torch.IntTensor
(int32)、torch.LongTensor
(int64)、torch.FloatTensor
(float32)、torch.DoubleTensor
(float64)。
data = torch.full([2,3],10) # dtype=torch.int64
data = data.type(torch.DoubleTensor) # dtype=torch.float64
? ? ? ? data.目標類型縮寫():快捷轉換方法,如data.short()
(轉 int16)、data.int()
(轉 int32)、data.long()
(轉 int64)、data.float()
(轉 float32)、data.double()
(轉 float64)。
data = torch.full([2,3],10) # dtype=torch.int64
data = data.double() # dtype=torch.float64
三、張量與其他數據類型的轉換
1.張量轉numpy數組
? ? ? ? 方法:data_tensor.numpy(),默認共享內存(修改一個,另一個同步變化);若需避免共享,使用data_tensor.numpy().copy()。
# 共享內存
data_tensor = torch.tensor([2,3,4])
data_numpy = data_tensor.numpy()
data_numpy[0] = 100 # data_tensor也變為tensor([100,3,4])# 不共享內存
data_numpy = data_tensor.numpy().copy()
data_numpy[0] = 200 # data_tensor仍為tensor([100,3,4])
2.numpy數組轉張量
轉換方法 | 內存共享情況 | 示例代碼 | 輸出結果 |
---|---|---|---|
torch.from_numpy(data_numpy) | 默認共享內存 | data_numpy = np.array([2,3,4]) data_tensor = torch.from_numpy(data_numpy) | tensor([2,3,4], dtype=torch.int32) (與 NumPy 數組類型匹配) |
torch.tensor(data_numpy) | 默認不共享內存 | data_tensor = torch.tensor(data_numpy) |
|
3.標量張量與數字轉換
? ? ? ? 對于僅含一個元素的張量(標量張量),使用data.item()
提取 Python 原生數字類型(如int
、float
)。示例:
data1 = torch.tensor([30,]) # 標量張量
data2 = torch.tensor(30) # 標量張量
print(data1.item()) # 30(int類型)
print(data2.item()) # 30(int類型)
四、張量數值計算與運算函數
1.基本運算
支持加減乘除、取負等操作,分為不修改原張量和修改原張量(函數名帶下劃線)兩類,示例:
data = torch.randint(0,10,[2,3]) # 示例:tensor([[3,7,4],[0,0,6]])# 不修改原張量
new_data = data.add(10) # 等價于data + 10 → tensor([[13,17,14],[10,10,16]])
new_data = data.sub(5) # 等價于data - 5
new_data = data.mul(2) # 等價于data * 2
new_data = data.div(2) # 等價于data / 2
new_data = data.neg() # 等價于-data# 修改原張量
data.add_(10) # data變為tensor([[13,17,14],[10,10,16]])
data.sub_(5) # data進一步修改
2.點乘與矩陣乘法
????????點乘(Hadamard積):兩個同形狀張量對應元素相乘,使用torch.mul(data1, data2)
或data1 * data2
。示例:
data1 = torch.tensor([[1,2],[3,4]])
data2 = torch.tensor([[5,6],[7,8]])
print(torch.mul(data1, data2)) # tensor([[5,12],[21,32]])
print(data1 * data2) # 同上
? ? ? ? 矩陣乘法:要求第一個張量的列數等于第二個張量的行數(形狀為(n,m)
和(m,p)
,結果為(n,p)
),使用data1 @ data2
或torch.matmul(data1, data2)
。示例:
data1 = torch.tensor([[1,2],[3,4],[5,6]]) # (3,2)
data2 = torch.tensor([[5,6],[7,8]]) # (2,2)
print(data1 @ data2) # tensor([[19,22],[43,50],[67,78]])(3,2)
print(torch.matmul(data1, data2)) # 同上
3.常見運算函數
函數 | 功能描述 | 示例代碼 | 輸出結果(基于data = torch.tensor([[4.,0.,7.],[6.,3.,5.]], dtype=torch.float64) ) |
---|---|---|---|
data.mean(dim=None) | 計算均值,dim=0 按列算,dim=1 按行算 | data.mean() data.mean(dim=0) | tensor(4.1667, dtype=torch.float64) tensor([5.0000,1.5000,6.0000], dtype=torch.float64) |
data.sum(dim=None) | 計算總和,dim 參數用法同mean | data.sum() data.sum(dim=1) | tensor(25., dtype=torch.float64) tensor([11.,14.], dtype=torch.float64) |
torch.pow(data, n) | 計算元素的 n 次冪 | torch.pow(data,2) | tensor([[16.,0.,49.],[36.,9.,25.]], dtype=torch.float64) |
data.sqrt() | 計算元素的平方根 | data.sqrt() | tensor([[2.0000,0.0000,2.6458],[2.4495,1.7321,2.2361]], dtype=torch.float64) |
data.exp() | 計算元素的自然指數(e^x) | data.exp() | tensor([[5.4598e+01,1.0000e+00,1.0966e+03],[4.0343e+02,2.0086e+01,1.4841e+02]], dtype=torch.float64) |
data.log()/log2()/log10() | 分別計算自然對數、2 為底對數、10 為底對數 | data.log() data.log10() | tensor([[1.3863, -inf,1.9459],[1.7918,1.0986,1.6094]], dtype=torch.float64) tensor([[0.6021, -inf,0.8451],[0.7782,0.4771,0.6990]], dtype=torch.float64) |