第1章 Tensor運算概述
1.1 概述
PyTorch提供了大量的張量運算,基本上可以對标Numpy多元數組的運算,以支援對張量的各種複雜的運算。
這些操作運算中大多是對數組中每個元素執行相同的函數運算,并獲得每個元素函數運算的結果序列,這些序列生成一個新的同次元的數組。
https://www.runoob.com/numpy/numpy-linear-algebra.html
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:
注意:
- 這裡要求一維向量a和向量b的行列數相同。
- 點乘的結果是一個标量(數量而不是向量)
2.2 向量内積的幾何意義
(1)可用于計算計算兩個向量之間的夾角.
θ=arccos(a∙b/|a||b|)
(2)b向量在a向量方向上的投影與a相乘
|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:
a和b的外積公式為(得到的是原先次元的向量):
3.2 幾何意義
在三維幾何中,向量a和向量b的外積結果是一個向量,有個更通俗易懂的叫法是法向量,該向量垂直于a和b向量構成的平面。
在3D圖像學中,外積的概念非常有用,可以通過兩個向量的外積,生成第三個垂直于a,b的法向量,進而建構X、Y、Z坐标系。如下圖所示:
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)向量向量内積
(2)向量矩陣的内積:
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)向量的乘積
(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.]])