PyTorch使用教程中的torch包詳解
1、簡介
torch包是PyTorch框架最外層的包,主要是包含了張量的創(chuàng)建和基本操作、隨機(jī)數(shù)生成器、序列化、局部梯度操作的上下文管理器等等,內(nèi)容很多。我們基礎(chǔ)學(xué)習(xí)的時候,只有關(guān)注張量的創(chuàng)建、序列化,隨機(jī)數(shù)、張量的數(shù)學(xué)數(shù)學(xué)計算等常用的點(diǎn)即可。
2、什么是張量
在PyTorch中,張量(Tensor)是一個核心概念,它是深度學(xué)習(xí)和科學(xué)計算的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)。在PyTorch的整個計算過程中,所有的數(shù)據(jù)結(jié)構(gòu)都是以張量的形式表現(xiàn)。例如輸入的圖像、標(biāo)簽,輸出的結(jié)構(gòu)等,最終都是以張量的形式進(jìn)入PyTorch的計算圖。
- 定義:張量是一個多維數(shù)組,可以看作是標(biāo)量、向量、矩陣的高維擴(kuò)展。
- 性質(zhì):
- 張量具有任意維度,可以是0維(標(biāo)量)、1維(向量)、2維(矩陣)或更高維度。
- 張量支持各種數(shù)學(xué)運(yùn)算,包括加法、乘法、卷積等,這些運(yùn)算可以高效地在CPU或GPU上執(zhí)行。
- 張量可以跟蹤計算圖,并通過反向傳播計算梯度,這對于深度學(xué)習(xí)中的優(yōu)化任務(wù)至關(guān)重要。
- 張量的屬性:
- 形狀(shape):張量的形狀定義了其維度和每個維度上的大小,如形狀為(2, 3, 4)的張量表示具有2個深度、每個深度包含3行4列的3D數(shù)組。
- 數(shù)據(jù)類型(dtype):張量中的元素具有特定的數(shù)據(jù)類型,如浮點(diǎn)數(shù)(float32、float64)或整數(shù)(int32、int64)等。
- 設(shè)備(device):張量可以存儲在CPU或GPU上,通過指定設(shè)備參數(shù)可以在不同設(shè)備之間創(chuà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)建對角線上的元素為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. 判斷一個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操作
在給定的維度上連接給定的張量序列。所有張量必須具有相同的形狀(連接維度除外),或者是一個大小為 (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操作
返回一個張量,其中所有指定維度的 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. 手動設(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)建一個張量,其中填充了來自 [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)建一個張量,其中填充了在 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 的常見約定是使用 .pt 文件擴(kuò)展名保存張量。
參數(shù)
- obj (對象) – 保存的對象
- f -保存的命名
示例
>>> x = torch.tensor([0, 1, 2, 3, 4]) >>> torch.save(x, "tensor.pt")
2. 加載
從文件中加載使用 torch.save() 保存的對象。
torch.load(f, map_location=None, pickle_module=pickle, *, weights_only=False, mmap=None, **pickle_load_args)
參數(shù)
- f 類文件對象(必須實現(xiàn) read()、readline()、tell() 和 seek()),或包含文件名的字符串或 os.PathLike 對象
- map_location (可選[聯(lián)合[可調(diào)用[[Storage, str], Storage], device, str, Dict[str, str]]]) – 一個函數(shù)、torch.device、字符串或一個字典,指定如何重新映射存儲位置
當(dāng)在包含 GPU 張量文件上調(diào)用torch.load()時,默認(rèn)情況下,這些張量將加載到 GPU??梢哉{(diào)用torch.load(…, map_location=‘cpu’),然后load_state_dict()來避免在加載模型檢查時出現(xiàn) GPU 內(nèi)存激增。
load函數(shù)的用法較多,可以通過pick_module參數(shù)傳入自定義的序列化和反序列化的模塊,可以通過字節(jié)流、文件對象等進(jìn)行張量加載。詳細(xì)的用法可以訪問官網(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é)計算
張量的數(shù)學(xué)計算部分主要是包含了逐元素的線性計算、統(tǒng)計信息計算、比較操作、FFT相關(guān)的頻域操作等等。
1. 絕對值
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)計信息相關(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
win10下Python3.6安裝、配置以及pip安裝包教程
下面小編就為大家?guī)硪黄獁in10下Python3.6安裝、配置以及pip安裝包教程。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10一文詳解如何在Python中從字符串中提取部分內(nèi)容
這篇文章主要介紹了如何在Python中從字符串中提取部分內(nèi)容的相關(guān)資料,包括使用正則表達(dá)式、Pyparsing庫、AST(抽象語法樹)、字符串操作和函數(shù)式編程,每種方法都有其適用場景和優(yōu)缺點(diǎn),需要的朋友可以參考下2025-04-04Python實現(xiàn)樸素貝葉斯的學(xué)習(xí)與分類過程解析
這篇文章主要介紹了Python實現(xiàn)樸素貝葉斯的學(xué)習(xí)與分類過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08比較兩個numpy數(shù)組并實現(xiàn)刪除共有的元素
這篇文章主要介紹了比較兩個numpy數(shù)組并實現(xiàn)刪除共有的元素,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02