<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          5分鐘玩轉(zhuǎn)PyTorch |熟練掌握Tensor的科學(xué)運(yùn)算與線代運(yùn)算

          共 6754字,需瀏覽 14分鐘

           ·

          2021-12-11 07:31

          AI因你而升溫,記得加個(gè)星標(biāo)哦!

          ↑?關(guān)注 + 星標(biāo)?,每天學(xué)Python新技能

          后臺(tái)回復(fù)【大禮包】送你Python自學(xué)大禮包


          前兩節(jié)介紹了張量的科學(xué)運(yùn)算與矩陣運(yùn)算,本文就對(duì)以上內(nèi)容進(jìn)行濃縮總結(jié),幫助大家熟練掌握Tensor的運(yùn)算技巧,為深度學(xué)習(xí)打好基礎(chǔ)。

          一、張量的科學(xué)運(yùn)算

          1 進(jìn)行數(shù)值調(diào)整

          t?=?torch.randn(5)
          t
          #?tensor([?0.3806,??0.9064,?-1.9179,??2.0816,?-0.4153])

          1.1 返回絕對(duì)值

          torch.abs(t)
          #?tensor([0.3806,?0.9064,?1.9179,?2.0816,?0.4153])

          1.2 返回相反數(shù)

          torch.neg(t)
          #?tensor([-0.3806,?-0.9064,??1.9179,?-2.0816,??0.4153])

          1.3 四舍五入

          torch.round(t)
          #?tensor([?0.,??1.,?-2.,??2.,?-0.])

          1.4 向上取整

          torch.ceil(t)?
          #?tensor([?1.,??1.,?-1.,??3.,?-0.])

          1.5 向下取整

          torch.floor(t)
          #?tensor([?0.,??0.,?-2.,??2.,?-1.])

          注意

          雖然此類型函數(shù)并不會(huì)對(duì)原對(duì)象進(jìn)行調(diào)整,而是輸出新的結(jié)果。

          #?t本身并未發(fā)生變化
          t
          #?tensor([?0.3806,??0.9064,?-1.9179,??2.0816,?-0.4153])

          若要對(duì)原對(duì)象本身進(jìn)行修改,可使用方法_()。

          #?使用方法_()
          t.round_()
          #?tensor([?0.,??1.,?-2.,??2.,?-0.])

          #?原對(duì)象也進(jìn)行了改變
          t
          #?tensor([?0.,??1.,?-2.,??2.,?-0

          2 常用的數(shù)學(xué)計(jì)算

          需要注意的有以下兩點(diǎn):

          1. 因?yàn)閺埩磕苤付ㄔ?code style="padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(200, 54, 6);font-size: 13px;">CPU或者GPU上運(yùn)行,因此tensor的大多數(shù)科學(xué)計(jì)算只能作用于tensor對(duì)象,而不能和Python對(duì)象混用
          #?計(jì)算3的3次方
          torch.pow(3,?3)
          #?報(bào)錯(cuò)!TypeError

          #?需使用tensor對(duì)象
          torch.pow(torch.tensor(3),?3)
          #?tensor(27)
          1. 由于會(huì)涉及GPU計(jì)算,所以對(duì)運(yùn)算結(jié)果一般是小數(shù)的函數(shù),要求函數(shù)只能輸入浮點(diǎn)型張量,而不能是整型
          t?=?torch.arange(1,?4)
          t.dtype
          #?torch.int64
          torch.exp(t)
          #?報(bào)錯(cuò)!RuntimeError

          #?需要傳入浮點(diǎn)型數(shù)據(jù)
          torch.exp(t.float())
          #?tensor([1.0000,?2.7183,?0.1353,?7.3891,?1.0000])

          常用數(shù)學(xué)計(jì)算:

          數(shù)學(xué)運(yùn)算函數(shù)數(shù)學(xué)公式功能
          冪運(yùn)算

          torch.exp(t)
          返回以e為底、t中元素為冪的張量
          torch.pow(t,n)
          返回t的n次冪
          torch.sqrt(t)
          返回t的平方根
          torch.square(t)
          返回輸入的元素平方
          對(duì)數(shù)運(yùn)算

          torch.log10(t)
          返回以10為底的t的對(duì)數(shù)
          torch.log(t)
          返回以e為底的t的對(duì)數(shù)
          torch.log2(t)
          返回以2為底的t的對(duì)數(shù)

          3 統(tǒng)計(jì)分析

          此類計(jì)算是對(duì)某張量進(jìn)行某種總結(jié),最后得出一個(gè)具體總結(jié)值的函數(shù)。

          函數(shù)功能
          torch.mean(t)返回張量均值
          torch.var(t)返回張量方差
          torch.std(t)返回張量標(biāo)準(zhǔn)差
          torch.var_mean(t)返回張量方差和均值
          torch.std_mean(t)返回張量標(biāo)準(zhǔn)差和均值
          torch.max(t)返回張量最大值
          torch.argmax(t)返回張量最大值索引
          torch.min(t)返回張量最小值
          torch.argmin(t)返回張量最小值索引
          torch.median(t)返回張量中位數(shù)
          torch.sum(t)返回張量求和結(jié)果
          torch.prod(t)返回張量累乘結(jié)果
          torch.dist(t1, t2)計(jì)算兩個(gè)張量的閔式距離,可使用不同范式
          torch.topk(t)返回t中最大的k個(gè)值對(duì)應(yīng)的指標(biāo)
          • 這里著重介紹一下常用的距離公式dist(),為閔可夫斯基距離,通過(guò)輸入不同的p值,可方便計(jì)算曼哈頓距離、歐拉距離:
          #?輸入float型
          t1?=?torch.tensor([1,?2,?3]).float()
          t2?=?torch.tensor([4,?5,?6]).float()

          #?計(jì)算曼哈頓距離
          torch.dist(t1,?t2,?1)
          #?tensor(9.)

          #?計(jì)算歐拉距離
          torch.dist(t1,?t2,?2)
          #?tensor(5.1962)

          二、張量的線代運(yùn)算

          大學(xué)時(shí)學(xué)的《線代》,其實(shí)就是學(xué)了矩陣的性質(zhì)和運(yùn)算,而矩陣的本質(zhì)可看為線性方程,線性方程又是一個(gè)個(gè)基礎(chǔ)的神經(jīng)元。

          1 矩陣形變的構(gòu)造

          矩陣的形變與構(gòu)造的方法與二維張量的方法相同。

          #?創(chuàng)建一個(gè)2*3的矩陣
          t1?=?torch.arange(6).reshape(2,?3).float()
          t1
          #?tensor([[0.,?1.,?2.],
          #?????????[3.,?4.,?5.]])

          1.1 t:轉(zhuǎn)置

          torch.t(t1)
          #?tensor([[0.,?3.],
          #?????????[1.,?4.],
          #?????????[2.,?5.]])

          矩陣的轉(zhuǎn)置是每個(gè)元素行列位置進(jìn)行互換。

          1.2 eye:單位矩陣

          torch.eye(3)
          #?tensor([[1.,?0.,?0.],
          #?????????[0.,?1.,?0.],
          #?????????[0.,?0.,?1.]])

          1.3 diag:對(duì)角矩陣

          注意參數(shù)的數(shù)據(jù)類型必須是張量。

          t?=?torch.arange(1,?4)
          t
          #?tensor([1,?2,?3])

          torch.diag(t)
          #?tensor([[1,?0,?0],
          #?????????[0,?2,?0],
          #?????????[0,?0,?3]])

          1.4 triu:取上三角矩陣

          t2?=?torch.arange(1,?10).reshape(3,?3)
          t2
          #?tensor([[1,?2,?3],
          #?????????[4,?5,?6],
          #?????????[7,?8,?9]])
          • 取上三角矩陣
          torch.triu(t2)
          #?tensor([[1,?2,?3],
          #?????????[0,?5,?6],
          #?????????[0,?0,?9]])

          1.5 tril:取下三角矩陣

          torch.tril(t2)
          #?tensor([[1,?0,?0],
          #?????????[4,?5,?0],
          #?????????[7,?8,?9]])

          2 矩陣的基本運(yùn)算與意義

          矩陣的線性代數(shù)含義主要體現(xiàn)在它的基本運(yùn)算上。

          2.1 dot\vdot:點(diǎn)積計(jì)算

          PyTorch中,dotvdot只能用于一維張量。兩種函數(shù)只在進(jìn)行復(fù)數(shù)運(yùn)算時(shí)有區(qū)別。

          t?=?torch.arange(1,?4)
          t
          #?tensor([1,?2,?3])

          torch.dot(t,?t)
          #?tensor(14)

          torch.vdot(t,?t)
          #?tensor(14)

          2.2 mm:矩陣乘法

          t1?=?torch.arange(1,?7).reshape(2,?3)
          t1
          #?tensor([[1,?2,?3],
          #?????????[4,?5,?6]])

          t2?=?torch.arange(1,?10).reshape(3,?3)
          t2
          #?tensor([[1,?2,?3],
          #?????????[4,?5,?6],
          #?????????[7,?8,?9]])

          矩陣對(duì)應(yīng)位置元素相乘,要求兩個(gè)矩陣的形狀相同。

          t1?*?t1
          #?tensor([[?1,??4,??9],
          #?????????[16,?25,?36]])

          而矩陣乘法兩個(gè)矩陣的形狀可以不同。

          torch.mm(t1,?t2)
          #?tensor([[?1,??4,??9],
          #?????????[16,?25,?36]])

          計(jì)算過(guò)程如下所示:

          規(guī)律總結(jié)如下:

          1. 左邊矩陣的列數(shù)要和右邊矩陣的行數(shù)相等,左邊矩陣每行與右邊矩陣每列對(duì)應(yīng)位置元素相乘后相加
          2. 左邊矩陣的行數(shù)決定了結(jié)果矩陣的行數(shù),右邊矩陣的列數(shù)決定了結(jié)果矩陣的列數(shù)

          矩陣相乘需要注意:

          • 不滿足交換律:
          A?=?torch.tensor([1,?1,?-1,?-1])..reshape(2,?2)
          A
          #?tensor([[?1,??1],
          #?????????[-1,?-1]])
          ????????
          B?=?torch.tensor([1,?-1,?-1,?1]).reshape(2,?2)
          B
          #?tensor([[?1,?-1],
          #?????????[-1,??1]])

          torch.mm(A,?B)
          #?tensor([[0,?0],
          #?????????[0,?0]])

          torch.mm(B,?A)
          #?tensor([[?2,??2],
          #?????????[-2,?-2]])
          • 不滿足消去律:
          C?=?torch.tensor([0,?0,?0,?0]).reshape(2,?2)
          C
          #?tensor([[0,?0],
          #?????????[0,?0]])

          torch.mm(A,?B)
          #?tensor([[0,?0],
          #?????????[0,?0]])
          ????????
          torch.mm(A,?C)
          #?tensor([[0,?0],
          #?????????[0,?0]])

          2.3 mv:矩陣與向量相乘

          矩陣和向量相乘的過(guò)程中,需要矩陣的列數(shù)和向量的元素個(gè)數(shù)相同。

          m?=?torch.arange(1,?7).reshape(2,?3)
          m
          #?tensor([[1,?2,?3],
          #?????????[4,?5,?6]])

          v?=?torch.arange(1,?4)
          v
          #?tensor([1,?2,?3])

          torch.mv(m,?v)
          #?tensor([14,?32])

          矩陣和向量相乘的過(guò)程我們可以看成是先將向量轉(zhuǎn)化為列向量然后再相乘。

          #?轉(zhuǎn)化為列向量
          v.reshape(3,?1)?????
          #?tensor([[1],
          #?????????[2],
          #?????????[3]])

          torch.mm(m,?v.reshape(3,?1))
          #?tensor([[14],
          #?????????[32]])
          ????????
          torch.mm(m,?v.reshape(3,?1)).flatten()
          #?tensor([14,?32])

          2.4 矩陣的本質(zhì)是線性方程

          mv函數(shù)本質(zhì)上提供了一種二維張量和一維張量相乘的方法,在線性代數(shù)運(yùn)算過(guò)程中,有很多矩陣乘向量的場(chǎng)景,典型的如線性回歸的求解過(guò)程。

          矩陣的最初目的,只是為線性方程組提供一個(gè)簡(jiǎn)寫(xiě)形式。

          通常情況下我們需要將行向量(x,y)轉(zhuǎn)化為列向量然后進(jìn)行計(jì)算,但PyTorch中單獨(dú)設(shè)置了一個(gè)矩陣和向量相乘的方法,從而簡(jiǎn)化了將向量轉(zhuǎn)化為列向量的轉(zhuǎn)化過(guò)程。

          2.5 bmm:批量矩陣相乘

          批量矩陣相乘指的是三維張量的矩陣乘法,本質(zhì)是三維張量?jī)?nèi)部各對(duì)應(yīng)位置的矩陣相乘,在深度學(xué)習(xí)中有非常多的應(yīng)用場(chǎng)景。

          t3?=?torch.arange(1,?13).reshape(3,?2,?2)
          t3
          #?tensor([[[?1,??2],
          #??????????[?3,??4]],

          #?????????[[?5,??6],
          #??????????[?7,??8]],

          #?????????[[?9,?10],
          #??????????[11,?12]]])
          ?????????
          t4?=?torch.arange(1,?19).reshape(3,?2,?3)
          t4
          #?tensor([[[?1,??2,??3],
          #??????????[?4,??5,??6]],

          #?????????[[?7,??8,??9],
          #??????????[10,?11,?12]],

          #?????????[[13,?14,?15],
          #??????????[16,?17,?18]]])

          torch.bmm(t3,?t4)
          #?tensor([[[??9,??12,??15],
          #??????????[?19,??26,??33]],

          #?????????[[?95,?106,?117],
          #??????????[129,?144,?159]],

          #?????????[[277,?296,?315],
          #??????????[335,?358,?381]]])

          需要注意:

          • 三維張量包含的矩陣個(gè)數(shù)需要相同
          • 每個(gè)內(nèi)部矩陣,需要滿足左乘矩陣的列數(shù)要等于右乘矩陣的行數(shù)

          2.6 addmm:矩陣相乘后相加

          • addmm函數(shù)結(jié)構(gòu):addmm(input, mat1, mat2, beta=1, alpha=1)

          • 輸出結(jié)果:beta * input + alpha * (mat1 * mat2)

          • 相當(dāng)于y = ax + b中加偏置的過(guò)程,就是線性方程或基本的神經(jīng)元

          t1
          #?tensor([[1,?2,?3],
          #?????????[4,?5,?6]])
          ????????
          t2
          #?tensor([[1,?2,?3],
          #?????????[4,?5,?6],
          #?????????[7,?8,?9]])

          t?=?torch.arange(3)
          t
          #?tensor([0,?1,?2]

          #?矩陣乘法
          torch.mm(t1,?t2)
          #?tensor([[30,?36,?42],
          #?????????[66,?81,?96]])

          #?先乘法后相加
          torch.addmm(t,?t1,?t2)
          #?tensor([[30,?37,?44],
          #?????????[66,?82,?98]])

          torch.addmm(t,?t1,?t2,?beta?=?0,?alpha?=?10)
          #?tensor([[300,?360,?420],
          #?????????[660,?810,?960]])

          2.7 addbmm:批量矩陣相乘后相加

          不同的是addbmm是批量矩陣相乘,并且在相加的過(guò)程中也是矩陣相加,而非向量加矩陣。

          t?=?torch.arange(6).reshape(2,?3)
          t
          #?tensor([[0,?1,?2],
          #?????????[3,?4,?5]])
          ????????
          t3
          #?tensor([[[?1,??2],
          #??????????[?3,??4]],

          #?????????[[?5,??6],
          #??????????[?7,??8]],

          #?????????[[?9,?10],
          #??????????[11,?12]]])
          ?????????
          t4
          #?tensor([[[?1,??2,??3],
          #??????????[?4,??5,??6]],

          #?????????[[?7,??8,??9],
          #??????????[10,?11,?12]],

          #?????????[[13,?14,?15],
          #??????????[16,?17,?18]]])
          ?????????
          torch.bmm(t3,?t4)
          #?tensor([[[??9,??12,??15],
          #??????????[?19,??26,??33]],

          #?????????[[?95,?106,?117],
          #??????????[129,?144,?159]],

          #?????????[[277,?296,?315],
          #??????????[335,?358,?381]]])
          ?????????
          torch.addbmm(t,?t3,?t4)
          #?tensor([[381,?415,?449],
          #?????????[486,?532,?578]])

          addbmm會(huì)在原來(lái)三維張量基礎(chǔ)之上,對(duì)其內(nèi)部矩陣進(jìn)行求和,而不是矩陣和向量相加。

          《5分鐘精通PyTorch》經(jīng)過(guò)1個(gè)月的連載,已經(jīng)介紹了張量的常規(guī)操作以及運(yùn)算技巧,相信大家都有所收獲。之后的章節(jié)就進(jìn)入到深度學(xué)習(xí)部分,會(huì)以理論和代碼結(jié)合的方式為大家呈現(xiàn),幫助大家理解其中細(xì)節(jié),敬請(qǐng)期待!

          推薦閱讀

          1. 又一款超酷的可視化神器:cutecharts

          2. 機(jī)密!網(wǎng)易員工數(shù)據(jù)分析內(nèi)訓(xùn)課程,白嫖了?。砀絻r(jià)值399元資料包)

          3. 豆瓣評(píng)分 9.0,超 10 萬(wàn)開(kāi)發(fā)者的入門(mén)選擇,這本經(jīng)典好書(shū)終于升級(jí)啦!

          4. 臥槽!又來(lái)一個(gè)Python學(xué)習(xí)神器?。?!



          瀏覽 144
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  影音先锋AV成人资源网 | 日韩国产欧美成人 | 无码骚妇| 奇米成人影视 | 国产一级精品成人无码毛片 |