企業(yè)手機(jī)網(wǎng)站建百度競價
Day 48
- PyTorch 隨機(jī)張量生成與廣播機(jī)制詳解
- 一、隨機(jī)張量的生成:”
- 1.1 torch.randn 函數(shù):”
- 1.2 其他隨機(jī)函數(shù):”
- 1.3 輸出維度測試:”
- 二、廣播機(jī)制:”
- 2.1 廣播機(jī)制原理:”
- 2.2 廣播實例:”
- 2.3 乘法的廣播機(jī)制:矩陣運(yùn)算中的 “巧妙搭配”
PyTorch 隨機(jī)張量生成與廣播機(jī)制詳解
在深度學(xué)習(xí)的探索之旅中,PyTorch 作為強(qiáng)大的開源機(jī)器學(xué)習(xí)庫,為我們提供了諸多便捷的功能。今天,就讓我們一同深入探究 PyTorch 中隨機(jī)張量生成以及廣播機(jī)制的奧秘,解鎖高效張量操作的新技能。
一、隨機(jī)張量的生成:”
在深度學(xué)習(xí)的諸多場景里,隨機(jī)生成張量都有著舉足輕重的地位。無論是模型權(quán)重的初始化,還是計算輸入維度經(jīng)過模塊后的輸出維度,在開發(fā)和測試階段,隨機(jī)張量都能讓我們擺脫對真實數(shù)據(jù)的依賴,快速推進(jìn)實驗進(jìn)程。
1.1 torch.randn 函數(shù):”
torch.randn()
憑借其簡潔的語法與強(qiáng)大的功能,成為生成隨機(jī)張量的常用之選。它能依據(jù)標(biāo)準(zhǔn)正態(tài)分布(均值 0,標(biāo)準(zhǔn)差 1)生成填充的張量,為模型參數(shù)初始化、測試數(shù)據(jù)生成以及模擬輸入特征等場景提供了極大便利。
-
函數(shù)簽名與參數(shù)剖析 :
torch.randn(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
size
:必選參數(shù),精準(zhǔn)定義輸出張量的形狀,例如(3, 4)
即構(gòu)建 3 行 4 列的矩陣。dtype
:可選參數(shù),用于指定張量的數(shù)據(jù)類型,如torch.float32
、torch.int64
等。device
:可選參數(shù),明確張量存儲的設(shè)備,是cpu
還是cuda
。requires_grad
:可選參數(shù),決定張量是否需要計算梯度,在模型訓(xùn)練時尤為關(guān)鍵。
-
示例演繹 :
import torch# 標(biāo)量(0 維張量)生成
scalar = torch.randn(())
print(f"標(biāo)量: {scalar}, 形狀: {scalar.shape}") # 向量(1 維張量)打造
vector = torch.randn(5)
print(f"向量: {vector}, 形狀: {vector.shape}") # 矩陣(2 維張量)構(gòu)造
matrix = torch.randn(3, 4)
print(f"矩陣:{matrix},矩陣形狀: {matrix.shape}") # 3 維張量(常用于圖像數(shù)據(jù))塑造
tensor_3d = torch.randn(3, 224, 224)
print(f"3 維張量形狀: {tensor_3d.shape}") # 4 維張量(批量圖像數(shù)據(jù))雕琢
tensor_4d = torch.randn(2, 3, 224, 224)
print(f"4 維張量形狀: {tensor_4d.shape}")
1.2 其他隨機(jī)函數(shù):”
除了 torch.randn()
,PyTorch 還提供了其他生成不同分布隨機(jī)數(shù)的函數(shù),滿足多樣化的應(yīng)用場景:
- torch.rand() :在
[0, 1)
范圍內(nèi)均勻分布的隨機(jī)數(shù)生成。
x = torch.rand(3, 2)
print(f"均勻分布隨機(jī)數(shù): {x}, 形狀: {x.shape}")
- torch.randint() :生成指定范圍內(nèi)的隨機(jī)整數(shù)。
x = torch.randint(low=0, high=10, size=(3,))
print(f"隨機(jī)整數(shù): {x}, 形狀: {x.shape}")
- torch.normal() :生成指定均值和標(biāo)準(zhǔn)差的正態(tài)分布隨機(jī)數(shù)。
mean = torch.tensor([0.0, 0.0])
std = torch.tensor([1.0, 2.0])
x = torch.normal(mean, std)
print(f"正態(tài)分布隨機(jī)數(shù): {x}, 形狀: {x.shape}")
1.3 輸出維度測試:”
在深度學(xué)習(xí)模型搭建過程中,精準(zhǔn)把握每一層輸出張量的形狀至關(guān)重要。借助隨機(jī)張量生成與打印輸出,我們能輕松追蹤尺寸變化:
import torch
import torch.nn as nn# 生成輸入張量 (批量大小, 通道數(shù), 高度, 寬度)
input_tensor = torch.randn(1, 3, 32, 32)
print(f"輸入尺寸: {input_tensor.shape}") # 1. 卷積層操作
conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1
)
conv_output = conv1(input_tensor)
print(f"卷積后尺寸: {conv_output.shape}") # 2. 池化層操作 (減小空間尺寸)
pool = nn.MaxPool2d(kernel_size=2, stride=2)
pool_output = pool(conv_output)
print(f"池化后尺寸: {pool_output.shape}") # 3. 將多維張量展平為向量
flattened = pool_output.view(pool_output.size(0), -1)
print(f"展平后尺寸: {flattened.shape}") # 4. 線性層操作
fc1 = nn.Linear(in_features=4096, out_features=128
)
fc_output = fc1(flattened)
print(f"線性層后尺寸: {fc_output.shape}") # 5. 再經(jīng)過一個線性層(例如分類器)
fc2 = nn.Linear(128, 10)
final_output = fc2(fc_output)
print(f"最終輸出尺寸: {final_output.shape}")
print(final_output)# 使用Softmax替代Sigmoid
softmax = nn.Softmax(dim=1)
class_probs = softmax(final_output)
print(f"Softmax輸出: {class_probs}")
print(f"Softmax輸出總和: {class_probs.sum():.4f}")
這種維度測試方式,在非交互式環(huán)境如 PyCharm 中,配合斷點與調(diào)試控制臺,能有效避免維度不匹配的報錯,保障模型搭建的順利推進(jìn)。
二、廣播機(jī)制:”
PyTorch 的廣播機(jī)制,賦予了不同形狀張量間進(jìn)行算術(shù)運(yùn)算的 “超能力”,無需顯式擴(kuò)展或復(fù)制數(shù)據(jù),極大簡化了代碼,提升運(yùn)算效率。
2.1 廣播機(jī)制原理:”
當(dāng)對形狀不同的張量進(jìn)行運(yùn)算時,PyTorch 依照以下規(guī)則巧妙處理維度兼容性:
-
從右向左比較維度 :從張量的最后一個維度(最右側(cè))開始向前逐維比較。
-
維度擴(kuò)展條件 :
- 相等維度 :若兩個張量在某一維度上大小相同,則繼續(xù)比較下一維度。
- 一維擴(kuò)展 :若其中一個張量的某個維度大小為 1,則該維度會被擴(kuò)展為另一個張量對應(yīng)維度的大小。
- 不兼容錯誤 :若某一維度大小既不相同也不為 1,則拋出
RuntimeError
。
-
維度補(bǔ)全規(guī)則 :若一個張量的維度少于另一個,則在其左側(cè)補(bǔ) 1 直至維度數(shù)匹配。
2.2 廣播實例:”
- 二維張量與一維向量相加 :
import torch# 創(chuàng)建原始張量
a = torch.tensor([[10], [20], [30]]) # 形狀: (3, 1)
b = torch.tensor([1, 2, 3]) # 形狀: (3,)result = a + bprint("原始張量a:")
print(a)print("\n原始張量b:")
print(b)print("\n加法結(jié)果:")
print(result)
- 三維張量與二維張量相加 :
# 創(chuàng)建原始張量
a = torch.tensor([[[1], [2]], [[3], [4]]]) # 形狀: (2, 2, 1)
b = torch.tensor([[10, 20]]) # 形狀: (1, 2)# 廣播過程
result = a + b
print("原始張量a:")
print(a)print("\n原始張量b:")
print(b)print("\n加法結(jié)果:")
print(result)
- 二維張量與標(biāo)量相加 :
# 創(chuàng)建原始張量
a = torch.tensor([[1, 2], [3, 4]]) # 形狀: (2, 2)
b = 10 # 標(biāo)量,形狀視為 ()# 廣播過程
result = a + b
print("原始張量a:")
print(a)print("\n標(biāo)量b:")
print(b)print("\n加法結(jié)果:")
print(result)
- 高維張量與低維張量相加 :
# 創(chuàng)建原始張量
a = torch.tensor([[[1, 2], [3, 4]]]) # 形狀: (1, 2, 2)
b = torch.tensor([[5, 6]]) # 形狀: (1, 2)# 廣播過程
result = a + b
print("原始張量a:")
print(a)print("\n原始張量b:")
print(b)print("\n加法結(jié)果:")
print(result)
2.3 乘法的廣播機(jī)制:矩陣運(yùn)算中的 “巧妙搭配”
矩陣乘法除了遵循通用廣播規(guī)則,在維度約束上還有特殊要求:
-
最后兩個維度的適配 :A.shape[-1] == B.shape[-2],即 A 的列數(shù)等于 B 的行數(shù)。
-
其他維度(批量維度)的廣播 :遵循通用廣播規(guī)則。
-
批量矩陣與單個矩陣相乘 :
# A: 批量大小為2,每個是3×4的矩陣
A = torch.randn(2, 3, 4) # 形狀: (2, 3, 4)# B: 單個4×5的矩陣
B = torch.randn(4, 5) # 形狀: (4, 5)# 廣播過程:
result = A @ B # 結(jié)果形狀: (2, 3, 5)print("A形狀:", A.shape)
print("B形狀:", B.shape)
print("結(jié)果形狀:", result.shape)
- 批量矩陣與批量矩陣相乘(部分廣播) :
# A: 批量大小為3,每個是2×4的矩陣
A = torch.randn(3, 2, 4) # 形狀: (3, 2, 4)# B: 批量大小為1,每個是4×5的矩陣
B = torch.randn(1, 4, 5) # 形狀: (1, 4, 5)# 廣播過程:
result = A @ B # 結(jié)果形狀: (3, 2, 5)print("A形狀:", A.shape)
print("B形狀:", B.shape)
print("結(jié)果形狀:", result.shape)
- 三維張量與二維張量相乘(高維廣播) :
# A: 批量大小為2,通道數(shù)為3,每個是4×5的矩陣
A = torch.randn(2, 3, 4, 5) # 形狀: (2, 3, 4, 5)# B: 單個5×6的矩陣
B = torch.randn(5, 6) # 形狀: (5, 6)# 廣播過程:
result = A @ B # 結(jié)果形狀: (2, 3, 4, 6)print("A形狀:", A.shape)
print("B形狀:", B.shape)
print("結(jié)果形狀:", result.shape)
@浙大疏錦行