文章目錄
- 1、概述
- 2、學習內容
- 2.1、pytorch 常見語法
- 2.1.1、sum
- 2.1.2、廣播機制
- 2.1.3、張量
- 2.1.4、DataLoader
- 2.2、普通語法
- 2.2.1、迭代器
1、概述
本篇博客用來記錄,在深度學習過程中,常用的 python 語法內容
2、學習內容
2.1、pytorch 常見語法
2.1.1、sum
在 PyTorch 中,torch.sum()
是一個非常常用的函數,用于對張量(Tensor)進行求和操作。
它的核心作用是沿著指定的維度對張量元素進行累加,支持靈活的維度選擇和結果維度保留。
函數定義
torch.sum(input, dim=None, keepdim=False, dtype=None) → Tensor
- input:輸入的張量(Tensor)。
- dim:指定求和的維度(可以是單個整數或整數列表)。如果不指定(dim=None),則對整個張量的所有元素求和。
- keepdim:布爾值,是否保留被求和的維度。默認為 False(不保留),若設為 True,則返回的張量會在指定維度上保留大小為 1 的維度。
- dtype:可選參數,指定輸出張量的數據類型。
對所有張量求和
import torch
x = torch.tensor([[1, 2], [3, 4]])
result = torch.sum(x) # 等價于 1 + 2 + 3 + 4
print(result) # 輸出: tensor(10)
沿著指定維度求和
x = torch.tensor([[1, 2], [3, 4]])# 按列求和(dim=0)
result_dim0 = torch.sum(x, dim=0) # 1+3, 2+4
print(result_dim0) # 輸出: tensor([4, 6])# 按行求和(dim=1)
result_dim1 = torch.sum(x, dim=1) # 1+2, 3+4
print(result_dim1) # 輸出: tensor([3, 7])
保留維度求和
x = torch.tensor([[1, 2], [3, 4]])# 按列求和(dim=0)
result_dim0 = torch.sum(x, dim=0) # 1+3, 2+4
print(result_dim0) # 輸出: tensor([4, 6])# 按行求和(dim=1)
result_dim1 = torch.sum(x, dim=1) # 1+2, 3+4
print(result_dim1) # 輸出: tensor([3, 7])
2.1.2、廣播機制
廣播機制(Broadcasting)是 Python 的 NumPy 和 PyTorch 等科學計算庫中的核心功能,它允許不同形狀的張量/數組進行逐元素運算(如加法、乘法等),而無需顯式復制數據。其核心目標是自動擴展較小數組的維度,使其與較大數組的維度匹配,從而簡化代碼并提高計算效率。
舉例
import torch
x = torch.tensor([[1, 2], [3, 4]])
y = x + 10 # 標量 10 被廣播為 [[10, 10], [10, 10]]
print(y)
# 輸出:
# tensor([[11, 12],
# [13, 14]])
2.1.3、張量
在深度學習和科學計算中(如 PyTorch、TensorFlow),張量被定義為多維數組的通用數據結構,用于高效存儲和操作數據。
維度(Rank):張量的“階數”,即數組的維度數量。
- 0階(標量):單個數(如 5)。
- 1階(向量):一維數組(如 [1, 2, 3])。
- 2階(矩陣):二維數組(如 [[1, 2], [3, 4]])。
- 3階及以上:三維及以上數組(如 [[[1, 2], [3, 4]], [[5, 6], [7, 8]]])。
形狀(Shape):描述每個維度的大小。例如:
- 標量:()。
- 向量:(n,)。
- 矩陣:(m, n)。
- 三維張量:(a, b, c)。
張量在深度學習中的作用
- 數據表示:
圖像:[通道數, 高度, 寬度](如 [3, 256, 256] 表示 RGB 圖像)。
視頻:[幀數, 通道數, 高度, 寬度]。 - 批次數據:[批次大小, …](如 [128, 3, 256, 256] 表示 128 張圖像)。
- 模型參數:神經網絡的權重和偏置通常以張量形式存儲。
- 高效計算:支持 GPU/TPU 加速,適用于大規模數據處理。
import torch# 創建張量
scalar = torch.tensor(5) # 0階張量 (標量)
vector = torch.tensor([1, 2, 3]) # 1階張量 (向量)
matrix = torch.tensor([[1, 2], [3, 4]]) # 2階張量 (矩陣)
tensor_3d = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) # 3階張量print("標量形狀:", scalar.shape) # 輸出: torch.Size([])
print("向量形狀:", vector.shape) # 輸出: torch.Size([3])
print("矩陣形狀:", matrix.shape) # 輸出: torch.Size([2, 2])
print("三維張量形狀:", tensor_3d.shape) # 輸出: torch.Size([2, 2, 2])
2.1.4、DataLoader
PyTorch 的 DataLoader
是深度學習訓練中處理數據的核心工具之一,它通過高效的數據加載和預處理機制,顯著提升了訓練速度和靈活性。
核心功能
DataLoader
的主要目標是按需批量加載數據,并支持多線程/多進程加速、數據打亂、自動內存管理等功能。其核心功能包括:
- 批量處理(Batching)
將數據集劃分為多個批次(batch),每個批次包含batch_size
個樣本。
批量處理是深度學習模型訓練的標準方式,可以充分利用 GPU 的并行計算能力。 - 數據打亂(Shuffling)
通過shuffle=True
參數,在每個epoch
開始時隨機打亂數據順序,避免模型學習到數據順序的偏差。
如果需要自定義打亂邏輯,可通過sampler
參數傳入自定義采樣器(如RandomSampler
或WeightedRandomSampler
)。 - 多進程數據加載(Multi-worker)
通過num_workers
參數指定工作進程數量,利用多進程并行加載數據,減少主進程的等待時間。
適用于 CPU 密集型的數據預處理(如圖像解碼、數據增強)。 - 內存優化
按需加載數據(惰性計算),避免一次性加載整個數據集到內存。
支持自動釋放不再使用的數據內存,防止內存泄漏。 - 自定義批處理邏輯
通過collate_fn
參數自定義如何將單個樣本組合成一個批次(默認行為是簡單堆疊張量)。
適用于處理不規則數據(如不同長度的文本序列)。 - 支持分布式訓練
配合DistributedSampler
實現多設備(如多 GPU)的數據分片,確保每個設備只處理分配到的子集。
DataLoader的核心參數
使用步驟
- 定義DataSet
from torch.utils.data import Dataset
import os
from PIL import Imageclass MyDataset(Dataset):def __init__(self, root_dir, label_dir, transform=None):self.root_dir = root_dirself.label_dir = label_dirself.transform = transformself.paths = [os.path.join(root_dir, label_dir, f) for f in os.listdir(os.path.join(root_dir, label_dir))]def __len__(self):return len(self.paths)def __getitem__(self, idx):img_path = self.paths[idx]image = Image.open(img_path)label = self.label_dir # 示例:標簽為目錄名if self.transform:image = self.transform(image)return image, label
- 創建DataLoader
將Dataset
實例傳入DataLoader
,并配置參數:
from torch.utils.data import DataLoader
import torchvision.transforms as transforms# 數據預處理
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor()
])# 初始化 Dataset
dataset = MyDataset(root_dir="data", label_dir="cats", transform=transform)# 創建 DataLoader
dataloader = DataLoader(dataset,batch_size=32,shuffle=True,num_workers=4,pin_memory=True
)
- 迭代使用DataLoader
在訓練循環中按批次獲取數據:
for epoch in range(10): # 10個epochfor batch_idx, (images, labels) in enumerate(dataloader):# images: (batch_size, channels, height, width)# labels: (batch_size,)print(f"Epoch {epoch}, Batch {batch_idx}, Images shape: {images.shape}")# 訓練模型...
2.2、普通語法
2.2.1、迭代器
在Python中,迭代器(Iterator)是一種逐個訪問數據集合的機制,它通過__iter__()
和__next__()
方法實現對數據的按需讀取。迭代器的核心特性包括惰性計算、內存高效和統一的遍歷接口,這些特性使其在處理大規模數據(如深度學習訓練數據)時尤為重要。
基本原理
- 可迭代對象(Iterable):支持逐個返回元素的對象(如列表、字典、字符串等),通過
__iter__()
方法返回一個迭代器。 - 迭代器(Iterator):通過
__next__()
方法逐個獲取元素,當沒有更多元素時拋出StopIteration異常。 - 惰性計算:迭代器不會一次性加載所有數據到內存,而是按需生成下一個值,從而節省內存資源。
核心特性
- 逐項訪問:每次調用
next()
獲取一個元素,直到數據耗盡。 - 內存高效:適用于處理大型數據集,避免一次性加載全部數據。
- 統一接口:所有迭代器遵循相同的
__iter__()
和__next__()
協議,便于與for循環、生成器等協同工作。
代碼實現
- 內置迭代器
Python的內置數據結構(如列表、字典、字符串)都可以通過iter()
函數轉換為迭代器:
numbers = [1, 2, 3]
iterator = iter(numbers)
print(next(iterator)) # 輸出: 1
print(next(iterator)) # 輸出: 2
- 自定義迭代器
通過實現__iter__()
和__next__()
方法定義自定義迭代器:
class MyRange:def __init__(self, start, end):self.current = startself.end = enddef __iter__(self):return selfdef __next__(self):if self.current < self.end:num = self.currentself.current += 1return numelse:raise StopIterationfor i in MyRange(1, 4):print(i) # 輸出: 1, 2, 3
- 數據生成器
生成器是更簡潔的迭代器實現方式,通過yield
關鍵字逐個返回值:
def my_generator():yield 1yield 2yield 3for value in my_generator():print(value) # 輸出: 1, 2, 3
迭代器和深度學習的關聯
在深度學習中,數據通常是大規模的(如圖像數據集、文本語料庫等),直接加載所有數據到內存會導致內存不足。迭代器通過按需加載和批處理(batching)解決了這一問題,成為深度學習框架(如PyTorch、TensorFlow)的核心組件。
pytorch 的 DataLoader
from torch.utils.data import DataLoader, TensorDataset
import torch# 創建虛擬數據
features = torch.randn(1000, 10) # 1000個樣本,每個樣本10個特征
labels = torch.randint(0, 2, (1000,)) # 二分類標簽dataset = TensorDataset(features, labels)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)for batch_features, batch_labels in dataloader:# 每個batch包含32個樣本print(batch_features.shape) # 輸出: torch.Size([32, 10])