天天看點

[PyTroch系列-12]:PyTorch基礎 - 張量Tensor線性運算(點乘、叉乘)

 第1章 Tensor運算概述

1.1 概述

PyTorch提供了大量的張量運算,基本上可以對标Numpy多元數組的運算,以支援對張量的各種複雜的運算。

這些操作運算中大多是對數組中每個元素執行相同的函數運算,并獲得每個元素函數運算的結果序列,這些序列生成一個新的同次元的數組。

https://www.runoob.com/numpy/numpy-linear-algebra.html

[PyTroch系列-12]:PyTorch基礎 - 張量Tensor線性運算(點乘、叉乘)

1.2 運算分類

(1)算術運算:加、減、系數乘、系數除

(2)函數運算:sin,cos

(3)取整運算:上取整、下取整

(4)統計運算:最大值、最小值、均值

(5)比較運算:大于,等于,小于、排序

(6)線性代數運算:矩陣、點乘、叉乘

1.3  “in place“運算 

“in place“運算不是某個特定的函數運算,而是每個函數都有自己的“in place“運算的版本。

xxx_():執行完該操作,直接修改tensor自身的值。

基本上,每個函數都有自己的in place版本。

torch.cos() =》torch.cos_()

torch.floor() =》torch.floor_()

1.4 Tensor的廣播機制: 不同次元的張量運算

1.5 環境準備

import numpy as np
import torch
 
print("Hello World")
print(torch.__version__)
print(torch.cuda.is_available())      

1.6 張量的線性代數運算

(1)點乘:dot(a,b)

(2)内積: inner(a,b)

(3)叉乘:matmul(a,b)

備注:

點乘與内積的異同:

  • 相同點:點乘與内積的基本操作相同:每個元素相乘後再相加。
  • 不同點:點乘隻支援兩個一維張量點乘,而内積支援多元張量的内積

點乘與叉乘:

  • 相同點:點乘是基礎,即對應元素相乘後相加。
  • 不同點:點乘隻支援兩個一維張量點乘,而叉乘支援多元張量,每一個次元上的資料都是一次點乘。

第2章 向量的點乘(是基礎):dot()

2.1 定義

概括地說,向量的内積(點乘/數量積)。

對兩個向量執行點乘運算,就是對這兩個向量對應位一一相乘之後求和的操作,如下所示,對于向量a和向量b:

[PyTroch系列-12]:PyTorch基礎 - 張量Tensor線性運算(點乘、叉乘)

注意:

  •  這裡要求一維向量a和向量b的行列數相同。
  • 點乘的結果是一個标量(數量而不是向量)

2.2 向量内積的幾何意義

[PyTroch系列-12]:PyTorch基礎 - 張量Tensor線性運算(點乘、叉乘)

(1)可用于計算計算兩個向量之間的夾角.

[PyTroch系列-12]:PyTorch基礎 - 張量Tensor線性運算(點乘、叉乘)

   θ=arccos⁡(a∙b/|a||b|)

(2)b向量在a向量方向上的投影與a相乘

[PyTroch系列-12]:PyTorch基礎 - 張量Tensor線性運算(點乘、叉乘)

 |a| = 所有元素的平方和開根号,實際上就是向量a的長度。

 |b| = 所有元素的平方和開根号,實際上就是向量b的長度。

a.b = a1*b1 + a2*b2 ..... an*bn

(3)是否正交訓示:

如果點乘的結果為0,則表示a在b上的投影為0,表示a和b是正交的。

如果正交,表示這兩個向量不相幹。

2.3 代碼示例

#向量的點乘(點積)運算
a = torch.Tensor([1,2,3])
b = torch.Tensor([1,1,1])
print(a)
print(b)

print(torch.dot(a,b)) # 等價于 1*0+2*1+3*0      
輸出:

tensor([1., 2., 3.])
tensor([1., 1., 1.])
tensor(6.)      
#向量的點乘(點積)運算
a = torch.Tensor([1,2,3])
b = torch.Tensor([1,1,1])
print(a)
print(b)

print(torch.vdot(a,b)) # 等價于 1*0+2*1+3*0      
輸出:

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

第3章 向量的叉乘

3.1 定義

兩個向量的外積,又叫叉乘、叉積向量積,其運算結果是一個向量而不是一個标量。

并且兩個向量的外積與這兩個向量組成的坐标平面垂直。

定義:向量a與b的外積a×b是一個向量,其長度等于|a×b| = |a||b|sin∠(a,b),其方向正交于a與b。并且,(a,b,a×b)構成右手系。 

特别地,0×a = a×0 = 0.此外,對任意向量a,自身相乘a×a=0。

對于向量a和向量b:

[PyTroch系列-12]:PyTorch基礎 - 張量Tensor線性運算(點乘、叉乘)

a和b的外積公式為(得到的是原先次元的向量):

[PyTroch系列-12]:PyTorch基礎 - 張量Tensor線性運算(點乘、叉乘)

3.2 幾何意義

在三維幾何中,向量a和向量b的外積結果是一個向量,有個更通俗易懂的叫法是法向量,該向量垂直于a和b向量構成的平面。

在3D圖像學中,外積的概念非常有用,可以通過兩個向量的外積,生成第三個垂直于a,b的法向量,進而建構X、Y、Z坐标系。如下圖所示:

[PyTroch系列-12]:PyTorch基礎 - 張量Tensor線性運算(點乘、叉乘)

3.3 代碼示例

# 向量的叉乘(乘積)運算
a = torch.Tensor([1,2,3])
b = torch.Tensor([1,1,1])
print(a)
print(b)

print(torch.multiply(a,b))      
輸出:

tensor([1., 2., 3.])
tensor([1., 1., 1.])
tensor([1., 2., 3.])      

第4章  矩陣的内積運算(對應):inner()

4.1 矩陣内積的定義

兩個相同次元的矩陣a和b,a和b矩陣的内積時相同位置的向量的内積。

(1)向量向量内積

[PyTroch系列-12]:PyTorch基礎 - 張量Tensor線性運算(點乘、叉乘)

 (2)向量矩陣的内積:

[PyTroch系列-12]:PyTorch基礎 - 張量Tensor線性運算(點乘、叉乘)

4.2 代碼示例

# 矩陣的内積運算
a = torch.Tensor([1,2,3])
b = torch.Tensor([0,1,0])
print(a)
print(b)

print(torch.inner(a,b)) # 等價于 1*0+2*1+3*0
print("")

a = torch.Tensor([[0,1,0], [0,2,0]])
b = torch.Tensor([[0,3,0], [0,4,0]])
print(a)
print(b)
print(torch.inner(a,b)) # 等效于每個向量兩兩内積      
輸出:

tensor([1., 2., 3.])
tensor([0., 1., 0.])
tensor(2.)

tensor([[0., 1., 0.],
        [0., 2., 0.]])
tensor([[0., 3., 0.],
        [0., 4., 0.]])
tensor([[3., 4.],
        [6., 8.]])      

第5章 矩陣的外積運算: matmul()

5.1 矩陣外積(矩陣乘積)的定義 (矩陣相乘)

矩陣相乘最重要的方法是一般矩陣乘積。它隻有在第一個矩陣的列數(column)和第二個矩陣的行數(row)相同時才有意義。

(1)向量的乘積

[PyTroch系列-12]:PyTorch基礎 - 張量Tensor線性運算(點乘、叉乘)

(2)矩陣的乘積

5.2代碼示例

# 外積
a = torch.Tensor([1,2,3])  # 相當于1* N
b = torch.Tensor([0,1,0]) # 相當于N * 1
print(a)
print(b)
print(torch.matmul(a,b)) # 等價于 1*0+2*1+3*0

print("")

a = torch.Tensor([[1,2,3], [4,5,6]])
b = torch.Tensor([[0,1], [1,1], [1,1]])

print(a)
print(b)
print(torch.matmul(a,b)) # X * N VS N * Y => X * Y
      
輸出:

tensor([1., 2., 3.])
tensor([0., 1., 0.])
tensor(2.)

tensor([[1., 2., 3.],
        [4., 5., 6.]])
tensor([[0., 1.],
        [1., 1.],
        [1., 1.]])
tensor([[ 5.,  6.],
        [11., 15.]])
      

繼續閱讀