PyTorch使用教程中的torch包詳解
1、簡(jiǎn)介
torch包是PyTorch框架最外層的包,主要是包含了張量的創(chuàng)建和基本操作、隨機(jī)數(shù)生成器、序列化、局部梯度操作的上下文管理器等等,內(nèi)容很多。我們基礎(chǔ)學(xué)習(xí)的時(shí)候,只有關(guān)注張量的創(chuàng)建、序列化,隨機(jī)數(shù)、張量的數(shù)學(xué)數(shù)學(xué)計(jì)算等常用的點(diǎn)即可。

2、什么是張量
在PyTorch中,張量(Tensor)是一個(gè)核心概念,它是深度學(xué)習(xí)和科學(xué)計(jì)算的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)。在PyTorch的整個(gè)計(jì)算過(guò)程中,所有的數(shù)據(jù)結(jié)構(gòu)都是以張量的形式表現(xiàn)。例如輸入的圖像、標(biāo)簽,輸出的結(jié)構(gòu)等,最終都是以張量的形式進(jìn)入PyTorch的計(jì)算圖。
- 定義:張量是一個(gè)多維數(shù)組,可以看作是標(biāo)量、向量、矩陣的高維擴(kuò)展。
- 性質(zhì):
- 張量具有任意維度,可以是0維(標(biāo)量)、1維(向量)、2維(矩陣)或更高維度。
- 張量支持各種數(shù)學(xué)運(yùn)算,包括加法、乘法、卷積等,這些運(yùn)算可以高效地在CPU或GPU上執(zhí)行。
- 張量可以跟蹤計(jì)算圖,并通過(guò)反向傳播計(jì)算梯度,這對(duì)于深度學(xué)習(xí)中的優(yōu)化任務(wù)至關(guān)重要。
- 張量的屬性:
- 形狀(shape):張量的形狀定義了其維度和每個(gè)維度上的大小,如形狀為(2, 3, 4)的張量表示具有2個(gè)深度、每個(gè)深度包含3行4列的3D數(shù)組。
- 數(shù)據(jù)類型(dtype):張量中的元素具有特定的數(shù)據(jù)類型,如浮點(diǎn)數(shù)(float32、float64)或整數(shù)(int32、int64)等。
- 設(shè)備(device):張量可以存儲(chǔ)在CPU或GPU上,通過(guò)指定設(shè)備參數(shù)可以在不同設(shè)備之間創(chuàng)建或移動(dòng)張量。
3、torch包的張量操作
3.1 張量創(chuàng)建
1. 創(chuàng)建全0的張量
torch.zeros(*size, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor
參數(shù)
size (int…) – 定義輸出張量形狀的整數(shù)序列??梢允强勺償?shù)量的參數(shù)或類似列表或元組的集合。
示例
>>> torch.zeros(2, 3)
tensor([[ 0., 0., 0.],
[ 0., 0., 0.]])
>>> torch.zeros(5)
tensor([ 0., 0., 0., 0., 0.])2. 創(chuàng)建全1的張量
torch.ones(*size, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor
參數(shù)
size (int…) – 定義輸出張量形狀的一系列整數(shù)。可以是可變數(shù)量的參數(shù)或類似列表或元組的集合。
示例
>>> torch.ones(2, 3)
tensor([[ 1., 1., 1.],
[ 1., 1., 1.]])
>>> torch.ones(5)
tensor([ 1., 1., 1., 1., 1.])3. 創(chuàng)建未初始化數(shù)據(jù)的張量
torch.empty(*size, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False, pin_memory=False, memory_format=torch.contiguous_format) → Tensor
參數(shù)
size (int…) – 定義輸出張量形狀的整數(shù)序列??梢允强勺償?shù)量的參數(shù)或集合,如列表或元組。
示例
>>> torch.empty((2,3), dtype=torch.int64)
tensor([[ 9.4064e+13, 2.8000e+01, 9.3493e+13],
[ 7.5751e+18, 7.1428e+18, 7.5955e+18]])4. 創(chuàng)建對(duì)角線上的元素為1的二維張量
torch.eye(n, m=None, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor
參數(shù)
n (int) – 行數(shù)
示例
>>> torch.eye(3)
tensor([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])5. 創(chuàng)建填充指定值的張量
torch.full(size, fill_value, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor
參數(shù)
- size (int…) – 定義輸出張量形狀的整數(shù)列表、元組或 torch.Size。
- fill_value (標(biāo)量) – 用于填充輸出張量的值。
示例
>>> torch.full((2, 3), 3.141592)
tensor([[ 3.1416, 3.1416, 3.1416],
[ 3.1416, 3.1416, 3.1416]])6. 從NumPy 數(shù)組創(chuàng)建的張量:from_numpy
示例
>>> a = numpy.array([1, 2, 3]) >>> t = torch.from_numpy(a) >>> t tensor([ 1, 2, 3]) >>> t[0] = -1 >>> a array([-1, 2, 3])
7. 判斷一個(gè)Obj是不是張量:is_tensor
示例
>>> x = torch.tensor([1, 2, 3]) >>> torch.is_tensor(x) True
3.2 張量操作
1. reshape操作
torch.reshape(input, shape) → Tensor
參數(shù)
- input (Tensor) – 需要形狀改變的張量
- shape (tuple of int) – 新形狀
示例
>>> a = torch.arange(4.)
>>> torch.reshape(a, (2, 2))
tensor([[ 0., 1.],
[ 2., 3.]])
>>> b = torch.tensor([[0, 1], [2, 3]])
>>> torch.reshape(b, (-1,))
tensor([ 0, 1, 2, 3])2. cat操作
在給定的維度上連接給定的張量序列。所有張量必須具有相同的形狀(連接維度除外),或者是一個(gè)大小為 (0,) 的一維空張量。
torch.cat(tensors, dim=0, *, out=None) → Tensor
參數(shù)
- tensors (sequence of Tensors) – 任何相同類型的張量 Python 序列。提供的非空張量必須具有相同的形狀,連接維度除外。
- dim (int, optional) – 連接張量的維度
示例
>>> x = torch.randn(2, 3)
>>> x
tensor([[ 0.6580, -1.0969, -0.4614],
[-0.1034, -0.5790, 0.1497]])
>>> torch.cat((x, x, x), 0)
tensor([[ 0.6580, -1.0969, -0.4614],
[-0.1034, -0.5790, 0.1497],
[ 0.6580, -1.0969, -0.4614],
[-0.1034, -0.5790, 0.1497],
[ 0.6580, -1.0969, -0.4614],
[-0.1034, -0.5790, 0.1497]])
>>> torch.cat((x, x, x), 1)
tensor([[ 0.6580, -1.0969, -0.4614, 0.6580, -1.0969, -0.4614, 0.6580,
-1.0969, -0.4614],
[-0.1034, -0.5790, 0.1497, -0.1034, -0.5790, 0.1497, -0.1034,
-0.5790, 0.1497]])3. squeeze操作
返回一個(gè)張量,其中所有指定維度的 input 大小為 1 的維度都被移除。
torch.squeeze(input, dim=None) → Tensor
示例
>>> x = torch.zeros(2, 1, 2, 1, 2) >>> x.size() torch.Size([2, 1, 2, 1, 2]) >>> y = torch.squeeze(x) >>> y.size() torch.Size([2, 2, 2]) >>> y = torch.squeeze(x, 0) >>> y.size() torch.Size([2, 1, 2, 1, 2]) >>> y = torch.squeeze(x, 1) >>> y.size() torch.Size([2, 2, 1, 2]) >>> y = torch.squeeze(x, (1, 2, 3)) torch.Size([2, 2, 2])
4、 隨機(jī)數(shù)
4.1隨機(jī)數(shù)發(fā)生器配置
1. seed操作
將所有設(shè)備上生成隨機(jī)數(shù)的種子設(shè)置為非確定性隨機(jī)數(shù)。返回用于為 RNG 播種的 64 位數(shù)字。
示例
>>> torch.seed() 269874079427000
2. 手動(dòng)設(shè)置隨機(jī)數(shù)的種子值:manual_seed
設(shè)置所有設(shè)備上生成隨機(jī)數(shù)的種子。
示例
>>> torch.manual_seed(torch.seed()) <torch._C.Generator object at 0x0000022952198270>
4.2 創(chuàng)建隨機(jī)張量
1. torch.rand
創(chuàng)建一個(gè)張量,其中填充了來(lái)自 [0,1) 區(qū)間上的均勻分布的隨機(jī)數(shù)。
torch.rand(*size, *, generator=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False, pin_memory=False) → Tensor
參數(shù)
size (int…) – 定義輸出張量形狀的整數(shù)序列??梢允强勺償?shù)量的參數(shù)或像列表或元組這樣的集合。
示例
>>> torch.rand(4)
tensor([ 0.5204, 0.2503, 0.3525, 0.5673])
>>> torch.rand(2, 3)
tensor([[ 0.8237, 0.5781, 0.6879],
[ 0.3816, 0.7249, 0.0998]])2. randint
創(chuàng)建一個(gè)張量,其中填充了在 low(包含)和 high(不包含)之間均勻生成的隨機(jī)整數(shù)。
torch.randint(low=0, high, size, \*, generator=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor
參數(shù)
- low (int, 可選) – 從分布中抽取的最低整數(shù)。默認(rèn)值:0。
- high (int) – 從分布中抽取的最高整數(shù)加 1。
- size (tuple) – 定義輸出張量形狀的元組。
示例
>>> torch.randint(3, 5, (3,))
tensor([4, 3, 4])
>>> torch.randint(10, (2, 2))
tensor([[0, 2],
[5, 5]])
>>> torch.randint(3, 10, (2, 2))
tensor([[4, 5],
[6, 7]])5、張量的保存和加載
1. 保存
將張量保存到磁盤文件。
torch.save(obj, f, pickle_module=pickle, pickle_protocol=DEFAULT_PROTOCOL, _use_new_zipfile_serialization=True)
PyTorch 的常見(jiàn)約定是使用 .pt 文件擴(kuò)展名保存張量。
參數(shù)
- obj (對(duì)象) – 保存的對(duì)象
- f -保存的命名
示例
>>> x = torch.tensor([0, 1, 2, 3, 4]) >>> torch.save(x, "tensor.pt")
2. 加載
從文件中加載使用 torch.save() 保存的對(duì)象。
torch.load(f, map_location=None, pickle_module=pickle, *, weights_only=False, mmap=None, **pickle_load_args)
參數(shù)
- f 類文件對(duì)象(必須實(shí)現(xiàn) read()、readline()、tell() 和 seek()),或包含文件名的字符串或 os.PathLike 對(duì)象
- map_location (可選[聯(lián)合[可調(diào)用[[Storage, str], Storage], device, str, Dict[str, str]]]) – 一個(gè)函數(shù)、torch.device、字符串或一個(gè)字典,指定如何重新映射存儲(chǔ)位置
當(dāng)在包含 GPU 張量文件上調(diào)用torch.load()時(shí),默認(rèn)情況下,這些張量將加載到 GPU??梢哉{(diào)用torch.load(…, map_location=‘cpu’),然后load_state_dict()來(lái)避免在加載模型檢查時(shí)出現(xiàn) GPU 內(nèi)存激增。
load函數(shù)的用法較多,可以通過(guò)pick_module參數(shù)傳入自定義的序列化和反序列化的模塊,可以通過(guò)字節(jié)流、文件對(duì)象等進(jìn)行張量加載。詳細(xì)的用法可以訪問(wèn)官網(wǎng)的API文檔進(jìn)行查看:https://pytorch.ac.cn/docs/stable/generated/torch.load.html#torch.load。
示例
# 加載張量至CPU
>>> torch.load("tensors.pt", map_location=torch.device("cpu"), weights_only=True)
# 加載張量至 GPU 1
>>> torch.load(
... "tensors.pt",
... map_location=lambda storage, loc: storage.cuda(1),
... weights_only=True,
... ) # type: ignore[attr-defined]6、張量的基礎(chǔ)數(shù)學(xué)計(jì)算
張量的數(shù)學(xué)計(jì)算部分主要是包含了逐元素的線性計(jì)算、統(tǒng)計(jì)信息計(jì)算、比較操作、FFT相關(guān)的頻域操作等等。

1. 絕對(duì)值
torch.abs(input, *, out=None) → Tensor
示例
>>> torch.abs(torch.tensor([-1, -2, 3])) tensor([ 1, 2, 3])
2. 三角函數(shù)相關(guān)
cos、acos、sin、asin、tan、atan、atan2等等。
示例
>>> a = torch.randn(4) >>> a tensor([-0.5461, 0.1347, -2.7266, -0.2746]) >>> torch.sin(a) tensor([-0.5194, 0.1343, -0.4032, -0.2711])
3. 統(tǒng)計(jì)信息相關(guān)
和值sum、均值標(biāo)準(zhǔn)差std_mean、中值median、最大值max、最小值min等等。
>>> a = torch.tensor( ... [[ 0.2035, 1.2959, 1.8101, -0.4644], ... [ 1.5027, -0.3270, 0.5905, 0.6538], ... [-1.5745, 1.3330, -0.5596, -0.6548], ... [ 0.1264, -0.5080, 1.6420, 0.1992]]) >>> torch.std_mean(a, dim=0, keepdim=True) (tensor([[1.2620, 1.0028, 1.0957, 0.6038]]), tensor([[ 0.0645, 0.4485, 0.8707, -0.0665]]))
7、小結(jié)
主要介紹了PyTorch框架中torch包的常用組件,包含張量的創(chuàng)建和基本操作、張量的保存和加載以及隨機(jī)數(shù)、張量的基礎(chǔ)數(shù)學(xué)運(yùn)算等相關(guān)操作。
到此這篇關(guān)于PyTorch使用教程中的torch包詳解的文章就介紹到這了,更多相關(guān)PyTorch torch包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python簡(jiǎn)單的學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
Python Pandas高級(jí)教程之時(shí)間處理
我們發(fā)現(xiàn)關(guān)于時(shí)間日期的簡(jiǎn)單計(jì)算很多功能都是datetime庫(kù)提供的,那么pandas有沒(méi)有提供跟日期時(shí)間有關(guān)的函數(shù),通過(guò)下面文章來(lái)了解下,這篇文章主要給大家介紹了關(guān)于Python Pandas高級(jí)教程之時(shí)間處理的相關(guān)資料,需要的朋友可以參考下2021-10-10
Python使用內(nèi)置json模塊解析json格式數(shù)據(jù)的方法
這篇文章主要介紹了Python使用內(nèi)置json模塊解析json格式數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Python使用內(nèi)置的json模塊實(shí)現(xiàn)json格式數(shù)據(jù)的解析、轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
python疲勞駕駛困倦低頭檢測(cè)功能的實(shí)現(xiàn)
這篇文章主要介紹了python疲勞駕駛困倦低頭檢測(cè),該系統(tǒng)可以檢測(cè)一個(gè)人在開(kāi)車時(shí)是否困倦,及時(shí)提醒,做到安全隱患排查,對(duì)實(shí)現(xiàn)代碼感興趣的朋友一起看看吧2022-04-04
Python數(shù)據(jù)結(jié)構(gòu)與算法(幾種排序)小結(jié)
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)與算法(幾種排序)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
淺談keras 模型用于預(yù)測(cè)時(shí)的注意事項(xiàng)
這篇文章主要介紹了淺談keras 模型用于預(yù)測(cè)時(shí)的注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
使用Python進(jìn)行QQ批量登錄的實(shí)例代碼
這篇文章主要介紹了使用Python進(jìn)行QQ批量登錄的實(shí)例代碼,代碼簡(jiǎn)單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06

