小白學PyTorch | 10 pytorch常見運算詳解

2021-03-02 機器學習煉丹術

參考目錄:

1 矩陣與標量

2 哈達瑪積

3 矩陣乘法

4 冪與開方

5 對數運算

6 近似值運算

7 剪裁運算


這一課主要是講解PyTorch中的一些運算,加減乘除這些,當然還有矩陣的乘法這些。這一課內容不多,作為一個知識儲備。在後續的內容中,有用PyTorch來獲取EfficientNet預訓練模型以及一個貓狗分類的實戰任務教學,EfficientNet是13課,貓狗分類是14課,11課是MobileNet詳解和PyTorch代碼解析,12課是SENet詳解和PyTorch代碼解析(因為EfficientNet是基於這兩個網絡構成的)。再往後我計劃整理一些這兩年比較優秀的論文和代碼,一些提升準確率的有效的技巧等,當然PyTorch的各種優化器我還沒有細講(不過一般都是SGDM了)。

希望大家喜歡這個系列~也真心希望大家可以幫忙宣傳擴散給想學習PyTorch的朋友,小編在這裡感謝各位了。

加減乘除就不多說了,+-*/

1 矩陣與標量

這個是矩陣(張量)每一個元素與標量進行操作。

import torch
a = torch.tensor([1,2])
print(a+1)
>>> tensor([2, 3])

2 哈達瑪積

這個就是兩個相同尺寸的張量相乘,然後對應元素的相乘就是這個哈達瑪積,也成為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])

這個torch.mul()和*是等價的。

當然,除法也是類似的:

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])

我們可以發現的torch.div()其實就是/, 類似的:torch.add就是+,torch.sub()就是-,不過符號的運算更簡單常用。

3 矩陣乘法

如果我們想實現線性代數中的矩陣相乘怎麼辦呢?

這樣的操作有三個寫法:

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)

輸出結果:

tensor([[2., 3.],
        [4., 6.]])
tensor([[2., 3.],
        [4., 6.]])
tensor([[2., 3.],
        [4., 6.]])

這是對二維矩陣而言的,假如參與運算的是一個多維張量,那麼只有torch.matmul()可以使用。等等,多維張量怎麼進行矩陣的懲罰?在多維張量中,參與矩陣運算的其實只有後兩個維度,前面的維度其實就像是索引一樣,舉個例子:

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])

可以看到,其實矩陣乘法的時候,看後兩個維度:

小提示:

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])

這樣也是可以相乘的,因為這裡涉及一個自動傳播Broadcasting機制,這個在後面會講,這裡就知道,如果這種情況下,會把b的第一維度複製3次 ,然後變成和a一樣的尺寸,進行矩陣相乘。

4 冪與開方
print('冪運算')
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.])

和上面一樣,不多說了。開方運算可以用torch.sqrt(),當然也可以用a**(0.5)。

5 對數運算

在上學的時候,我們知道ln是以e為底的,但是在pytorch中,並不是這樣

pytorch中log是以e自然數為底數的,然後log2和log10才是以2和10為底數的運算。

import numpy as np
print('對數運算')
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]) 

6 近似值運算
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.)

7 剪裁運算

這個是讓一個數,限制在你自己設置的一個範圍內[min,max],小於min的話就被設置為min,大於max的話就被設置為max。這個操作在一些對抗生成網絡中,好像是WGAN-GP,通過強行限制模型的參數的值。

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])

- END -

相關焦點

  • 小白學PyTorch | 12 SENet詳解及PyTorch實現
    > 小白學PyTorch | 11 MobileNet詳解及
  • 【小白學PyTorch】18.TF2構建自定義模型
    >小白學PyTorch | 10 pytorch常見運算詳解小白學PyTorch | 9 tensor數據結構與存儲結構小白學PyTorch | 8 實戰之MNIST小試牛刀小白學PyTorch | 7 最新版本
  • 小白學PyTorch | 15 TF2實現一個簡單的服裝分類任務
    PyTorch實現小白學PyTorch | 12 SENet詳解及PyTorch實現小白學PyTorch | 11 MobileNet詳解及PyTorch實現>小白學PyTorch | 10 pytorch常見運算詳解小白學PyTorch | 9 tensor數據結構與存儲結構小白學PyTorch | 8 實戰之MNIST小試牛刀小白學PyTorch | 7 最新版本torchvision.transforms
  • 小白學PyTorch | 17 TFrec文件的創建與讀取
    PyTorch實現小白學PyTorch | 12 SENet詳解及PyTorch實現小白學PyTorch | 11 MobileNet詳解及PyTorch實現>小白學PyTorch | 10 pytorch常見運算詳解小白學PyTorch | 9 tensor數據結構與存儲結構小白學PyTorch | 8 實戰之MNIST小試牛刀小白學PyTorch | 7 最新版本torchvision.transforms
  • 【Pytorch】PyTorch的4分鐘教程,手把手教你完成線性回歸
    下文出現的所有功能函數,均可以在中文文檔中查看具體參數和實現細節,先附上pytorch中文文檔連結:https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch/
  • Pytorch autograd,backward詳解
    *圖片出處:👉PyTorch Autogradhttps://towardsdatascience.com/pytorch-autograd-understanding-the-heart-of-pytorchs-magic-2686cd94ec95
  • pytorch常見的坑匯總
    首先作為tensorflow的骨灰級玩家+輕微強迫症患者,一路打怪升級,從0.6版本用到1.2,再用到1.10,經歷了tensorfow數個版本更迭,這裡不得不說一下tf.data.dataset+tfrecord使用起來效率遠比dataloader高的多。
  • PyTorch常見的12坑
    6. pytorch中loss函數的參數設置以CrossEntropyLoss為例:7. pytorch的可重複性問題參考這篇博文:https://blog.csdn.net/hyk_1996/article/details/84307108 8. 多GPU的處理機制使用多GPU時,應該記住pytorch的處理邏輯是:1.在各個GPU上初始化模型。2.前向傳播時,把batch分配到各個GPU上進行計算。
  • 深度學習框架搭建之PyTorch
    PyTorch 與 NumPy 非常相似,可以說是它的替代者,支持 GPU 加速運算,用來搭建和訓練深度神經網絡。如果學習過 NumPy 以及常見的深度學習概念(如卷積層,循環層等),非常容易上手PyTorch。目前主流的深度學習框架主要有 TensorFlow,PyTorch,mxnet,caffe和Keras 等。
  • NLP-入門實體命名識別(NER)+Bilstm-CRF模型原理Pytorch代碼詳解——最全攻略
    希望能夠以這篇文章為載體,幫助其他跟我一樣的學習者梳理、串起NER的各個小知識點,最後上手NER的主流模型(Bilstm+CRF)(文中講的是pytorch,但是懂了pytorch去看keras十分容易相信我哈)二、主流模型Bilstm-CRF實現詳解(Pytorch篇)一、NER資料參考:NLP之CRF應用篇(序列標註任務)(CRF++的詳細解析、Bi-LSTM+CRF
  • pytorch專題前言 | 為什麼要學習pytorch?
    2.為什麼要學習pytorch呢?3.學習了pytorch我怎麼應用呢?4.按照什麼順序去學習pytorch呢?5.網上那麼多資料如何選擇呢?現在開始逐一的對以上問題提出自己的看法,可能想的不夠周全,歡迎討論區一起探討!1.生物學科的朋友需要學編程麼?需要!
  • 【NER】NLP-入門實體命名識別(NER)+Bilstm-CRF模型原理Pytorch代碼詳解——最全攻略
    希望能夠以這篇文章為載體,幫助其他跟我一樣的學習者梳理、串起NER的各個小知識點,最後上手NER的主流模型(Bilstm+CRF)(文中講的是pytorch,但是懂了pytorch去看keras十分容易相信我哈)全文結構:一、NER資料(主要介紹NER)二、主流模型Bilstm-CRF實現詳解(Pytorch篇)三、實現代碼的拓展(在第二點的基礎上進行拓展
  • PyTorch 0.2發布:更多NumPy特性,高階梯度、分布式訓練等
    PyTorch的GitHub新版發布說明中介紹了0.2版的以下新特性:NumPy風格的Tensor BroadcastingBroadcasting是NumPy在算數運算中處理不同形狀數組的一種方式,在特定條件下,比較小的數組會通過比較大的數組進行「廣播」,來獲得相應的形狀。
  • MySQL基礎,常用運算符詳解
    MySQL常見的運算符主要分為以下幾大類:算術運算符比較運算符邏輯運算符位操作運算符算術運算符示例圖解# 其他常見的比較運算符>,>=,<,<=,!示例圖解位運算符詳解1010(10的二進位),1111(15的二進位)位或運算 1111位與運算是 1010位異或運算是0101二進位0001
  • pytorch入門教程
    1.數據表示及運算1.0 Numpy與pytorch比較NumpyPytorch導入模塊import numpy as npimport torch
  • PyTorch中的contiguous
    轉載自知乎專欄:航行日誌https://zhuanlan.zhihu.com/p/64551412已獲作者授權,請勿二次轉載本文講解了pytorch中contiguous的含義、定義、實現,以及contiguous存在的原因,非contiguous時的解決辦法。並對比了numpy中的contiguous。
  • 深度學習大講堂之pytorch入門
    今天小天就帶大家從數據操作、自動求梯度和神經網絡設計的pytorch版本三個方面來入門pytorch。>1.3 廣播機制前⾯我們看到如何對兩個形狀相同的 Tensor 做按元素運算。當對兩個形狀不同的 Tensor 按元素運算時,可能會觸發廣播(broadcasting)機制:先適當複製元素使這兩個 Tensor 形狀相同後再按元素運算。
  • PyTorch進階之路(一):張量與梯度
    $ ls 01-pytorch-basics01-pytorch-basics.ipynb  environment.yml4.通過運行以下命令,激活虛擬環境:$ conda activate 01-pytorch-basics對於舊版 conda 的安裝,你可能需要運行命令:source activate 01-pytorch-basics。6.
  • PyTorch 的 Autograd詳解
    這裡 Function 指的是在計算圖中某個節點(node)所進行的運算,比如加減乘除卷積等等之類的,Function 內部有 forward() 和 backward() 兩個方法,分別應用於正向、反向傳播。
  • pytorch+Unet圖像分割:將圖片中的鹽體找出來
    本文將先簡單介紹Unet的理論基礎,然後使用pytorch一步一步地實現Unet圖像分割。因為主要目的是提供一個baseline模型給大家,所以代碼主要關注在如何構造Unet的網絡結構。Unet關於upconvolution,這裡不做詳細介紹,簡單來說就是convolution的反向運算。Decoder的每一層都通過upconvolution(圖中綠色箭頭),並且和Encoder相對應的初級特徵結合(圖中的灰色箭頭),逐漸恢復圖像的位置信息。在Decoder中,隨著卷積層的加深,特徵圖的長寬增大,通道減少。Unet——輸入輸出