【小白學(xué)PyTorch】10.pytorch常見運(yùn)算詳解
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
參考目錄:
1 矩陣與標(biāo)量
2 哈達(dá)瑪積
3 矩陣乘法
4 冪與開方
5 對(duì)數(shù)運(yùn)算
6 近似值運(yùn)算
7 剪裁運(yùn)算
這一課主要是講解PyTorch中的一些運(yùn)算,加減乘除這些,當(dāng)然還有矩陣的乘法這些。這一課內(nèi)容不多,作為一個(gè)知識(shí)儲(chǔ)備。在后續(xù)的內(nèi)容中,有用PyTorch來獲取EfficientNet預(yù)訓(xùn)練模型以及一個(gè)貓狗分類的實(shí)戰(zhàn)任務(wù)教學(xué),EfficientNet是13課,貓狗分類是14課,11課是MobileNet詳解和PyTorch代碼解析,12課是SENet詳解和PyTorch代碼解析(因?yàn)镋fficientNet是基于這兩個(gè)網(wǎng)絡(luò)構(gòu)成的)。再往后我計(jì)劃整理一些這兩年比較優(yōu)秀的論文和代碼,一些提升準(zhǔn)確率的有效的技巧等,當(dāng)然PyTorch的各種優(yōu)化器我還沒有細(xì)講(不過一般都是SGDM了)。
希望大家喜歡這個(gè)系列~也真心希望大家可以幫忙宣傳擴(kuò)散給想學(xué)習(xí)PyTorch的朋友,小編在這里感謝各位了。
加減乘除就不多說了,+-*/
這個(gè)是矩陣(張量)每一個(gè)元素與標(biāo)量進(jìn)行操作。
import torch
a = torch.tensor([1,2])
print(a+1)
>>> tensor([2, 3])
這個(gè)就是兩個(gè)相同尺寸的張量相乘,然后對(duì)應(yīng)元素的相乘就是這個(gè)哈達(dá)瑪積,也成為element wise。
a = torch.tensor([1,2])
b = torch.tensor([2,3])
print(a*b)
print(torch.mul(a,b))
>>> tensor([2, 6])
>>> tensor([2, 6])
這個(gè)torch.mul()和*是等價(jià)的。
當(dāng)然,除法也是類似的:
a = torch.tensor([1.,2.])
b = torch.tensor([2.,3.])
print(a/b)
print(torch.div(a/b))
>>> tensor([0.5000, 0.6667])
>>> tensor([0.5000, 0.6667])
我們可以發(fā)現(xiàn)的torch.div()其實(shí)就是/, 類似的:torch.add就是+,torch.sub()就是-,不過符號(hào)的運(yùn)算更簡單常用。
如果我們想實(shí)現(xiàn)線性代數(shù)中的矩陣相乘怎么辦呢?
這樣的操作有三個(gè)寫法:
torch.mm()torch.matmul()@,這個(gè)需要記憶,不然遇到這個(gè)可能會(huì)挺蒙蔽的
a = torch.tensor([1.,2.])
b = torch.tensor([2.,3.]).view(1,2)
print(torch.mm(a, b))
print(torch.matmul(a, b))
print(a @ b)
輸出結(jié)果:
tensor([[2., 3.],
[4., 6.]])
tensor([[2., 3.],
[4., 6.]])
tensor([[2., 3.],
[4., 6.]])
這是對(duì)二維矩陣而言的,假如參與運(yùn)算的是一個(gè)多維張量,那么只有torch.matmul()可以使用。等等,多維張量怎么進(jìn)行矩陣的懲罰?在多維張量中,參與矩陣運(yùn)算的其實(shí)只有后兩個(gè)維度,前面的維度其實(shí)就像是索引一樣,舉個(gè)例子:
a = torch.rand((1,2,64,32))
b = torch.rand((1,2,32,64))
print(torch.matmul(a, b).shape)
>>> torch.Size([1, 2, 64, 64])
可以看到,其實(shí)矩陣乘法的時(shí)候,看后兩個(gè)維度: 乘上 ,得到一個(gè)的矩陣。前面的維度要求相同,像是索引一樣,決定哪兩個(gè) 和 相乘。
小提示:
a = torch.rand((3,2,64,32))
b = torch.rand((1,2,32,64))
print(torch.matmul(a, b).shape)
>>> torch.Size([3, 2, 64, 64])
這樣也是可以相乘的,因?yàn)檫@里涉及一個(gè)自動(dòng)傳播Broadcasting機(jī)制,這個(gè)在后面會(huì)講,這里就知道,如果這種情況下,會(huì)把b的第一維度復(fù)制3次 ,然后變成和a一樣的尺寸,進(jìn)行矩陣相乘。
print('冪運(yùn)算')
a = torch.tensor([1.,2.])
b = torch.tensor([2.,3.])
c1 = a ** b
c2 = torch.pow(a, b)
print(c1,c2)
>>> tensor([1., 8.]) tensor([1., 8.])
和上面一樣,不多說了。開方運(yùn)算可以用torch.sqrt(),當(dāng)然也可以用a**(0.5)。
在上學(xué)的時(shí)候,我們知道ln是以e為底的,但是在pytorch中,并不是這樣。
pytorch中l(wèi)og是以e自然數(shù)為底數(shù)的,然后log2和log10才是以2和10為底數(shù)的運(yùn)算。
import numpy as np
print('對(duì)數(shù)運(yùn)算')
a = torch.tensor([2,10,np.e])
print(torch.log(a))
print(torch.log2(a))
print(torch.log10(a))
>>> tensor([0.6931, 2.3026, 1.0000])
>>> tensor([1.0000, 3.3219, 1.4427])
>>> tensor([0.3010, 1.0000, 0.4343]) .ceil()向上取整.floor()向下取整.trunc()取整數(shù).frac()取小數(shù).round()四舍五入
a = torch.tensor(1.2345)
print(a.ceil())
>>>tensor(2.)
print(a.floor())
>>> tensor(1.)
print(a.trunc())
>>> tensor(1.)
print(a.frac())
>>> tensor(0.2345)
print(a.round())
>>> tensor(1.)
這個(gè)是讓一個(gè)數(shù),限制在你自己設(shè)置的一個(gè)范圍內(nèi)[min,max],小于min的話就被設(shè)置為min,大于max的話就被設(shè)置為max。這個(gè)操作在一些對(duì)抗生成網(wǎng)絡(luò)中,好像是WGAN-GP,通過強(qiáng)行限制模型的參數(shù)的值。
a = torch.rand(5)
print(a)
print(a.clamp(0.3,0.7))
輸出為:
tensor([0.5271, 0.6924, 0.9919, 0.0095, 0.0340])
tensor([0.5271, 0.6924, 0.7000, 0.3000, 0.3000])
好消息,小白學(xué)視覺團(tuán)隊(duì)的知識(shí)星球開通啦,為了感謝大家的支持與厚愛,團(tuán)隊(duì)決定將價(jià)值149元的知識(shí)星球現(xiàn)時(shí)免費(fèi)加入。各位小伙伴們要抓住機(jī)會(huì)哦!

交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~

