知識點回顧:
- 隨機張量的生成:torch.randn函數
- 卷積和池化的計算公式(可以不掌握,會自動計算的)
- pytorch的廣播機制:加法和乘法的廣播機制
ps:numpy運算也有類似的廣播機制,基本一致
作業:自己多借助ai舉幾個例子幫助自己理解即可
torch.randn函數
import torch
# 生成標量(0維張量)
scalar = torch.randn(())
print(f"標量: {scalar}, 形狀: {scalar.shape}")
# 生成向量(1維張量)
vector = torch.randn(5) # 長度為5的向量
print(f"向量: {vector}, 形狀: {vector.shape}")
# 生成矩陣(2維張量)
matrix = torch.randn(3, 4) # 3行4列的矩陣
print(f"矩陣:{matrix},矩陣形狀: {matrix.shape}")
# 生成3維張量(常用于圖像數據的通道、高度、寬度)
tensor_3d = torch.randn(3, 224, 224) # 3通道,高224,寬224
print(f"3維張量形狀: {tensor_3d.shape}") # 輸出: torch.Size([3, 224, 224])
# 生成4維張量(常用于批量圖像數據:[batch, channel, height, width])
tensor_4d = torch.randn(2, 3, 224, 224) # 批量大小為2,3通道,高224,寬224
print(f"4維張量形狀: {tensor_4d.shape}") # 輸出: torch.Size([2, 3, 224, 224])
其他隨機函數
x = torch.rand(3, 2) # 生成3x2的張量
print(f"均勻分布隨機數: {x}, 形狀: {x.shape}")x = torch.randint(low=0, high=10, size=(3,)) # 生成3個0到9之間的整數
print(f"隨機整數: {x}, 形狀: {x.shape}")mean = torch.tensor([0.0, 0.0])
std = torch.tensor([1.0, 2.0])
x = torch.normal(mean, std) # 生成兩個正態分布隨機數
print(f"正態分布隨機數: {x}, 形狀: {x.shape}")# 一維張量與二維張量相加
a = torch.tensor([[1, 2, 3], [4, 5, 6]]) # 形狀: (2, 3)
b = torch.tensor([10, 20, 30]) # 形狀: (3,)# 廣播后:b被擴展為[[10, 20, 30], [10, 20, 30]]
result = a + b
result
輸出維度測試
import torch
import torch.nn as nn# 生成輸入張量 (批量大小, 通道數, 高度, 寬度)
input_tensor = torch.randn(1, 3, 32, 32) # 例如CIFAR-10圖像
print(f"輸入尺寸: {input_tensor.shape}") # 輸出: [1, 3, 32, 32]# 1. 卷積層操作
conv1 = nn.Conv2d(in_channels=3, # 輸入通道數out_channels=16, # 輸出通道數(卷積核數量)kernel_size=3, # 卷積核大小stride=1, # 步長padding=1 # 填充
)
conv_output = conv1(input_tensor) # 由于 padding=1 且 stride=1,空間尺寸保持不變
print(f"卷積后尺寸: {conv_output.shape}") # 輸出: [1, 16, 32, 32]# 2. 池化層操作 (減小空間尺寸)
pool = nn.MaxPool2d(kernel_size=2, stride=2) # 創建一個最大池化層
pool_output = pool(conv_output)
print(f"池化后尺寸: {pool_output.shape}") # 輸出: [1, 16, 16, 16]# 3. 將多維張量展平為向量
flattened = pool_output.view(pool_output.size(0), -1)
print(f"展平后尺寸: {flattened.shape}") # 輸出: [1, 4096] (16*16*16=4096)
# 4. 線性層操作
fc1 = nn.Linear(in_features=4096, # 輸入特征數out_features=128 # 輸出特征數
)
fc_output = fc1(flattened)
print(f"線性層后尺寸: {fc_output.shape}") # 輸出: [1, 128]# 5. 再經過一個線性層(例如分類器)
fc2 = nn.Linear(128, 10) # 假設是10分類問題
final_output = fc2(fc_output)
print(f"最終輸出尺寸: {final_output.shape}") # 輸出: [1, 10]
print(final_output)# 使用Softmax替代Sigmoid
softmax = nn.Softmax(dim=1) # 在類別維度上進行Softmax
class_probs = softmax(final_output)
print(f"Softmax輸出: {class_probs}") # 總和為1的概率分布
print(f"Softmax輸出總和: {class_probs.sum():.4f}")
廣播機制的概念
廣播機制(Broadcasting)是深度學習框架(如NumPy、PyTorch、TensorFlow)中處理不同形狀數組運算的一種規則。它允許在逐元素操作中自動擴展較小數組的形狀,使其與較大數組匹配,從而避免顯式復制數據。
廣播的核心規則
形狀對齊:從末尾維度開始比較,兩個數組的維度必須滿足以下條件之一:
- 相等
- 其中一方為1
- 其中一方缺失該維度
擴展補全:滿足對齊條件后,數值會沿長度為1的維度復制擴展。
廣播的示例
假設有一個3×4的矩陣 A
和一個長度為4的向量 B
:
A
的形狀:(3, 4)B
的形狀:(4,) → 自動補齊為 (1, 4) → 再擴展為 (3, 4)
此時A + B
會逐元素相加。
應用場景
- 矩陣與向量相加(如偏置項)
- 不同維度的張量相乘(如注意力機制中的縮放)
- 數據歸一化時減去均值(形狀自動匹配)
常見限制
若形狀無法對齊(如3×4矩陣與3×1矩陣相加),會觸發錯誤。需手動調整維度(如使用 reshape
或 unsqueeze
)。
廣播機制顯著提升了代碼簡潔性和計算效率,但需注意隱性內存消耗。
維度擴展的規則通常涉及數學、數據科學、機器學習等領域,具體規則取決于應用場景和目標。以下是常見的維度擴展方法和規則:
維度擴展的常見方法
多項式特征擴展
通過生成原始特征的高階組合(如平方、交叉項)來增加維度。例如,原始特征為 (x_1, x_2),擴展后可包含 (x_1^2, x_2^2, x_1x_2)。
核方法(Kernel Methods)
利用核函數將低維數據映射到高維空間,如徑向基函數(RBF)核或多項式核,無需顯式計算高維特征。
嵌入學習(Embedding)
通過模型(如Word2Vec、BERT)將離散特征(如文本、類別)轉換為連續的高維向量。
離散化與分箱(Binning)
將連續特征劃分為多個區間(如年齡分組),生成啞變量(One-Hot編碼)以擴展維度。
注意:
維度災難(Curse of Dimensionality)
過度擴展可能導致數據稀疏性增加,模型性能下降。需平衡維度與樣本量。
特征相關性
擴展的特征應與目標變量存在潛在關聯,避免無效擴展。可通過特征選擇方法篩選。
計算效率
高維數據可能顯著增加計算成本,需考慮稀疏存儲或分布式計算優化。
具體方法的選擇需結合問題類型(如分類、回歸)和數據特性(如數值、文本)。
@浙大疏錦行?
?
?