欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PyTorch張量操作指南(cat、stack、split與chunk)

 更新時間:2025年04月16日 10:25:58   作者:夢想畫家  
本文深入探討PyTorch中用于調(diào)整張量結(jié)構(gòu)的四個核心函數(shù)——torch.cat、torch.stack、torch.split和torch.chunk,通過實際應(yīng)用場景分析和代碼演示,幫助讀者掌握它們的功能差異及適用條件,提升模型開發(fā)的靈活性與效率,需要的朋友可以參考下

在深度學(xué)習(xí)實踐中,張量的維度變換是數(shù)據(jù)處理和模型構(gòu)建的基礎(chǔ)技能。無論是多模態(tài)數(shù)據(jù)的融合(如圖像與文本),還是批處理數(shù)據(jù)的拆分重組,合理運用張量操作函數(shù)可顯著優(yōu)化計算流程。PyTorch提供的cat、stack、split和chunk正是解決此類問題的利器。以下將逐一解析其原理與應(yīng)用。

一、torch.cat: 沿指定維度拼接張量

功能描述

torch.cat(concatenate)沿已有的某一維度連接多個形狀兼容的張量,生成更高維度的單一張量。要求除拼接維度外,其余維度的大小必須完全一致。

示例代碼

import torch

a = torch.tensor([[1, 2], [3, 4]])  # 形狀 (2, 2)
b = torch.tensor([[5, 6], [7, 8]])

# 在第0維拼接(垂直方向)
c = torch.cat([a, b], dim=0)  
print(c)
# 輸出:
# tensor([[1, 2],
#         [3, 4],
#         [5, 6],
#         [7, 8]])

# 在第1維拼接(水平方向)
d = torch.cat([a, b], dim=1)  
print(d)
# 輸出:
# tensor([[1, 2, 5, 6],
#         [3, 4, 7, 8]])

二、torch.stack: 創(chuàng)建新維度堆疊張量

功能描述

torch.stack會將輸入張量沿新創(chuàng)建的維度進行堆疊,所有參與堆疊的張量必須具有完全相同的形狀。輸出張量的維度比原張量多一維。

示例代碼

a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])

# 沿第0維堆疊,生成二維張量
c = torch.stack([a, b], dim=0)  
print(c.shape)  # torch.Size([2, 3])
print(c)
# 輸出:
# tensor([[1, 2, 3],
#         [4, 5, 6]])

# 沿第1維堆疊,生成二維張量
d = torch.stack([a, b], dim=1)  
print(d.shape)  # torch.Size([3, 2])
print(d)
# 輸出:
# tensor([[1, 4],
#         [2, 5],
#         [3, 6]])

三、torch.split: 按尺寸分割張量

功能描述

torch.split根據(jù)指定的尺寸將輸入張量分割為多個子張量。支持兩種參數(shù)形式:

  • 整數(shù)列表:每個元素表示對應(yīng)分片的長度
  • 整數(shù)N:等分為N個子張量(需總長度可被整除)

示例代碼

a = torch.arange(9)  # tensor([0, 1, 2, 3, 4, 5, 6, 7, 8])

# 按列表尺寸分割 [2,3,4]
parts = torch.split(a, [2, 3, 4], dim=0)
for part in parts:
    print(part)

'''
輸出:
tensor([0, 1])
tensor([2, 3, 4])
tensor([5, 6, 7, 8])
'''

# 平均分割為3份
chunks = torch.split(a, 3, dim=0)
print([c.shape for c in chunks])  # [torch.Size([3]), torch.Size([3]), torch.Size([3])]

四、torch.chunk: 按數(shù)量均分張量

功能描述

torch.chunk將輸入張量沿指定維度均勻劃分為N份。若無法整除,剩余元素分配到前面的分片中。

示例代碼

a = torch.arange(10)  # tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

# 分成3份,默認在第0維操作
chunks = torch.chunk(a, chunks=3, dim=0)
for i, chunk in enumerate(chunks):
    print(f"Chunk {i}: {chunk}")

'''
輸出:
Chunk 0: tensor([0, 1, 2, 3])
Chunk 1: tensor([4, 5, 6])
Chunk 2: tensor([7, 8, 9])
'''

# 在第1維分割二維張量
b = a.reshape(2,5)
chunks = torch.chunk(b, chunks=2, dim=1)
print(chunks[0].shape)  # torch.Size([2, 2])
print(chunks[1].shape)  # torch.Size([2, 3])

綜合示例:圖像數(shù)據(jù)的分割與合并處理

以下是結(jié)合圖像數(shù)據(jù)的完整操作示例,模擬圖像預(yù)處理流程中的張量操作場景:

場景設(shè)定

假設(shè)我們有一批RGB圖像數(shù)據(jù)(尺寸為 3×256×256),需要完成以下操作:

  1. 將圖像拆分為RGB三個通道
  2. 對每個通道進行獨立歸一化
  3. 合并處理后的通道
  4. 將多張圖像堆疊成批次
  5. 分割批次為訓(xùn)練/驗證集

代碼實現(xiàn)

import torch
from torchvision import transforms
from PIL import Image
import matplotlib.pyplot as plt

# 1. 加載示例圖像 (H, W, C) -> 轉(zhuǎn)換為 (C, H, W)
image = Image.open('cat.jpg').convert('RGB')
image = transforms.ToTensor()(image)  # shape: torch.Size([3, 256, 256])

# 2. 使用split分離RGB通道
r_channel, g_channel, b_channel = torch.split(image, split_size_or_sections=1, dim=0)

''' 可視化原始通道
plt.figure(figsize=(12,4))
plt.subplot(131), plt.imshow(r_channel.squeeze().numpy(), cmap='Reds'), plt.title('Red')
plt.subplot(132), plt.imshow(g_channel.squeeze().numpy(), cmap='Greens'), plt.title('Green')
plt.subplot(133), plt.imshow(b_channel.squeeze().numpy(), cmap='Blues'), plt.title('Blue')
plt.show()
'''

# 3. 對每個通道進行歸一化(示例操作)
def normalize(tensor):
    return (tensor - tensor.mean()) / tensor.std()

r_norm = normalize(r_channel)
g_norm = normalize(g_channel)
b_norm = normalize(b_channel)

# 4. 使用cat合并處理后的通道
normalized_img = torch.cat([r_norm, g_norm, b_norm], dim=0)
'''觀察歸一化效果
plt.imshow(normalized_img.permute(1,2,0))
plt.title('Normalized Image')
plt.show()
'''

# 5. 創(chuàng)建模擬圖像批次 (假設(shè)有4張相同圖像)
batch_images = torch.stack([image]*4, dim=0)  # shape: (4, 3, 256, 256)

# 6. 使用chunk分割批次為訓(xùn)練集/驗證集
train_set, val_set = torch.chunk(batch_images, chunks=2, dim=0)
print(f"Train set size: {train_set.shape}")  # torch.Size([2, 3, 256, 256])
print(f"Val set size: {val_set.shape}")      # torch.Size([2, 3, 256, 256])

關(guān)鍵操作解析

步驟函數(shù)作用維度變化
通道分離torch.split提取單獨顏色通道(3,256,256)→3個(1,256,256)
數(shù)據(jù)合并torch.cat合并處理后的通道數(shù)據(jù)3個(1,256,256)→(3,256,256)
批次構(gòu)建torch.stack將單張圖像復(fù)制為4張圖像的批次(3,256,256)→(4,3,256,256)
批次劃分torch.chunk將批次按比例劃分為訓(xùn)練/驗證集(4,3,256,256)→2×(2,3,256,256)

擴展應(yīng)用建議

  1. 數(shù)據(jù)增強:對split后的通道進行不同變換(如僅對R通道做對比度調(diào)整)
  2. 模型輸入:stack后的批次可直接輸入CNN網(wǎng)絡(luò)
  3. 分布式訓(xùn)練:利用chunk將數(shù)據(jù)分布到多個GPU處理
  4. 特征可視化:通過split提取中間層特征圖的單個通道進行分析

通過這個完整的圖像處理流程示例,可以清晰看到:

  • split+cat 組合常用于特征處理管道
  • stack+chunk 組合是構(gòu)建批處理系統(tǒng)的關(guān)鍵工具
  • 這些操作在保持計算效率的同時提供了靈活的數(shù)據(jù)控制能力

總結(jié)與對比

函數(shù)核心作用維度變化輸入要求
torch.cat沿現(xiàn)有維度拼接不變各張量形狀需匹配
torch.stack新建維度堆疊+1維所有張量形狀完全相同
torch.split按尺寸分割不變需指定分割尺寸或份數(shù)
torch.chunk按數(shù)量均分不變總長度需可分配

應(yīng)用建議

  • 當(dāng)需要合并同類數(shù)據(jù)且保留原始維度時用cat;
  • 若需擴展維度以表示批次或通道時用stack;
  • 對序列數(shù)據(jù)分段處理優(yōu)先考慮split;
  • 均勻劃分特征圖或張量時選擇chunk

掌握這些工具后,您將能更靈活地操控張量維度,適應(yīng)復(fù)雜模型的構(gòu)建需求!

到此這篇關(guān)于PyTorch張量操作指南(cat、stack、split與chunk)的文章就介紹到這了,更多相關(guān)PyTorch張量操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PyCharm如何設(shè)置Console控制臺輸出自動換行

    PyCharm如何設(shè)置Console控制臺輸出自動換行

    這篇文章主要介紹了PyCharm如何設(shè)置Console控制臺輸出自動換行問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 如何用Python對數(shù)學(xué)函數(shù)進行求值、求偏導(dǎo)

    如何用Python對數(shù)學(xué)函數(shù)進行求值、求偏導(dǎo)

    這篇文章主要介紹了如何用Python對數(shù)學(xué)函數(shù)進行求值、求偏導(dǎo)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Django后臺admin的使用詳解

    Django后臺admin的使用詳解

    這篇文章主要介紹了Django后臺admin的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Qt實現(xiàn)炫酷啟動圖動態(tài)進度條效果

    Qt實現(xiàn)炫酷啟動圖動態(tài)進度條效果

    最近接到一個新需求,讓做一個動效進度條。剛接手這個項目真的不知所措,后來慢慢理清思路,問題迎刃而解,下面小編通過本文給大家?guī)砹薗t實現(xiàn)炫酷啟動圖動態(tài)進度條效果,感興趣的朋友一起看看吧
    2021-11-11
  • Python實戰(zhàn)之基于OpenCV的美顏掛件制作

    Python實戰(zhàn)之基于OpenCV的美顏掛件制作

    在本文中,我們將學(xué)習(xí)如何創(chuàng)建有趣的基于Snapchat的增強現(xiàn)實,主要包括兩個實戰(zhàn)項目:在檢測到的人臉上的鼻子和嘴巴之間添加胡子掛件,在檢測到的人臉上添加眼鏡掛件。感興趣的童鞋可以看看哦
    2021-11-11
  • Python求兩個字符串最長公共子序列代碼實例

    Python求兩個字符串最長公共子序列代碼實例

    這篇文章主要介紹了Python求兩個字符串最長公共子序列代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Django+simpleui實現(xiàn)文件上傳預(yù)覽功能(詳細過程)

    Django+simpleui實現(xiàn)文件上傳預(yù)覽功能(詳細過程)

    該文章詳細介紹了如何在Django框架中實現(xiàn)文件上傳、預(yù)覽和下載功能,并使用SimpleUI美化Django后臺界面,通過創(chuàng)建模型、表單、視圖和配置URL,實現(xiàn)了文件的存儲和管理,同時,文章還提到了配置媒體文件、創(chuàng)建模板以及在生產(chǎn)環(huán)境中的部署注意事項,感興趣的朋友一起看看吧
    2025-02-02
  • 簡單分析Python中用fork()函數(shù)生成的子進程

    簡單分析Python中用fork()函數(shù)生成的子進程

    這篇文章主要介紹了Python中用fork()函數(shù)生成的子進程,分析子進程與父進程的執(zhí)行順序,需要的朋友可以參考下
    2015-05-05
  • django最快程序開發(fā)流程詳解

    django最快程序開發(fā)流程詳解

    這篇文章主要介紹了django最快程序開發(fā)流程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • python數(shù)據(jù)類型中的字符串你了解多少

    python數(shù)據(jù)類型中的字符串你了解多少

    這篇文章主要為大家詳細介紹了python數(shù)據(jù)類型中的字符串,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02

最新評論