国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

深度學(xué)習(xí) pytorch的使用(張量1)

這篇具有很好參考價(jià)值的文章主要介紹了深度學(xué)習(xí) pytorch的使用(張量1)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、張量的創(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])



?下一章深度學(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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包