python學習筆記(深度學習)

文章目錄

  • 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 的主要目標是按需批量加載數據,并支持多線程/多進程加速、數據打亂、自動內存管理等功能。其核心功能包括:

  1. 批量處理(Batching)
    將數據集劃分為多個批次(batch),每個批次包含 batch_size 個樣本。
    批量處理是深度學習模型訓練的標準方式,可以充分利用 GPU 的并行計算能力。
  2. 數據打亂(Shuffling)
    通過 shuffle=True 參數,在每個 epoch 開始時隨機打亂數據順序,避免模型學習到數據順序的偏差。
    如果需要自定義打亂邏輯,可通過 sampler 參數傳入自定義采樣器(如 RandomSamplerWeightedRandomSampler)。
  3. 多進程數據加載(Multi-worker)
    通過 num_workers 參數指定工作進程數量,利用多進程并行加載數據,減少主進程的等待時間。
    適用于 CPU 密集型的數據預處理(如圖像解碼、數據增強)。
  4. 內存優化
    按需加載數據(惰性計算),避免一次性加載整個數據集到內存。
    支持自動釋放不再使用的數據內存,防止內存泄漏。
  5. 自定義批處理邏輯
    通過 collate_fn 參數自定義如何將單個樣本組合成一個批次(默認行為是簡單堆疊張量)。
    適用于處理不規則數據(如不同長度的文本序列)。
  6. 支持分布式訓練
    配合 DistributedSampler 實現多設備(如多 GPU)的數據分片,確保每個設備只處理分配到的子集。

DataLoader的核心參數
在這里插入圖片描述


使用步驟

  1. 定義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
  1. 創建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
)
  1. 迭代使用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循環、生成器等協同工作。

代碼實現

  1. 內置迭代器
    Python的內置數據結構(如列表、字典、字符串)都可以通過iter()函數轉換為迭代器:
numbers = [1, 2, 3]
iterator = iter(numbers)
print(next(iterator))  # 輸出: 1
print(next(iterator))  # 輸出: 2
  1. 自定義迭代器
    通過實現__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
  1. 數據生成器
    生成器是更簡潔的迭代器實現方式,通過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])

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86541.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86541.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86541.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣網C語言編程題:搜索二維矩陣(右上角->左下角解法)

一. 簡介 上一篇文章關于"在二維數組中查找某個元素"的問題&#xff0c;提供了兩種解題思路&#xff0c;文章如下&#xff1a; 力扣網C語言編程題&#xff1a;搜索二維矩陣的普通解法與二分查找法-CSDN博客 本文提供第三種解題思路&#xff1a;從左下角->右上角…

AI大模型流式輸出,OkHttp Log攔截打印方案

背景&#xff1a; 使用okhttp框架進行網絡訪問時&#xff0c;一般會使用 HttpLoggingInterceptor 打印請求和響應的log。在使用okhttp訪問AI大模型時&#xff0c;如果選擇流式輸出&#xff0c;那么響應的body數據使用的SSE技術&#xff0c;服務異步發送大模型生成的增量token&…

看數據世界的歷史:全面梳理從關系庫、大數據到AI時代的數據發展及展望

序章 在數據庫不斷發展的時代里&#xff0c;我們看到了關系型數據庫&#xff08;RDB&#xff09;在一次次的數據演變過程中的占據王位&#xff0c;捍衛了勝利&#xff0c;像一個王朝更替下的“王權”的故事&#xff0c;精彩有趣。 本篇就來探討下數據庫的發展興衰史&#xff0…

元宇宙與人工智能的融合:從虛擬世界到智能生態的IT新革命

文章目錄 引言&#xff1a;前沿技術重塑數字交互體驗一、元宇宙與AI融合的本質&#xff1a;虛擬空間與智能交互的交匯元宇宙賦能AI&#xff1a;AI賦能元宇宙&#xff1a; 二、元宇宙與AI融合的演進&#xff1a;從概念到產業熱潮三、核心技術&#xff1a;元宇宙與AI融合的基石與…

問卷調查[mqtt dht]

任務 this code uses esp32-wroom-32 and dht11 to read the humidty and temperature, besieds, it will send the meassage to the cloud platform. All communication is conducted through MQTT. 打分標準 您應該對以下代碼進行評級&#xff0c;并且必須遵守如…

swift 對象轉Json

在 Swift 中將對象轉換為 JSON 可以通過以下方法實現&#xff1a; 使用 Codable 協議 Swift 的 Codable 協議&#xff08;Encodable 和 Decodable 的組合&#xff09;是處理 JSON 編碼和解碼的推薦方式。 struct Person: Codable {var name: Stringvar age: Int }let person…

Python學習Day43

學習來源&#xff1a;浙大疏錦行 import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as transforms import numpy as np import matplotlib.pyplot as plt from PIL import Image import os # 設置隨機…

了解一下Unity AssetBundle 的幾種加載方式

Unity 的 AssetBundle 系統提供了多種加載方式&#xff0c;以滿足不同場景下的資源管理和性能需求。 同步加載&#xff08;LoadFromFile&#xff09; 同步加載使用 AssetBundle.LoadFromFile 方法從文件系統中直接加載 AssetBundle。這種方式會阻塞主線程&#xff0c;直到加載…

鴻蒙邊緣智能計算架構實戰:多線程圖像采集與高可靠緩沖設計

目錄 一、技術背景與挑戰二、鴻蒙邊緣計算架構的核心特性1. 分布式軟總線&#xff1a;打破設備孤島2. 輕量化多線程模型 三、多線程圖像采集的穩定性設計1. 分層緩沖隊列架構2. 線程優先級策略 四、邊緣側高可靠緩沖機制1. 基于分布式數據管理的容錯設計2. 動態帶寬調節 五、實…

excel中vba開發工具

1、支持單元格點擊出現彈框進行選擇 支持模多次模糊查詢 Private Sub CommandButton1_Click() Call vehicle_查詢 End SubPrivate Sub Worksheet_Activate()Call vehicle_取出車架號和公司名稱 取出不重復的車架號Sheet13.ComboBox1.Visible False 車架號顯示Sheet13.ComboB…

CatBoost:征服類別型特征的梯度提升王者

基于有序提升與對稱樹的下一代GBDT框架&#xff0c;重塑高維分類數據處理范式 一、CatBoost的誕生&#xff1a;解決類別特征的終極挑戰 2017年由俄羅斯Yandex團隊開源&#xff0c;CatBoost&#xff08;Categorical Boosting&#xff09;直指機器學習中的核心痛點&#xff1a;類…

使用 WSL 啟動ubuntu.tar文件

使用 WSL 啟動ubuntu.tar文件&#xff0c;可按以下步驟進行3&#xff1a; 檢查 WSL 版本&#xff1a;確保你的 WSL 版本為 2.4.8 或更高版本。可以在命令行中輸入wsl --update來更新 WSL 到最新版本。 設置默認 WSL 版本&#xff1a;如果還沒有將 WSL 2 設置為默認版本&#x…

vue-23(創建用于邏輯提取的可重用組合組件)

創建用于邏輯提取的可重用組合組件 可重用的組合式是 Vue 組合式 API 的基石&#xff0c;它使你能夠在多個組件中提取和重用有狀態邏輯。這有助于編寫更清晰的代碼&#xff0c;減少冗余&#xff0c;并提高可維護性。通過將特定功能封裝到組合式中&#xff0c;你可以輕松地共享…

數據透視表學習筆記

學習視頻&#xff1a;Excel數據透視表大全&#xff0c;3小時從小白到大神&#xff01;_嗶哩嗶哩_bilibili 合并行標簽 初始數據透視表 不顯示分類匯總 以大綱形式顯示 在組的底部顯示所有分類匯總 以表格形式顯示 合并單元格-右鍵-數據透視表選項 選中-合并并劇中排列帶…

吃透 Golang 基礎:測試

文章目錄 go test測試函數隨機測試測試一個命令白盒測試外部測試包 測試覆蓋率基準測試剖析示例函數 go test go test命令是一個按照一定的約定和組織來測試代碼的程序。在包目錄內&#xff0c;所有以xxx_test.go為后綴名的源文件在執行go build時不會被構建為包的一部分&#…

酒店服務配置無門檻優惠券

1.查看酒店綁定的是那個倉庫&#xff1b; 凱里亞德酒店(深圳北站壹城中心店)&#xff0c;綁定的是“龍華民治倉&#xff08;睿嘀購” 2.“門店列表”選擇“龍華民治倉&#xff08;睿嘀購””中的“綁定場所” 3.通過酒店名字查找綁定的商品模板&#xff1b; 凱里亞德酒店(深圳…

IoT創新應用場景,賦能海外市場拓展

在數字化浪潮席卷全球的當下&#xff0c;物聯網&#xff08;Internet of Things, IoT&#xff09;正以革命性的力量重塑產業生態。這項通過傳感器、通信技術及智能算法實現設備互聯的技術&#xff0c;不僅推動全球從“萬物互聯”邁向“萬物智聯”&#xff0c;更成為賦能企業開拓…

Idea中Docker打包流程記錄

1. maven項目&#xff0c;先打package 2.添加Dockerfile 3.執行打包命令 注意最后的路徑 . docker buildx build -t xxx-app:版本號 -f Dockerfile . 4.下載文件 docker save -o xxx-app-版本號.tar xxx-app:版本號 5.加載鏡像 docker load -i xxx-app-版本號.tar 6.編…

硬件工程師筆試面試高頻考點-電阻

目錄 1.1 電阻選型時一般從哪幾個方面進行考慮? 1.2上拉下拉電阻的作用 1.3 PTC熱敏電阻作為電源電路保險絲的工作原理 1.4 如果阻抗不匹配&#xff0c;有哪些后果 1.5 電阻、電容和電感0402、0603和0805封裝的含義 1.6 電阻、電容和電感的封裝大小與什么參數有關 1.7 …

小程序入門:小程序 API 的三大分類

在小程序開發中&#xff0c;API&#xff08;Application Programming Interface&#xff09;起著至關重要的作用&#xff0c;它為開發者提供了豐富的功能和能力&#xff0c;使我們能夠創建出功能強大、用戶體驗良好的小程序。小程序 API 大致可分為以下三大分類&#xff1a;事件…