「日拱一碼」016 深度學習常用庫——PyTorch

目錄

張量操作

創建張量:

torch.tensor() :直接從數據創建張量

torch.zeros() :創建全零張量

torch.ones() :創建全一張量

torch.randn() :創建正態分布隨機張量

torch.arange() :創建等差序列張量

torch.linspace() :創建線性間隔張量

張量屬性:

tensor.shape :獲取張量的形狀

tensor.dtype :獲取張量的數據類型

tensor.device :獲取張量所在的設備

張量轉換:

tensor.to() :將張量轉換到指定設備或數據類型

tensor.numpy() :將張量轉換為NumPy數組

torch.from_numpy() :從NumPy數組創建張量

?張量操作:

數學運算

廣播機制

索引和切片

重塑和轉置

自動求導

自動求導機制

定義新自動求導函數

神經網絡構建

torch.nn 模塊:

層定義

激活函數

損失函數

優化器

模型定義:

數據處理

數據集

數據加載器

模型保存與加載

保存模型

torch.save(model.state_dict(), 'model.pth')

torch.save(model, 'model.pth')

加載模型

對于只保存參數的方式,需要先定義相同的模型結構,然后使用 model.load_state_dict(torch.load('model.pth')) 加載模型參數

對于保存整個模型的方式,可以直接使用 torch.load('model.pth') 加載模型,然后將其分配給一個變量即可使用

分布式訓練

多GPU訓練

分布式數據加載

其他功能

設備管理

隨機數種子設置

模型推理


PyTorch是一個功能強大的深度學習庫,以下是其常用方法功能的分類介紹:

張量操作

創建張量:

  • torch.tensor() :直接從數據創建張量
  • torch.zeros() :創建全零張量
  • torch.ones() :創建全一張量
  • torch.randn() :創建正態分布隨機張量
  • torch.arange() :創建等差序列張量
  • torch.linspace() :創建線性間隔張量
## 張量操作
# 創建張量
import torch# 創建張量
tensor_from_data = torch.tensor([1, 2, 3])
zeros_tensor = torch.zeros((3, 3))
ones_tensor = torch.ones((2, 2))
randn_tensor = torch.randn((3, 3))
arange_tensor = torch.arange(0, 10)
linspace_tensor = torch.linspace(0, 10, steps=5)print(tensor_from_data)  # tensor([1, 2, 3])
print(zeros_tensor)
# tensor([[0., 0., 0.],
#         [0., 0., 0.],
#         [0., 0., 0.]])print(ones_tensor)
# tensor([[1., 1.],
#         [1., 1.]])print(randn_tensor)
# tensor([[ 0.9779,  1.8636, -0.8193],
#         [-0.8590,  0.4308, -0.2886],
#         [-1.1653,  0.4701, -1.0421]])print(arange_tensor)  # tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(linspace_tensor)  #  tensor([ 0.0000,  2.5000,  5.0000,  7.5000, 10.0000])

張量屬性:

  • tensor.shape :獲取張量的形狀
  • tensor.dtype :獲取張量的數據類型
  • tensor.device :獲取張量所在的設備
# 張量屬性
print(tensor_from_data.shape)  # 輸出:torch.Size([3])
print(zeros_tensor.dtype)      # 輸出:torch.float32
print(ones_tensor.device)      # 輸出:cpu

張量轉換:

  • tensor.to() :將張量轉換到指定設備或數據類型
  • tensor.numpy() :將張量轉換為NumPy數組
  • torch.from_numpy() :從NumPy數組創建張量
# 張量轉換
tensor_to_cpu = tensor_from_data.to('cpu')
print(tensor_to_cpu)  # tensor([1, 2, 3])tensor_to_float = tensor_from_data.to(torch.float32)
print(tensor_to_float)  # tensor([1., 2., 3.])numpy_array = tensor_from_data.numpy()
print(numpy_array)  # [1 2 3]tensor_from_numpy = torch.from_numpy(numpy_array)
print(tensor_from_numpy)  # tensor([1, 2, 3])

?張量操作:

  • 數學運算

支持加法 tensor1 + tensor2 、減法 tensor1 - tensor2 、乘法 tensor1 * tensor2 、除法 tensor1 / tensor2 等逐元素運算,以及矩陣乘法 torch.matmul(tensor1, tensor2)?

  • 廣播機制

在進行張量運算時,會自動擴展較小張量的維度以匹配較大張量的維度,從而實現更靈活的運算

  • 索引和切片

與NumPy類似,可以通過索引和切片操作來訪問張量的特定元素或子張量

  • 重塑和轉置

tensor.reshape() 可以改變張量的形狀, tensor.transpose() 可以對張量進行轉置操作

# 張量操作
tensor1 = torch.tensor([1, 2, 3])
tensor2 = torch.tensor([4, 5, 6])
add_tensor = tensor1 + tensor2  # 加法
print(add_tensor)  # tensor([5, 7, 9])mul_tensor = tensor1 * tensor2  # 乘法
print(mul_tensor)  # tensor([ 4, 10, 18])matmul_tensor = torch.matmul(tensor1.unsqueeze(0), tensor2.unsqueeze(1))  # 矩陣乘法
print(matmul_tensor)  # tensor([[32]])reshaped_tensor = tensor_from_data.reshape((1, 3))  # 重塑
print(reshaped_tensor)  # tensor([[1, 2, 3]])transposed_tensor = tensor_from_data.reshape((3, 1)).transpose(0, 1)  # 轉置
print(transposed_tensor)  # tensor([[1, 2, 3]])

自動求導

  • 自動求導機制

PyTorch的 autograd 模塊能夠自動計算梯度,這對于神經網絡的反向傳播至關重要。當創建張量時,設置 requires_grad=True ,則該張量的所有操作都會被跟蹤,以便后續計算梯度

## 自動求導x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x * x
y.sum().backward()  # 反向傳播
print(x.grad)  # 輸出梯度 [2., 4., 6.]
  • 定義新自動求導函數

可以通過繼承 torch.autograd.Function 類并實現 forward 和 backward 方法來定義新的自動求導函數,從而實現自定義的梯度計算邏輯

# 定義新自動求導函數
class CustomReLU(torch.autograd.Function):@staticmethod  # 表示這是一個靜態方法,不需要實例化類就可以調用def forward(ctx, input):ctx.save_for_backward(input)  # 保存輸入張量,以便在反向傳播時使用return torch.relu(input)  # 前向傳播:應用 ReLU 激活函數@staticmethoddef backward(ctx, grad_output):input, = ctx.saved_tensors  # 獲取保存的輸入張量grad_input = grad_output.clone()  # 創建一個與 grad_output 形狀相同的張量grad_input[input < 0] = 0  # 對于輸入小于0的部分,梯度為0return grad_input  # 返回梯度custom_relu = CustomReLU.apply
x = torch.tensor([-1.0, 2.0, 3.0], requires_grad=True)
y = custom_relu(x)
y.sum().backward()
print(x.grad)  # 輸出梯度 [0., 1., 1.]

神經網絡構建

torch.nn 模塊:

  • 層定義

提供了各種神經網絡層的實現如 nn.Linear 定義全連接層, nn.Conv2d 定義二維卷積層, nn.BatchNorm2d 定義二維批量歸一化層等

  • 激活函數

包括 torch.relu 、 torch.sigmoid 、 torch.tanh 等常用的激活函數

  • 損失函數

提供了多種損失函數,如 nn.MSELoss 用于均方誤差損失, nn.CrossEntropyLoss 用于分類任務的交叉熵損失, nn.BCELoss 用于二分類任務的二元交叉熵損失等

  • 優化器

實現了多種優化算法,如 torch.optim.SGD 是隨機梯度下降優化器, torch.optim.Adam 是Adam優化器等,用于更新網絡參數

模型定義:

通過繼承 torch.nn.Module 類來定義自己的神經網絡模型,在 __init__ 方法中定義網絡的層,在 forward 方法中定義數據在網絡中的前向傳播過程

## 神經網絡構建import torch.nn as nn
import torch.optim as optim# 定義模型
class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.fc1 = nn.Linear(10, 5)self.relu = nn.ReLU()self.fc2 = nn.Linear(5, 2)def forward(self, x):x = self.fc1(x)x = self.relu(x)x = self.fc2(x)return xmodel = MyModel()# 定義損失函數和優化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)# 模擬訓練
inputs = torch.randn(4, 10)
labels = torch.tensor([0, 1, 0, 1])optimizer.zero_grad()  # 清空梯度
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()  # 反向傳播
optimizer.step()  # 更新參數print(criterion(outputs, labels))  # tensor(0.6918, grad_fn=<NllLossBackward0>)

數據處理

  • 數據集

?torch.utils.data.Dataset 是一個抽象類,用于表示數據集,用戶可以自定義數據集類,通過重寫 __getitem__ 和 __len__ 方法來實現對數據的訪問和獲取數據集的大小

  • 數據加載器

torch.utils.data.DataLoader 是一個可迭代對象,它封裝了數據集,并提供了批量加載、打亂數據、多線程數據加載等功能,方便在訓練過程中高效地獲取數據

## 數據處理from torch.utils.data import Dataset, DataLoader# 自定義數據集
class MyDataset(Dataset):def __init__(self, data, labels):self.data = dataself.labels = labelsdef __getitem__(self, index):return self.data[index], self.labels[index]def __len__(self):return len(self.data)data = torch.randn(100, 10)
labels = torch.randint(0, 2, (100,))
dataset = MyDataset(data, labels)
dataloader = DataLoader(dataset, batch_size=10, shuffle=True)# 使用數據加載器
for inputs, labels in dataloader:print(inputs.shape, labels.shape)   # torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])

模型保存與加載

保存模型

  • torch.save(model.state_dict(), 'model.pth')

只保存模型的參數,這種方式保存的文件較小,且在加載模型時需要先定義相同的模型結構

  • torch.save(model, 'model.pth')

保存整個模型,包括模型的結構和參數,這種方式保存的文件較大,但加載時不需要定義模型結構

## 數據保存與加載# 保存模型
torch.save(model.state_dict(), 'model.pth')  # 保存參數
torch.save(model, 'model.pth')  # 保存整個模型

加載模型

  • 對于只保存參數的方式,需要先定義相同的模型結構,然后使用 model.load_state_dict(torch.load('model.pth')) 加載模型參數
  • 對于保存整個模型的方式,可以直接使用 torch.load('model.pth') 加載模型,然后將其分配給一個變量即可使用
# 加載模型
model = MyModel()
model.load_state_dict(torch.load('model.pth'))  # 加載參數
model = torch.load('model.pth')  # 加載整個模型

分布式訓練

  • 多GPU訓練

PyTorch提供了 torch.nn.DataParallel 和 torch.nn.parallel.DistributedDataParallel 等模塊,用于在多GPU環境下進行模型訓練,可以顯著提高訓練速度

  • 分布式數據加載

在分布式訓練中, torch.utils.data.distributed.DistributedSampler 可以根據進程數和進程編號對數據集進行分片,確保每個進程加載的數據是不同的,從而實現數據的分布式加載

## 分布式訓練import torch.distributed as dist
import torch.nn.parallel# 初始化分布式環境
dist.init_process_group(backend='nccl', init_method='env://')# 多GPU訓練
model = MyModel()
model = torch.nn.DataParallel(model)
# model = torch.nn.parallel.DistributedDataParallel(model)# 分布式數據加載
sampler = torch.utils.data.distributed.DistributedSampler(dataset)
dataloader = DataLoader(dataset, batch_size=10, sampler=sampler)

其他功能

  • 設備管理

可以通過 torch.device 對象來指定張量和模型所在的設備,如 torch.device('cuda:0') 表示使用第一塊GPU, torch.device('cpu') 表示使用CPU

  • 隨機數種子設置

使用 torch.manual_seed(seed) 可以設置隨機數種子,確保每次運行代碼時生成的隨機數是相同的,這對于實驗的可重復性非常重要

  • 模型推理

在模型推理階段,可以使用 model.eval() 將模型切換到評估模式,這會關閉 Dropout 和 BatchNorm 等層的訓練特性,以確保模型在推理時的行為是正確的

## 其他功能# 設備管理
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
tensor = torch.tensor([1, 2, 3], device=device)# 隨機數種子設置
torch.manual_seed(42)
random_tensor = torch.randn((3, 3))# 模型推理
model.eval()  # 切換到評估模式
with torch.no_grad():  # 關閉梯度計算outputs = model(inputs)

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

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

相關文章

【Qt】QStringLiteral 介紹

QStringLiteral 介紹 QStringLiteral 是 Qt 框架中提供的一個宏&#xff0c;用于在編譯時從字符串字面量創建 QString 對象&#xff0c;具有高效和零內存分配的特點。 主要特點 編譯時轉換&#xff1a;將字符串字面量在編譯時轉換為 QString 數據&#xff0c;而不是運行時。…

UI前端與數字孿生結合實踐探索:智慧物流的貨物追蹤與配送優化

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;數字孿生重構智慧物流的技術范式在物流行業數字化轉型的浪潮中&#xff0…

Java創建型模式---工廠模式

工廠模式基礎概念 工廠模式是一種創建型設計模式&#xff0c;其核心思想是將對象的創建和使用分離。通過使用工廠模式&#xff0c;可以將對象創建邏輯集中管理&#xff0c;提高代碼的可維護性和可擴展性。在 Java 中&#xff0c;工廠模式主要分為三種類型&#xff1a; 簡單工…

分布式定時任務:xxl-job

基礎 XXL - Job采用的是調度中心&#xff08;Scheduler&#xff09;與執行器&#xff08;Executor&#xff09;分離的架構設計&#xff0c;這種設計帶來了諸多優勢&#xff0c;比如高可用性、可擴展性以及便于分布式部署等。 1. 調度中心&#xff08;XXL - Job Admin&#xf…

易語言實現釘釘PC端高頻率鏈接批量打開系統

易語言實現釘釘PC端高頻率鏈接批量打開系統 一、需求分析與技術方案 核心需求: 在釘釘PC端私聊消息中嵌入特殊格式鏈接用戶點擊后通過自定義協議喚醒本地程序支持每分鐘處理10萬次請求的批量操作實現鏈接的批量生成和管理技術方案: #mermaid-svg-AYoMWYQQf71dlyEF {font-fa…

MyBatis如何實現動態數據源切換?

大家好&#xff0c;我是鋒哥。今天分享關于【MyBatis如何實現動態數據源切換&#xff1f;】面試題。希望對大家有幫助&#xff1b; MyBatis如何實現動態數據源切換&#xff1f; 超硬核AI學習資料&#xff0c;現在永久免費了&#xff01; 在MyBatis中實現動態數據源切換&#…

實踐篇:14-構建 Node.js 應用程序鏡像

背景介紹 Node.js是一個基于 Chrome V8 引擎的 JavaScript 運行時環境&#xff0c;以其事件驅動、非阻塞 I/O 模型而聞名&#xff0c;廣泛用于構建后端服務和前端應用。 Node.js 的特點使其非常適合容器化部署&#xff1a; 輕量級運行時&#xff1a;相比傳統后端語言&#xf…

Spring Cloud 微服務(鏈路追蹤與日志聚合)

&#x1f4cc; 摘要 在微服務架構中&#xff0c;隨著服務數量的增加和調用關系的復雜化&#xff0c;傳統的日志記錄方式已經無法滿足對系統運行狀態的全面掌控。如何快速定位異常請求、分析服務調用耗時、追蹤完整鏈路成為運維和開發人員面臨的核心挑戰。 為此&#xff0c;Sp…

PADS交互式布局

PADS的交互式布局通過原理圖與PCB的雙向聯動大幅提升設計效率。在原理圖中框選電路模塊時&#xff0c;PCB視圖將自動高亮對應元件組并生成可移動簇&#xff0c;拖動時保持模塊內部相對位置不變。布局過程中啟用實時推擠功能&#xff08;Placement Shoving&#xff09;&#xff…

類圖+案例+代碼詳解:軟件設計模式----原型模式

5、原型模式 通過復制現有對象來創建新對象&#xff0c;避免從零開始構建&#xff0c;就像 “復印文件” 一樣。 克隆的核心是復用現有對象狀態 用 克隆熊貓 舉例&#xff0c;秒懂原理 假設你有一只熊貓對象&#xff08;屬性&#xff1a;名字、年齡、毛色&#xff09;&#…

Python-FAQ-__name__、__main__

1 需求 2 接口 3 示例 4 參考資料 在 Python 中&#xff0c;像 __name__ 這樣的雙下劃線屬性&#xff08;也稱為 "dunder" 屬性&#xff0c;即 "double underscore" 的縮寫&#xff09;是 Python 的特殊屬性或方法&#xff0c;它們為類、對象或模塊提供了…

Adobe高階技巧與設計師創意思維的進階指南

作為一名在全球設計圈摸爬滾打了十年的職業設計師&#xff0c;我深知創意與技術的結合是點燃靈感的火花。憑借英國Parvis School of Economics and Music大學提供的Adobe正版教育訂閱&#xff0c;我得以在設計之路上不斷探索與突破。今天&#xff0c;我想以輕松實用的口吻&…

音視頻會議服務搭建(設計方案-Go服務端API業務邏輯流程圖)-04

前言 這一篇是 關于 Go服務端相關的音視頻會議的接口API業務邏輯流程圖肯定是不能完全復用到你的項目中去的&#xff0c;但是希望對你有一些參考性的幫助嗯&#xff0c;我也是在不斷的進行完善和優化&#xff0c;并不是最終的結構&#xff0c;先定好大方向&#xff0c;然后不斷…

C++ Qt Widget繪圖畫布縮放與平移:實現CAD級交互體驗

在圖形應用程序開發中&#xff0c;實現流暢的縮放和平移功能是創建專業級繪圖工具的基礎。本文將深入探討如何在Qt Widget中實現CAD級別的交互體驗&#xff0c;包括視圖變換、坐標系統管理以及交互功能實現。核心概念&#xff1a;視圖變換與坐標系統 在圖形應用中&#xff0c;我…

Paimon 位圖索引解析:高效等值查詢的秘密( Bit-Sliced Index)

BitmapFileIndexBitmapFileIndex 這個類 是 Paimon 中一個非常重要的索引類型&#xff0c;它使用位圖&#xff08;Bitmap&#xff09;來精確定位數據&#xff0c;尤其擅長處理低基數&#xff08;low-cardinality&#xff09;列的等值查詢。BitmapFileIndex 實現了 FileIndexer …

S7-1200 CPU 與 S7-200 CPU S7通信(S7-1200 作為服務器

7-1200 CPU 與 S7-200 CPU S7通信&#xff08;S7-1200 作為服務器&#xff09; S7-1200 CPU 與 S7-200 CPU 之間的通信只能通過 S7 通信來實現&#xff0c;因為 S7-200 的以太網模塊只支持S7 通信。當S7-200作為客戶端&#xff0c;S7-1200作為服務器&#xff0c;需在客戶端單邊…

pyspark大規模數據加解密優化實踐

假如有1億行數據 方法1 spark udf解密 from pyspark.sql import SparkSession import pyspark.sql.functions as F from pyDes import * import binasciisparkSparkSession.builder.getOrCreate()def dec_fun(text):key triple_des(b"HHHHHHHHHHHHHHHHHHHHHHHH", CB…

華為云Flexus+DeepSeek征文|華為云ECS與CCE:從介紹到架構部署·僅需要此文足矣

前引&#xff1a;當今的企業面臨著前所未有的技術挑戰&#xff1a;如何構建既安全又高效、既靈活又可靠的云服務架構&#xff1f;如何有效整合人工智能技術&#xff0c;打造智能化的運維和服務體系&#xff1f;這些問題的答案&#xff0c;正在悄然改變著企業級IT基礎設施的生態…

DAY 50 預訓練模型+CBAM模塊

浙大疏錦行https://blog.csdn.net/weixin_45655710 知識點回顧&#xff1a; resnet結構解析CBAM放置位置的思考針對預訓練模型的訓練策略 差異化學習率三階段微調 作業&#xff1a; 好好理解下resnet18的模型結構嘗試對vgg16cbam進行微調策略 ResNet-18 結構核心思想 可以將R…

docker連接mysql

查看在運行的容器&#xff1a;docker ps -s 進入容器&#xff1a;docker exec -it 容器號或名 /bin/bash&#xff0c;如&#xff1a;docker exec -it c04c438ff177 /bin/bash 或docker exec -it mysql /bin/bash。 3. 登錄mysql&#xff1a;mysql -uroot -p123456