一、張量的創(chuàng)建
PyTorch 是一個(gè) Python 深度學(xué)習(xí)框架,它將數(shù)據(jù)封裝成張量(Tensor)來進(jìn)行運(yùn)算。 PyTorch 中的張量就是元素為同一種數(shù)據(jù)類型的多維矩陣。在 PyTorch 中, 張量以 "類" 的形式封裝起來,對(duì)張量的一些運(yùn)算、處理的方法被封裝在類中。 一、創(chuàng)建張量的方式 1、torch.tensor 根據(jù)指定數(shù)量創(chuàng)建張量 2、torch.Tensor 根據(jù)形狀創(chuàng)建張量,也可以用來創(chuàng)建指定數(shù)據(jù)的張量 3、torch.IntTensor、torch.DoubleTensor、torch.FloatTensor 創(chuàng)建指定類型的張量 二、創(chuàng)建線性和隨機(jī)張量 1、torch.arange 和 torch.linspace 創(chuàng)建線性張量 2、torch.random.int_seed 和torch.random.manual_seed 隨機(jī)種子設(shè)置 3、torch.randn 創(chuàng)建隨機(jī)張量 三、創(chuàng)建01張量 1、torch.ones 和 torch.ones_like 創(chuàng)建全1張量 2、torch.zeros 和 torch.zeros_like 創(chuàng)建全0張量 3、torch.full 和 torch.full_like 創(chuàng)建全為指定值張量 四、張量元素類型裝換 1、tensor.type(torch.DoubleTensor) 2、torch.double()
?1、基本創(chuàng)建方式
import torch import numpy as np '''一、根據(jù)已有數(shù)據(jù)創(chuàng)建張量''' # 1、創(chuàng)建張量標(biāo)量 data = torch.tensor(10) print(data) # tensor(10) # 2、numpy 數(shù)組,由于data為float64,下面代碼也使用該類型 data = np.random.randn(2, 3) # randn(2,3) 從標(biāo)準(zhǔn)正態(tài)分布中抽取2x3的隨機(jī)數(shù) data = torch.tensor(data) # data將引用一個(gè)新的PyTorch張量。如果data原本不是張量,這段代碼將把它轉(zhuǎn)換為一個(gè)張量。 # 需要注意的是,如果data已經(jīng)是一個(gè)張量,這段代碼實(shí)際上是多余的,因?yàn)镻yTorch中的張量是不可變的,所以你不能將一個(gè)張量賦值給另一個(gè)變量。 print(data) # 3、列表,下面代碼使用默認(rèn)元素類型 float32 data = [[10., 20., 30.], [40., 50., 60.]] data = torch.tensor(data) print(data) print('-'*50,'\n') '''二、創(chuàng)建指定形狀的張量''' # 1、創(chuàng)建2行3列的張量,默認(rèn)dtype為float32 data = torch.Tensor(2, 3) print(data) # 2、注意:如果傳遞列表,則創(chuàng)建包含指定元素的張量 data=torch.Tensor([10]) print(data) data = torch.Tensor([10,20]) print(data) print('-'*50,'\n') '''3、使用具體類型的張量''' # 1、創(chuàng)建2行3列,dtype為int32的張量 data = torch.IntTensor(2,3) print(data) # 2、注意:如果傳遞的元素類型不正確,則會(huì)進(jìn)行類型轉(zhuǎn)換 data = torch.IntTensor([2.5,3.3]) print(data) # 3、其他的類型 data= torch.ShortTensor() # int16 # data1 = torch.longTensor() # int64 data2 = torch.FloatTensor() # float32 data3 = torch.DoubleTensor() # float64
?tensor(10)
tensor([[-1.0923, -0.0842, ?1.5959],
? ? ? ? [ 0.4562, ?1.0242, ?0.0691]], dtype=torch.float64)
tensor([[10., 20., 30.],
? ? ? ? [40., 50., 60.]])
--------------------------------------------------?
tensor([[-1.4189e-09, ?1.7614e-42, ?0.0000e+00],
? ? ? ? [ 0.0000e+00, ?0.0000e+00, ?0.0000e+00]])
tensor([10.])
tensor([10., 20.])
--------------------------------------------------?
tensor([[-1329397088, ? ? ? ?1257, ? ? ? ? ? 0],
? ? ? ? [ ? ? ? ? ?0, ? ? ? ? ? 0, ? ? ? ? ? 0]], dtype=torch.int32)
tensor([2, 3], dtype=torch.int32)
?2、創(chuàng)建線性和隨機(jī)張量
(1)touch.arange 和 torch.linspace 創(chuàng)建線性張量
(2)torch.random.init_seed 和 torch.random.manual_seed隨機(jī)種子(3)torch.randn 創(chuàng)建隨機(jī)張量
torch.random.init_seed 用于初始化隨機(jī)種子(random seed)的函數(shù)。
它通常在程序開始時(shí)被調(diào)用,以確保隨機(jī)數(shù)生成器(random number generator)
的初始化狀態(tài)是確定的。這對(duì)于可重復(fù)性(reproducibility)非常重要,
因?yàn)椴煌碾S機(jī)數(shù)生成器的狀態(tài)可能會(huì)導(dǎo)致不同的隨機(jī)結(jié)果。
torch.random.manual_seed 是一個(gè)用于設(shè)置當(dāng)前線程的隨機(jī)種子(random seed)的函數(shù)。
當(dāng)你使用多個(gè)線程或進(jìn)程進(jìn)行隨機(jī)操作時(shí),每個(gè)線程或進(jìn)程都有自己的隨機(jī)種子,
以確保每個(gè)線程或進(jìn)程生成的隨機(jī)數(shù)是獨(dú)立的。
import torch """ 1、創(chuàng)建線性空間的張量""" def test01(): # 1、在指定的區(qū)間按照步長生成元素[start,end,step] data = torch.arange(0,10,2) print(data) # 2、在指定區(qū)間按照元素個(gè)數(shù)生成 data = torch.linspace(0,11,10) print(data) print('*'*50,'\n') """2、創(chuàng)建隨機(jī)張量""" def test02(): # 1、創(chuàng)建隨機(jī)張量 data = torch.randn(2,3) # 創(chuàng)建2行3列張量 print(data) # 2、隨機(jī)數(shù)種子設(shè)置 print('隨機(jī)數(shù)種子:',torch.random.initial_seed()) torch.random.manual_seed(100) print('隨機(jī)數(shù)種子:',torch.random.initial_seed()) if __name__ == '__main__': test01() test02()
tensor([0, 2, 4, 6, 8])
tensor([ 0.0000, ?1.2222, ?2.4444, ?3.6667, ?4.8889, ?6.1111, ?7.3333, ?8.5556,
? ? ? ? ?9.7778, 11.0000])
**************************************************?
tensor([[-0.5833, -0.1628, -0.9776],
? ? ? ? [-1.3221, -0.3804, -0.8215]])
隨機(jī)數(shù)種子: 716174647341300
隨機(jī)數(shù)種子: 100
?
3、創(chuàng)建01張量
(1)torch.ones (生成一個(gè)全為1的指定大小和數(shù)據(jù)類型的張量)和 torch.one_like (生成一個(gè)與輸入張量形狀、數(shù)據(jù)類型和所在設(shè)備都相同,且所有元素都為1的新張量。)
(2)torch.zeros 和 torch.zeros_like 創(chuàng)建全0張量
(3)torch.full 和 torch.full_like 創(chuàng)建全為指定定值張量
?
import torch # 1.創(chuàng)建全0張量 def test01(): # 1.創(chuàng)建指定形狀全0張量 data=torch.zeros(2,3) print(data) # 2.根據(jù)張量形狀創(chuàng)建全0張量 data = torch.zeros_like(data) print(data) print('-'*50,'\n') # 2.創(chuàng)建全1張量 def test02(): # 1、創(chuàng)建全1張量 data=torch.ones(2,3) print(data) # 2、根據(jù)張量形狀創(chuàng)建全1張量 data = torch.ones_like(data) print(data) print('-'*50,'\n') # 3、創(chuàng)建全為指定值的張量 def test03(): # 1、創(chuàng)建指定形狀的張量 data=torch.full([2,3],10) # 創(chuàng)建一個(gè)2x3的張量,其中所有元素的值都為10 print(data) # 2.根據(jù)張量形狀創(chuàng)建指定值的張量 data = torch.full_like(data,20) # 變量data將引用一個(gè)新的張量,該張量與原來的data形狀相同,但所有元素的值都為20。 # 如果原來的data是一個(gè)可訓(xùn)練的參數(shù)(例如在模型中),那么這段代碼將不會(huì)改變其可訓(xùn)練性。 print(data) if __name__ == '__main__': test01() test02() test03()
tensor([[0., 0., 0.],
? ? ? ? [0., 0., 0.]])
tensor([[0., 0., 0.],
? ? ? ? [0., 0., 0.]])
--------------------------------------------------?
tensor([[1., 1., 1.],
? ? ? ? [1., 1., 1.]])
tensor([[1., 1., 1.],
? ? ? ? [1., 1., 1.]])
--------------------------------------------------?
tensor([[10, 10, 10],
? ? ? ? [10, 10, 10]])
tensor([[20, 20, 20],
? ? ? ? [20, 20, 20]])
4、張量元素類型轉(zhuǎn)換
(1)tensor.type(torch.DoubleTensor) (2)torch.double()
import torch def test(): data = torch.full([2,3],10) print(data) print(data.dtype) # torch.int64 # 將data元素類型轉(zhuǎn)換為 float64類型 # 第一種方法 data = data.type(torch.DoubleTensor) print(data.dtype) # 轉(zhuǎn)換為其他類型 # data = data.type(torch.ShortTensor) # data = data.type(torch.IntTensor) # data = data.type(torch.LongTensor) # data = data.type(torch.FloatTensor) # 2. 第二種方法 data = data.double() print(data.dtype) # 轉(zhuǎn)換為其他類型 # data = data.short() # data = data.int() # data = data.long() # data = data.float() if __name__ == '__main__': test()
?tensor([[10, 10, 10],
? ? ? ? [10, 10, 10]])
torch.int64
torch.float64
torch.float64
二、張量數(shù)值計(jì)算
PyTorch 計(jì)算的數(shù)據(jù)都是以張量形式存在, 我們需要掌握張量各種運(yùn)算. 并且, 我們可以在 CPU 中運(yùn)算, 也可以在 GPU 中運(yùn)算. 1、張量基本運(yùn)算函數(shù)add、sub、mul、div、neg等函數(shù),add_、sub_、mul_、div_、neg_等 inplace函數(shù) 2、張量的阿達(dá)瑪積運(yùn)算mul和運(yùn)算符 * 的用法 3、點(diǎn)積運(yùn)算: 1.運(yùn)算符@用于進(jìn)行兩個(gè)矩陣的點(diǎn)乘運(yùn)算 2.torch.mn 用于兩個(gè)矩陣點(diǎn)運(yùn)算,要求輸入的矩陣為2維 3.torch.bmm 用于批量進(jìn)行矩陣點(diǎn)乘運(yùn)算,要求輸入矩陣為3維 4.torch.matmul 對(duì)進(jìn)行點(diǎn)乘運(yùn)算的兩矩陣形狀沒有限定 (1)對(duì)于輸入都是二維的張量相當(dāng)于mm運(yùn)算 (2)對(duì)于輸入都是三維的張量相當(dāng)于bmm運(yùn)算 (3)對(duì)數(shù)輸入的shape不同的張量,對(duì)應(yīng)的最后幾個(gè)維度必須符合矩陣運(yùn)算規(guī)則 4、將變量移動(dòng)到GPU設(shè)備的方法,列如:cuda方法、直接在GPU上創(chuàng)建張量、使用to方法指定設(shè)備
1、張量基本運(yùn)算
基本運(yùn)算中,包括add、sub、mul、div、neg等函數(shù),以及這些函數(shù)的帶下劃線的版本 add_、sub_、mul_、div_、neg_, 其中帶下劃線的版本為修改原數(shù)據(jù)。import torch def test(): # 創(chuàng)建一個(gè)2x3的張量,其中所有元素是從0到9的隨機(jī)整數(shù)。 data = torch.randint(0, 10, [2, 3]) print(data) print('-' * 50, '\n') # tensor([[8, 3, 8], # [0, 3, 5]]) # 1.不修改原數(shù)據(jù) new_data = data.add(10) # 等價(jià) new_data= data + 10 print(new_data) print('-' * 50) # tensor([[18, 13, 18], # [10, 13, 15]]) # 2.直接修改原數(shù)據(jù) # 帶下劃線的函數(shù)為修改原數(shù)據(jù)本身 data.add_(10) # 等價(jià) data += 10 print(data) print('-' * 50, '\n') # tensor([[18, 18, 14], # [10, 13, 14]]) # 3.其他函數(shù) print(data.sub(100)) # 每個(gè)元素減去100。 # tensor([[-86, -88, -85], # [-83, -89, -87]]) print(data.mul(100)) # 每個(gè)元素乘100。 # tensor([[1400, 1200, 1500], # [1700, 1100, 1300]]) print(data.div(100)) # 每個(gè)元素除以100。 # tensor([[0.1400, 0.1200, 0.1500], # [0.1700, 0.1100, 0.1300]]) print(data.pow(2)) # 每個(gè)元素進(jìn)行平方運(yùn)算 # data.pow(x)表示將data中的每個(gè)元素進(jìn)行x次冪運(yùn)算 print(data.neg()) # 每個(gè)元素取負(fù)值。 # tensor([[-14, -12, -15], # [-17, -11, -13]]) if __name__ == '__main__': test()
?2、阿達(dá)瑪積
阿達(dá)瑪積指的是矩陣對(duì)應(yīng)位置的元素相乘。import torch def test(): data1 = torch.tensor([[1, 2], [3, 4]]) data2 = torch.tensor([[5, 6], [7, 8]]) # 第一種方式 data = torch.mul(data1, data2) # [[1*5,2*6],[3*7,4*8]] print(data) print('-' * 50) # 第二種方式 data = data1 * data2 print(data) if __name__ == '__main__': test()
?tensor([[ 5, 12],
? ? ? ? [21, 32]])
--------------------------------------------------
tensor([[ 5, 12],
? ? ? ? [21, 32]])
3、點(diǎn)積運(yùn)算
點(diǎn)積運(yùn)算要求第一個(gè)矩陣shape:(n,m),第二個(gè)矩陣shape:(m,p), 兩個(gè)矩陣點(diǎn)積運(yùn)算shape為:(n,p)。 1.運(yùn)算符 @ 用于行進(jìn)兩個(gè)矩陣的點(diǎn)乘運(yùn)算 2.torch.mm 用于批量進(jìn)行矩陣點(diǎn)乘運(yùn)算,要求輸入的矩陣為2維 3.torch.bmm 用于批量進(jìn)行矩陣點(diǎn)乘運(yùn)算,要求輸入的矩陣為3維 4.torch.matmul 對(duì)進(jìn)行點(diǎn)乘運(yùn)算的兩矩陣形狀沒有限定 (1)對(duì)于輸入都是二維的張量相當(dāng)于mm運(yùn)算 (2)對(duì)于輸入都是三維的張量相當(dāng)于bmm運(yùn)算 (3)對(duì)數(shù)輸入的shape不同的張量,對(duì)應(yīng)的最后幾個(gè)維度必須符合矩陣運(yùn)算規(guī)則
import torch def test(): data1 = torch.tensor([[1, 2], [3, 4], [5, 6]]) data2 = torch.tensor([[5, 6], [7, 8]]) # 用于進(jìn)行兩個(gè)矩陣點(diǎn)乘運(yùn)算, 要求輸入的矩陣為2維 data = data1 @ data2 print(data) print('-' * 50, '\n') # 批量進(jìn)行矩陣點(diǎn)乘運(yùn)算,要求輸入的矩陣為2維 data = torch.mm(data1, data2) print(data) print('-' * 50, '\n') # 對(duì)進(jìn)行點(diǎn)乘運(yùn)算的兩矩陣形狀沒有限定 data = torch.matmul(data1, data2) print(data) print('-' * 50, '\n') # 2.torch.mm 和 torch.matmull 的區(qū)別 def test02(): # matmul 可以兩個(gè)維度可以不同 # 第一個(gè)張量:(3,4,5) # 第二個(gè)張量:(6,4) # torch.mm 不可以相乘,而matmul則可以相乘 print(torch.matmul(torch.randn(3, 4, 5), torch.randn(5, 4)).shape) print(torch.matmul(torch.randn(5, 4), torch.randn(3, 4, 5)).shape) print('-' * 50, '\n') # 3.torch.mm 函數(shù)的用法 def test03(): # 批量點(diǎn)積運(yùn)算 # 第一個(gè)維度為 batch_size # 矩陣的二三維要滿足矩陣乘法規(guī)則 data1 = torch.randn(3, 4, 5) data2 = torch.randn(3, 5, 8) data = torch.bmm(data1, data2) print(data) if __name__ == '__main__': test() test02() test03()
tensor([[19, 22],
? ? ? ? [43, 50],
? ? ? ? [67, 78]])
--------------------------------------------------?
tensor([[19, 22],
? ? ? ? [43, 50],
? ? ? ? [67, 78]])
--------------------------------------------------?
tensor([[19, 22],
? ? ? ? [43, 50],
? ? ? ? [67, 78]])
--------------------------------------------------?
torch.Size([3, 4, 4])
torch.Size([3, 5, 5])
--------------------------------------------------?
tensor([[[-3.3189, -0.3784, -6.3479, -3.3475, -3.9737, ?1.7464, -2.7687,
? ? ? ? ? -0.9181],
? ? ? ? ?[ 0.0657, -0.2776, ?2.9985, ?1.5493, ?1.4645, -0.6488, -0.0580,
? ? ? ? ? ?2.7036],
? ? ? ? ?[ 3.4215, ?2.5035, -2.5772, -2.2317, -0.6113, -2.5934, ?1.1607,
? ? ? ? ? -6.8029],
? ? ? ? ?[-1.0585, -1.1550, ?0.1955, -0.2993, -0.5298, ?1.7574, ?1.8202,
? ? ? ? ? -0.3616]],
? ? ? ? [[-2.6059, -2.8264, -0.5585, -2.1495, -2.0957, ?3.0431, -0.7977,
? ? ? ? ? -1.4202],
? ? ? ? ?[-1.5534, -4.2426, -1.0050, ?1.3967, ?0.7109, -0.9517, ?0.1070,
? ? ? ? ? -0.2648],
? ? ? ? ?[ 0.6576, ?1.1402, -3.3091, -2.2596, ?0.7378, ?0.0913, -0.4637,
? ? ? ? ? ?0.3685],
? ? ? ? ?[ 0.5477, ?7.8370, -3.4599, ?0.2049, ?1.9473, ?3.3985, ?0.6210,
? ? ? ? ? ?2.2007]],
? ? ? ? [[-1.0721, -3.0084, ?5.7614, -2.1393, ?0.1105, -3.4166, -3.6502,
? ? ? ? ? ?0.4989],
? ? ? ? ?[-3.6817, -3.9418, -4.5009, ?1.9726, ?2.5341, ?2.1373, ?0.9370,
? ? ? ? ? ?1.8017],
? ? ? ? ?[-2.0373, -1.7121, -0.4053, ?1.8295, ?0.6069, ?1.3398, ?1.8115,
? ? ? ? ? ?1.5270],
? ? ? ? ?[-0.5211, -0.8808, -2.2229, -0.6684, ?1.0515, ?0.3870, -0.3195,
? ? ? ? ? ?0.1012]]])
?
4、指定運(yùn)算設(shè)備
PyTorch 默認(rèn)會(huì)將張量創(chuàng)建在 CPU 控制的內(nèi)存中, 即: 默認(rèn)的運(yùn)算設(shè)備為 CPU。 我們也可以將張量創(chuàng)建在 GPU 上, 能夠利用對(duì)于矩陣計(jì)算的優(yōu)勢(shì)加快模型訓(xùn)練。 將張量移動(dòng)到 GPU 上有兩種方法: 1. 使用 cuda 方法 2. 直接在 GPU上創(chuàng)建張量 3. 使用 to 方法指定設(shè)備
import torch """1. 使用 cuda 方法""" data = torch.tensor([10, 20, 30]) print('存儲(chǔ)設(shè)備:', data.device) ''' # 如果安裝的不是 gpu 版本的 PyTorch # 或電腦本身沒有 NVIDIA 卡的計(jì)算環(huán)境 # 下面代碼可能會(huì)報(bào)錯(cuò) data = data.cuda() print('存儲(chǔ)設(shè)備:', data.device) # 使用 cpu 函數(shù)將張量移動(dòng)到 cpu 上 data = data.cpu() print('存儲(chǔ)設(shè)備:', data.device) # 輸出結(jié)果: # 存儲(chǔ)設(shè)備: cpu # 存儲(chǔ)設(shè)備: cuda:0 # 存儲(chǔ)設(shè)備: cpu print('-'*50,'\n') """2. 直接將張量創(chuàng)建在 GPU 上""" data = torch.tensor([10, 20, 30], device='cuda:0') print('存儲(chǔ)設(shè)備:', data.device) # 使用 cpu 函數(shù)將張量移動(dòng)到 cpu 上 data = data.cpu() print('存儲(chǔ)設(shè)備:', data.device) # 輸出結(jié)果: # 存儲(chǔ)設(shè)備: cuda:0 # 存儲(chǔ)設(shè)備: cpu # 3. 使用 to 方法 data = torch.tensor([10, 20, 30]) print('存儲(chǔ)設(shè)備:', data.device) data = data.to('cuda:0') print('存儲(chǔ)設(shè)備:', data.device) # 輸出結(jié)果: # 存儲(chǔ)設(shè)備: cpu # 存儲(chǔ)設(shè)備: cuda:0 # 4. 存儲(chǔ)在不同設(shè)備的張量不能運(yùn)算 data1 = torch.tensor([10, 20, 30], device='cuda:0') data2 = torch.tensor([10, 20, 30]) print(data1.device, data2.device) # RuntimeError: Expected all tensors to be on the same device, # but found at least two devices, cuda:0 and cpu! data = data1 + data2 print(data)
存儲(chǔ)設(shè)備: cpu
三、張量類型轉(zhuǎn)換
numpy和Tensor互相裝換的規(guī)則,以及標(biāo)量張量與數(shù)值之前的轉(zhuǎn)換規(guī)則
使用numpy函數(shù)可以將張量轉(zhuǎn)換為ndarray數(shù)組,但是共享內(nèi)存,可以使用copy函數(shù)避免共享# encoding=utf-8 # 張量轉(zhuǎn)換為numpy數(shù)組 """ 使用numpy函數(shù)可以將張量轉(zhuǎn)換為ndarray數(shù)組, 但是共享內(nèi)存,可以使用copy函數(shù)避免共享 """ # 1. 將張量轉(zhuǎn)換為 numpy 數(shù)組 import torch def test01(): data_tensor = torch.tensor([2, 3, 4]) # 使用張量對(duì)象中的 numpy 函數(shù)進(jìn)行轉(zhuǎn)換 data_numpy = data_tensor.numpy() print(type(data_tensor)) print(type(data_numpy)) # 注意: data_tensor 和 data_numpy 共享內(nèi)存 # 修改其中的一個(gè),另外一個(gè)也會(huì)發(fā)生改變 # data_tensor[0] = 100 data_numpy[0] = 100 print(data_tensor) print(data_numpy) # 2. 對(duì)象拷貝避免共享內(nèi)存 def test02(): data_tensor = torch.tensor([2, 3, 4]) # 使用張量對(duì)象中的 numpy 函數(shù)進(jìn)行轉(zhuǎn)換 data_numpy = data_tensor.numpy() print(type(data_tensor)) print(type(data_numpy)) # 注意: data_tensor 和 data_numpy 共享內(nèi)存 # 修改其中的一個(gè),另外一個(gè)也會(huì)發(fā)生改變 # data_tensor[0] = 100 data_numpy[0] = 100 print(data_tensor) print(data_numpy) if __name__ == '__main__': test01() test02()
<class 'torch.Tensor'>
<class 'numpy.ndarray'>
tensor([100, ? 3, ? 4])
[100 ? 3 ? 4]
<class 'torch.Tensor'>
<class 'numpy.ndarray'>
tensor([100, ? 3, ? 4])
[100 ? 3 ? 4]
?
?2、 numpy 轉(zhuǎn)換為張量
使用 from_numpy 可以將 ndarray 數(shù)組轉(zhuǎn)換為 Tensor,默認(rèn)共享內(nèi)存,使用 copy 函數(shù)避免共享。 使用 torch.tensor 可以將 ndarray 數(shù)組轉(zhuǎn)換為 Tensor,默認(rèn)不共享內(nèi)存。
import torch import numpy as np # 1. 使用 from_numpy 函數(shù) def test01(): data_numpy = np.array([2, 3, 4]) # 將 numpy 數(shù)組轉(zhuǎn)換為張量類型 # 1. from_numpy # 2. torch.tensor(ndarray) # 淺拷貝 data_tensor = torch.from_numpy(data_numpy) # nunpy 和 tensor 共享內(nèi)存 # data_numpy[0] = 100 data_tensor[0] = 100 print(data_tensor) print(data_numpy) # 2. 使用 torch.tensor 函數(shù) def test02(): data_numpy = np.array([2, 3, 4]) data_tensor = torch.tensor(data_numpy) # nunpy 和 tensor 不共享內(nèi)存 # data_numpy[0] = 100 data_tensor[0] = 100 print(data_tensor) print(data_numpy) if __name__ == '__main__': test01() test02()
tensor([100, ? 3, ? 4], dtype=torch.int32)
[100 ? 3 ? 4]
tensor([100, ? 3, ? 4], dtype=torch.int32)
[2 3 4]
?
3、標(biāo)量和數(shù)字的轉(zhuǎn)換
對(duì)于只有一個(gè)元素的張量,使用item方法將改制從張量中提取出來import torch # 當(dāng)張量只包含一個(gè)元素時(shí), 可以通過 item 函數(shù)提取出該值 data = torch.tensor([30,]) print(data.item()) data = torch.tensor(30) print(data.item())
30
30
四、張量的拼接
cat 函數(shù)可以將張量按照指定的維度拼接起來, stack 函數(shù)可以將張量按照指定的維度疊加起來。
1、torch.cat 函數(shù)可以將兩個(gè)張量根據(jù)指定的維度拼接起來
import torch data1 = torch.randint(0,10,[3,5,4]) data2 = torch.randint(0,10,[3,5,4]) print(data1) print(data2)
tensor([[[7, 2, 8, 2],
? ? ? ? ?[7, 9, 9, 9],
? ? ? ? ?[5, 9, 3, 5],
? ? ? ? ?[1, 7, 9, 4],
? ? ? ? ?[3, 9, 0, 7]],? ? ? ? [[6, 8, 2, 6],
? ? ? ? ?[6, 0, 9, 2],
? ? ? ? ?[4, 0, 6, 8],
? ? ? ? ?[3, 9, 9, 8],
? ? ? ? ?[4, 4, 0, 1]],? ? ? ? [[9, 6, 4, 3],
? ? ? ? ?[4, 0, 4, 7],
? ? ? ? ?[4, 7, 5, 5],
? ? ? ? ?[2, 0, 5, 4],
? ? ? ? ?[5, 3, 3, 2]]])
tensor([[[2, 9, 9, 0],
? ? ? ? ?[6, 7, 5, 7],
? ? ? ? ?[4, 6, 5, 4],
? ? ? ? ?[7, 2, 5, 1],
? ? ? ? ?[0, 5, 1, 5]],? ? ? ? [[1, 8, 9, 5],
? ? ? ? ?[8, 1, 5, 0],
? ? ? ? ?[5, 9, 1, 3],
? ? ? ? ?[4, 2, 1, 0],
? ? ? ? ?[5, 2, 5, 2]],? ? ? ? [[5, 2, 6, 0],
? ? ? ? ?[7, 7, 0, 3],
? ? ? ? ?[5, 5, 6, 7],
? ? ? ? ?[3, 6, 4, 7],
? ? ? ? ?[3, 8, 8, 6]]])
?# 1.按0維度拼接 new_data = torch.cat([data1,data2],dim=0) # dim=0 :在第0維度(即第一個(gè)維度)上連接兩個(gè)張量 print('\n按0維度拼接\n',new_data) print(new_data.shape) # 形狀將為(len(data1) + len(data2), ...)
按0維度拼接
?tensor([[[7, 2, 8, 2],
? ? ? ? ?[7, 9, 9, 9],
? ? ? ? ?[5, 9, 3, 5],
? ? ? ? ?[1, 7, 9, 4],
? ? ? ? ?[3, 9, 0, 7]],? ? ? ? [[6, 8, 2, 6],
? ? ? ? ?[6, 0, 9, 2],
? ? ? ? ?[4, 0, 6, 8],
? ? ? ? ?[3, 9, 9, 8],
? ? ? ? ?[4, 4, 0, 1]],? ? ? ? [[9, 6, 4, 3],
? ? ? ? ?[4, 0, 4, 7],
? ? ? ? ?[4, 7, 5, 5],
? ? ? ? ?[2, 0, 5, 4],
? ? ? ? ?[5, 3, 3, 2]],? ? ? ? [[2, 9, 9, 0],
? ? ? ? ?[6, 7, 5, 7],
? ? ? ? ?[4, 6, 5, 4],
? ? ? ? ?[7, 2, 5, 1],
? ? ? ? ?[0, 5, 1, 5]],? ? ? ? [[1, 8, 9, 5],
? ? ? ? ?[8, 1, 5, 0],
? ? ? ? ?[5, 9, 1, 3],
? ? ? ? ?[4, 2, 1, 0],
? ? ? ? ?[5, 2, 5, 2]],? ? ? ? [[5, 2, 6, 0],
? ? ? ? ?[7, 7, 0, 3],
? ? ? ? ?[5, 5, 6, 7],
? ? ? ? ?[3, 6, 4, 7],
? ? ? ? ?[3, 8, 8, 6]]])
torch.Size([6, 5, 4])
?# 按1維度拼接 new_data = torch.cat([data1, data2], dim=1) print('\n按1維度拼接\n',new_data) print(new_data.shape) # 按2維度拼接 new_data = torch.cat([data1, data2], dim=2) print('\n按2維度拼接\n',new_data) print(new_data.shape)
按1維度拼接
?tensor([[[7, 2, 8, 2],
? ? ? ? ?[7, 9, 9, 9],
? ? ? ? ?[5, 9, 3, 5],
? ? ? ? ?[1, 7, 9, 4],
? ? ? ? ?[3, 9, 0, 7],
? ? ? ? ?[2, 9, 9, 0],
? ? ? ? ?[6, 7, 5, 7],
? ? ? ? ?[4, 6, 5, 4],
? ? ? ? ?[7, 2, 5, 1],
? ? ? ? ?[0, 5, 1, 5]],? ? ? ? [[6, 8, 2, 6],
? ? ? ? ?[6, 0, 9, 2],
? ? ? ? ?[4, 0, 6, 8],
? ? ? ? ?[3, 9, 9, 8],
? ? ? ? ?[4, 4, 0, 1],
? ? ? ? ?[1, 8, 9, 5],
? ? ? ? ?[8, 1, 5, 0],
? ? ? ? ?[5, 9, 1, 3],
? ? ? ? ?[4, 2, 1, 0],
? ? ? ? ?[5, 2, 5, 2]],? ? ? ? [[9, 6, 4, 3],
? ? ? ? ?[4, 0, 4, 7],
? ? ? ? ?[4, 7, 5, 5],
? ? ? ? ?[2, 0, 5, 4],
? ? ? ? ?[5, 3, 3, 2],
? ? ? ? ?[5, 2, 6, 0],
? ? ? ? ?[7, 7, 0, 3],
? ? ? ? ?[5, 5, 6, 7],
? ? ? ? ?[3, 6, 4, 7],
? ? ? ? ?[3, 8, 8, 6]]])
torch.Size([3, 10, 4])按2維度拼接
?tensor([[[7, 2, 8, 2, 2, 9, 9, 0],
? ? ? ? ?[7, 9, 9, 9, 6, 7, 5, 7],
? ? ? ? ?[5, 9, 3, 5, 4, 6, 5, 4],
? ? ? ? ?[1, 7, 9, 4, 7, 2, 5, 1],
? ? ? ? ?[3, 9, 0, 7, 0, 5, 1, 5]],? ? ? ? [[6, 8, 2, 6, 1, 8, 9, 5],
? ? ? ? ?[6, 0, 9, 2, 8, 1, 5, 0],
? ? ? ? ?[4, 0, 6, 8, 5, 9, 1, 3],
? ? ? ? ?[3, 9, 9, 8, 4, 2, 1, 0],
? ? ? ? ?[4, 4, 0, 1, 5, 2, 5, 2]],? ? ? ? [[9, 6, 4, 3, 5, 2, 6, 0],
? ? ? ? ?[4, 0, 4, 7, 7, 7, 0, 3],
? ? ? ? ?[4, 7, 5, 5, 5, 5, 6, 7],
? ? ? ? ?[2, 0, 5, 4, 3, 6, 4, 7],
? ? ? ? ?[5, 3, 3, 2, 3, 8, 8, 6]]])
torch.Size([3, 5, 8])
?
?2、torch.stack 函數(shù)可以將兩個(gè)張量根據(jù)指定的維度疊加起來
import torch def test(): data1 = torch.randint(0,10,[2,3]) data2 = torch.randint(0,10,[2,3]) print(data1) print(data2) new_data0 = torch.stack([data1,data2],dim=0) print('\nnew_data0:\n',new_data0) print(new_data0.shape) new_data1 = torch.stack([data1,data2],dim=1) print('\nnew_data1:\n',new_data1) print(new_data1.shape) new_data2 = torch.stack([data1,data2],dim=2) print('\nnew_data2:\n',new_data2) print(new_data2.shape) if __name__ == '__main__': test()
tensor([[1, 3, 3],
? ? ? ? [6, 5, 3]])
tensor([[2, 0, 9],
? ? ? ? [8, 0, 3]])
new_data0:
?tensor([[[1, 3, 3],
? ? ? ? ?[6, 5, 3]],
? ? ? ? [[2, 0, 9],
? ? ? ? ?[8, 0, 3]]])
torch.Size([2, 2, 3])
new_data1:
?tensor([[[1, 3, 3],
? ? ? ? ?[2, 0, 9]],
? ? ? ? [[6, 5, 3],
? ? ? ? ?[8, 0, 3]]])
torch.Size([2, 2, 3])
new_data2:
?tensor([[[1, 2],
? ? ? ? ?[3, 0],
? ? ? ? ?[3, 9]],
? ? ? ? [[6, 8],
? ? ? ? ?[5, 0],
? ? ? ? ?[3, 3]]])
torch.Size([2, 3, 2])文章來源:http://www.zghlxwxcb.cn/news/detail-815622.html
?下一章深度學(xué)習(xí) pytorch的使用(張量2)文章來源地址http://www.zghlxwxcb.cn/news/detail-815622.html
到了這里,關(guān)于深度學(xué)習(xí) pytorch的使用(張量1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!