PyTorch張量類型創(chuàng)建與轉(zhuǎn)換的詳細(xì)指南
引言
在PyTorch的深度學(xué)習(xí)開發(fā)中,張量(Tensor)作為核心數(shù)據(jù)結(jié)構(gòu),其類型的靈活創(chuàng)建與轉(zhuǎn)換是基礎(chǔ)且關(guān)鍵的操作。不同的業(yè)務(wù)場(chǎng)景、硬件環(huán)境對(duì)張量數(shù)據(jù)類型有著不同的要求,比如輕量化訓(xùn)練常用float16,常規(guī)訓(xùn)練多用float32,高精度計(jì)算會(huì)用到float64。今天就帶大家系統(tǒng)掌握PyTorch中張量指定類型的創(chuàng)建方法,以及多種類型轉(zhuǎn)換技巧,從基礎(chǔ)概念到實(shí)操代碼,一站式吃透
一、前置基礎(chǔ):比特位與數(shù)據(jù)類型的小知識(shí)
在學(xué)習(xí)張量類型之前,我們先理清一個(gè)基礎(chǔ)概念:比特位(bit)與字節(jié)(Byte)的關(guān)系,這是理解不同數(shù)值類型的核心。
1個(gè)字節(jié) = 8個(gè)比特位,而PyTorch中的數(shù)值類型正是通過(guò)比特位數(shù)量定義的,比如float16代表16個(gè)比特位,換算下來(lái)就是2個(gè)字節(jié),這也決定了該類型的存儲(chǔ)大小和精度:比特位越少,占用內(nèi)存越小,精度相對(duì)越低;比特位越多,占用內(nèi)存越大,精度也越高。
給大家整理了PyTorch中常用張量數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系,一張表就能看明白
| 類型函數(shù) | 對(duì)應(yīng)PyTorch類型 | 比特位數(shù) | 字節(jié)數(shù) | 適用場(chǎng)景 |
|---|---|---|---|---|
| half() | torch.float16 | 16 | 2 | 輕量化訓(xùn)練、低顯存硬件 |
| float() | torch.float32 | 32 | 4 | 常規(guī)深度學(xué)習(xí)訓(xùn)練/推理 |
| double() | torch.float64 | 64 | 8 | 高精度科學(xué)計(jì)算 |
| short() | torch.int16 | 16 | 2 | 低精度整數(shù)運(yùn)算 |
| int() | torch.int32 | 32 | 4 | 常規(guī)整數(shù)運(yùn)算 |
| long() | torch.int64 | 64 | 8 | 索引、大整數(shù)運(yùn)算 |
| 小提示:PyTorch中創(chuàng)建整數(shù)張量時(shí),默認(rèn)類型是torch.int64;創(chuàng)建浮點(diǎn)張量時(shí),默認(rèn)類型是torch.float32,這也是深度學(xué)習(xí)中最常用的浮點(diǎn)類型,大家一定要記牢 |
二、小技巧:PyTorch文件重命名的快捷操作
在實(shí)際開發(fā)中,我們常會(huì)遇到文件命名錯(cuò)誤的情況,比如把“張量類型轉(zhuǎn)換”的文件命名成了“張亮元素類型轉(zhuǎn)換”,這里分享兩個(gè)PyTorch項(xiàng)目(PyCharm編輯器)中高效的文件重命名方法,告別手動(dòng)刪除重建的繁瑣:
方法1:基礎(chǔ)法——右鍵刪除重建
操作簡(jiǎn)單,適合新手:右鍵錯(cuò)誤命名的文件→刪除→新建同名(正確名稱)的.py文件,缺點(diǎn)是需要重新寫文件頭和導(dǎo)入代碼,效率較低。
方法2:快捷法——重構(gòu)重命名(推薦)
這是開發(fā)中最常用的方法,快捷鍵Shift+F6,步驟如下:
- 選中需要重命名的文件;
- 按下
Shift+F6,或右鍵選擇Refactor(重構(gòu))→Rename(重命名); - 輸入正確的文件名,回車確認(rèn),整個(gè)項(xiàng)目中對(duì)該文件的引用會(huì)自動(dòng)更新,無(wú)需手動(dòng)修改!
三、核心操作1:創(chuàng)建指定類型的張量
創(chuàng)建張量時(shí)直接指定類型,是最常用、最高效的方式,避免后續(xù)二次轉(zhuǎn)換的麻煩。在使用torch.tensor()創(chuàng)建張量時(shí),通過(guò)dtype參數(shù)即可指定張量的元素類型,這里先理清兩個(gè)極易混淆的概念,避免踩坑:
tensor.dtype:查看張量?jī)?nèi)元素的類型(如torch.float32、torch.int64),這是我們最常關(guān)注的屬性;tensor.type():查看張量本身的類型,結(jié)果一般為torch.Tensor,代表這是一個(gè)張量對(duì)象。
3.1 基礎(chǔ)創(chuàng)建:默認(rèn)類型張量
當(dāng)我們不指定dtype時(shí),PyTorch會(huì)根據(jù)輸入的數(shù)值類型自動(dòng)分配默認(rèn)張量類型:
import torch # 導(dǎo)入PyTorch庫(kù),版本建議2.0+
# 創(chuàng)建整數(shù)張量,默認(rèn)dtype=torch.int64
t1 = torch.tensor([1,2,3,4,5])
print(f"張量元素類型:{t1.dtype}") # 輸出:torch.int64
print(f"張量本身類型:{t1.type()}") # 輸出:torch.LongTensor(對(duì)應(yīng)int64)
# 創(chuàng)建浮點(diǎn)張量,默認(rèn)dtype=torch.float32
t2 = torch.tensor([1.0,2.0,3.0])
print(f"張量元素類型:{t2.dtype}") # 輸出:torch.float32
print(f"張量本身類型:{t2.type()}") # 輸出:torch.FloatTensor(對(duì)應(yīng)float32)
3.2 精準(zhǔn)創(chuàng)建:指定dtype的張量
通過(guò)dtype=torch.xxx即可自定義張量元素類型,滿足不同場(chǎng)景需求,代碼示例如下:
import torch
# 創(chuàng)建float16類型張量
t_float16 = torch.tensor([1,2,3], dtype=torch.float16)
# 創(chuàng)建float64類型張量
t_float64 = torch.tensor([1,2,3], dtype=torch.float64)
# 創(chuàng)建int16類型張量
t_int16 = torch.tensor([1,2,3], dtype=torch.int16)
# 創(chuàng)建int32類型張量
t_int32 = torch.tensor([1,2,3], dtype=torch.int32)
print(f"float16張量:{t_float16.dtype}") # torch.float16
print(f"float64張量:{t_float64.dtype}") # torch.float64
print(f"int16張量:{t_int16.dtype}") # torch.int16
print(f"int32張量:{t_int32.dtype}") # torch.int32
重點(diǎn):在深度學(xué)習(xí)訓(xùn)練中,我們幾乎都會(huì)用dtype=torch.float32創(chuàng)建張量,這是框架默認(rèn)的訓(xùn)練精度,兼顧速度和精度??
四、核心操作2:張量的類型轉(zhuǎn)換
實(shí)際開發(fā)中,我們常會(huì)遇到已創(chuàng)建的張量類型不符合需求的情況,比如把默認(rèn)的int64轉(zhuǎn)成float32,把float32轉(zhuǎn)成float16做輕量化。PyTorch提供了兩種類型轉(zhuǎn)換方法,一種通用萬(wàn)能(推薦掌握),一種針對(duì)性便捷(適合有Java基礎(chǔ)的同學(xué)),下面詳細(xì)講解。
4.1 萬(wàn)能轉(zhuǎn)換法:type()函數(shù)(強(qiáng)推)
type()函數(shù)是PyTorch中張量類型轉(zhuǎn)換的通用方法,支持任意類型之間的轉(zhuǎn)換,只需在函數(shù)中傳入目標(biāo)類型torch.xxx即可,語(yǔ)法簡(jiǎn)單、記憶成本低,是新手必掌握的方法。
代碼實(shí)操:type()函數(shù)轉(zhuǎn)換示例
import torch
# 第一步:創(chuàng)建基礎(chǔ)張量(float32類型)
t = torch.tensor([1,2,3,4,5], dtype=torch.float32)
print(f"原始類型:{t.dtype}") # 輸出:torch.float32
# 轉(zhuǎn)換為int16類型
t_int16 = t.type(torch.int16)
print(f"轉(zhuǎn)換為int16:{t_int16.dtype}") # 輸出:torch.int16
# 轉(zhuǎn)換為float16類型
t_float16 = t.type(torch.float16)
print(f"轉(zhuǎn)換為float16:{t_float16.dtype}") # 輸出:torch.float16
# 轉(zhuǎn)換為float64類型
t_float64 = t.type(torch.float64)
print(f"轉(zhuǎn)換為float64:{t_float64.dtype}") # 輸出:torch.float64
# 轉(zhuǎn)換為int64類型
t_int64 = t.type(torch.int64)
print(f"轉(zhuǎn)換為int64:{t_int64.dtype}") # 輸出:torch.int64
核心優(yōu)勢(shì):無(wú)論是什么原始類型,只需改變type()中的目標(biāo)參數(shù),就能實(shí)現(xiàn)任意轉(zhuǎn)換,無(wú)需記憶多個(gè)函數(shù),一招鮮吃遍天
4.2 便捷轉(zhuǎn)換法:專屬類型函數(shù)
PyTorch為每種常用類型都提供了專屬的轉(zhuǎn)換函數(shù),比如half()、float()、double()、short()等,這些函數(shù)的命名和Java中的基本類型轉(zhuǎn)換高度相似,有Java基礎(chǔ)的同學(xué)會(huì)很容易上手。
需要注意的是,這類函數(shù)無(wú)需傳入?yún)?shù),調(diào)用后直接將張量轉(zhuǎn)換為對(duì)應(yīng)類型,下面是具體的函數(shù)與類型對(duì)應(yīng)關(guān)系,再配合代碼實(shí)操理解
專屬函數(shù)與類型對(duì)應(yīng)表
| 專屬轉(zhuǎn)換函數(shù) | 轉(zhuǎn)換后的目標(biāo)類型 | 等價(jià)type()寫法 |
|---|---|---|
| tensor.half() | torch.float16 | tensor.type(torch.float16) |
| tensor.float() | torch.float32 | tensor.type(torch.float32) |
| tensor.double() | torch.float64 | tensor.type(torch.float64) |
| tensor.short() | torch.int16 | tensor.type(torch.int16) |
| tensor.int() | torch.int32 | tensor.type(torch.int32) |
| tensor.long() | torch.int64 | tensor.type(torch.int64) |
代碼實(shí)操:專屬函數(shù)轉(zhuǎn)換示例
import torch
# 創(chuàng)建基礎(chǔ)張量(int16類型)
t = torch.tensor([1,2,3,4,5], dtype=torch.int16)
print(f"原始類型:{t.dtype}") # 輸出:torch.int16
# half() → float16
t_half = t.half()
print(f"half()轉(zhuǎn)換:{t_half.dtype}") # torch.float16
# float() → float32
t_float = t.float()
print(f"float()轉(zhuǎn)換:{t_float.dtype}") # torch.float32
# double() → float64
t_double = t.double()
print(f"double()轉(zhuǎn)換:{t_double.dtype}") # torch.float64
# short() → int16(原類型,無(wú)變化)
t_short = t.short()
print(f"short()轉(zhuǎn)換:{t_short.dtype}") # torch.int16
# int() → int32
t_int = t.int()
print(f"int()轉(zhuǎn)換:{t_int.dtype}") # torch.int32
# long() → int64
t_long = t.long()
print(f"long()轉(zhuǎn)換:{t_long.dtype}") # torch.int64
4.3 兩種轉(zhuǎn)換方法的對(duì)比??
為了讓大家更清晰區(qū)分兩種轉(zhuǎn)換方法的優(yōu)劣、精準(zhǔn)匹配自身使用場(chǎng)景,我用Mermaid流程圖做了直觀可視化對(duì)比,核心優(yōu)缺點(diǎn)與適配人群一目了然,新手也能快速選對(duì)方法

圖表核心解讀:左側(cè)通用type()函數(shù)主打一個(gè)“全能適配”,不需要額外記憶多個(gè)函數(shù),完全貼合深度學(xué)習(xí)新手的學(xué)習(xí)路徑,哪怕后續(xù)遇到特殊類型轉(zhuǎn)換也能輕松應(yīng)對(duì);右側(cè)專屬函數(shù)寫法更簡(jiǎn)潔,適合有Java基礎(chǔ)的同學(xué)快速簡(jiǎn)寫,但場(chǎng)景局限性更強(qiáng)。日常做PyTorch項(xiàng)目開發(fā),優(yōu)先吃透type()函數(shù),足以搞定99%的張量類型轉(zhuǎn)換需求,穩(wěn)妥又高效
五、實(shí)操小總結(jié):核心知識(shí)點(diǎn)梳理
- 基礎(chǔ)概念:1字節(jié)=8比特位,PyTorch數(shù)值類型由比特位定義,默認(rèn)整數(shù)int64、浮點(diǎn)float32;
- 文件重命名:PyCharm中
Shift+F6一鍵重構(gòu),高效且自動(dòng)更新引用; - 兩個(gè)關(guān)鍵屬性:
dtype看元素類型,type()看張量對(duì)象類型,切勿混淆; - 指定類型創(chuàng)建:
torch.tensor(數(shù)據(jù), dtype=torch.xxx),深度學(xué)習(xí)常用torch.float32; - 類型轉(zhuǎn)換:新手強(qiáng)推
type(torch.xxx)通用法,有Java基礎(chǔ)可使用half()/float()等專屬法; - 類型對(duì)應(yīng):half=float16、float=float32、double=float64、short=int16,記牢這組對(duì)應(yīng)關(guān)系。
六、寫在最后
張量的類型創(chuàng)建與轉(zhuǎn)換是PyTorch的入門基礎(chǔ),看似簡(jiǎn)單,但卻是后續(xù)模型訓(xùn)練、推理優(yōu)化的關(guān)鍵。比如在顯存不足的顯卡上訓(xùn)練大模型,將張量從float32轉(zhuǎn)成float16能直接節(jié)省一半顯存;在高精度計(jì)算場(chǎng)景中,用float64能提升計(jì)算準(zhǔn)確性。
希望這篇文章能幫大家徹底吃透張量類型的相關(guān)操作,把基礎(chǔ)打牢,后續(xù)才能更順暢地學(xué)習(xí)PyTorch的進(jìn)階知識(shí)。0基礎(chǔ)學(xué)AI開發(fā)并不可怕,只要一步一個(gè)腳印,吃透每個(gè)基礎(chǔ)知識(shí)點(diǎn),終能實(shí)現(xiàn)技術(shù)的提升。
以上就是PyTorch張量類型創(chuàng)建與轉(zhuǎn)換的詳細(xì)指南的詳細(xì)內(nèi)容,更多關(guān)于PyTorch張量類型創(chuàng)建與轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python中字符串列表的相互轉(zhuǎn)換實(shí)際應(yīng)用場(chǎng)景
在Python編程中,經(jīng)常會(huì)遇到需要將字符串列表相互轉(zhuǎn)換的情況,這涉及到將逗號(hào)分隔的字符串轉(zhuǎn)換為列表,或者將列表中的元素連接成一個(gè)字符串,本文將深入討論這些情景,并提供豐富的示例代碼,幫助讀者更全面地理解字符串列表的轉(zhuǎn)換操作2023-12-12
Python 實(shí)現(xiàn)數(shù)組相減示例
今天小編就為大家分享一篇Python 實(shí)現(xiàn)數(shù)組相減示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python實(shí)現(xiàn)五子棋聯(lián)機(jī)對(duì)戰(zhàn)小游戲
本文主要介紹了通過(guò)Python實(shí)現(xiàn)簡(jiǎn)單的支持聯(lián)機(jī)對(duì)戰(zhàn)的游戲——支持局域網(wǎng)聯(lián)機(jī)對(duì)戰(zhàn)的五子棋小游戲。廢話不多說(shuō),快來(lái)跟隨小編一起學(xué)習(xí)吧2021-12-12
Python使用高德地圖API批量獲取地址所屬街道并寫回Excel
借助 Python + 高德地圖API,我們可以輕松實(shí)現(xiàn)自動(dòng)化批量查詢并將結(jié)果寫入 Excel 文件中,下面就跟隨小編一起來(lái)看看具體實(shí)現(xiàn)方法與思路吧2025-11-11
Python 如何創(chuàng)建一個(gè)簡(jiǎn)單的REST接口
這篇文章主要介紹了Python 如何創(chuàng)建一個(gè)簡(jiǎn)單的REST接口,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
macOS M1(Apple Silicon)安裝配置Conda環(huán)境的具體實(shí)現(xiàn)
由于常用的Anaconda和Miniconda現(xiàn)在都沒有提供M1處理器支持的conda環(huán)境,以下是conda-forge提供的miniforge,感興趣的可以了解一下2021-08-08

