一、張量
- 張量其實就是數組,不過是在深度學習中是這樣的叫法
1.張量的創建
(1)基本創建方式
torch.tensor()
:根據指定數據創建張量
import torch
import numpy as np
"""創建張量標量"""
data = torch.tensor(10)
print(data) # 輸出結果tensor(10)"""numpy數組"""
data = np.random.randn(2, 3)
data = torch.tensor(data)
print(data) # 輸出結果tensor([[0.1345,0.1149,0.2435],# [0.8026,-0.6744,-1.0918]],dtype = torch.float64)"""列表,下面代碼使用默認元素類型"""
data = [[10.,20.,30.],[40.,50.,60.]]
data = torch.tensor(data)
print(data) # 輸出結果tensor([[10.,20.,30.],# [40.,50.,60.])
torch.Tensor()
:根據指定形狀創建張量,也可以用來創建指定數據的張量
"""創建2行3列的張量"""
data = torch.Tensor(2, 3)
"""注意:如果傳遞列表,則創建包含指定元素的張量"""
data = torch.Tensor([10])data = torch.Tensor([10, 20]) # tensor([10., 20.])
torch.IntTensor()、torch.FloatTensor()、torch.DoubleTensor()
:創建指定類型的張量
"""創建2行3列"""
torch.IntTensor(2, 3)"""列表"""
torch.IntTensor([2,3]) # 輸出 tensor([2.,3.])"""如果類型不符合,則會強制轉換"""
torch.IntTensor([2.43,3.42]) # 輸出 tensor([2.,3.])
(2)創建線性和隨機張量
torch.arange
和torch.linspace
創建線性張量
data = torch.arange(0,10,2) # 輸出結果 tensor([0,2,4,6,8])
data = torch.linspace(0,9,10)
torch.random.init_seed
和torch.random.manual_seed
隨機種子設置torch.randn
創建隨機張量
data = torch.randn(2,3) # 創建2行3列張量"""查看隨機數種子"""
print('隨機數種子':torch.random.initial_seed())"""隨機數種子設置"""
torch.random.manual_seed(100)
data = torch.randn(2,3)
print(data)
print('隨機數種子:',torch.random.initial_seed())
(3)創建0-1張量
torch.ones
和torch.ones_like
創建全1張量torch.zeros
和torch.zeros_like
創建全0張量torch.full
和torch.full_like
創建全為指定值張量
data = torch.randn(2,3)
torch.zeros(4,5) # 生成4行5列全為0的二維數組
torch.zeros_like(data) # 生成2行3列全為0的二維數組torch.ones(4,5)
torch.ones_like(data)torch.full([4,5],10) # 生成4行5列 全為10的二維數組
torch.full_like(data,20)
2.張量的類型轉換
(1)張量元素的類型轉換
data.type(torch.DoubleTensor)
:ShortTensor,IntTensor, LongTensor, FloatTensordata.double()
:short, int, long, float
data = torch.randn(4, 5)
print(data)
print(data.dtype) # torch.float32
print(data.type(torch.IntTensor).dtype) # torch.int32
print(data.int().dtype) # torch.int32
(2)張量轉換成Numpy數組
- 使用Tensor.numpy函數可以將張量轉換為ndarray數組,但是共享內存,可是使用copy函數避免共享
# 共享空間
import torch
import numpy as nptorch.random.manual_seed(2)
data_tensor = torch.randint(0, 10, [2, 3])
print(type(data_tensor))data_numpy = data_tensor.numpy()
print(type(data_numpy))data_numpy[0][0] = 100
print(data_numpy)
print(data_tensor)# 使用copy函數避免空間共享
import torch
import numpy as nptorch.manual_seed(2)
data_tensor = torch.randint(0, 10, [2, 3])
print(type(data_tensor))data_numpy = data_tensor.numpy().copy()
print(type(data_numpy))data_numpy[0][0] = 100
print(data_tensor)
print(data_numpy)
(3)Numpy數組轉換為張量
- 使用from_numpy可以將naddray數組轉換為Tensor,默認共享內存,同樣可以使用copy函數避免內存共享
- 使用torch.tensor可以將ndarray數組轉換為Tensor,默認不共享內存
# 內存共享
import torch
import numpy as npdata_numpy = np.array([1, 2, 3])
data_tensor = torch.from_numpy(data_numpy)
data_tensor[0] = 10
print(data_numpy)
print(data_tensor)
[10 2 3]
tensor([10, 2, 3], dtype=torch.int32)
# 避免內存共享
import torch
import numpy as npdata_numpy = np.array([1, 2, 3])
data_tensor = torch.from_numpy(data_numpy.copy())
data_tensor[0] = 10
print(data_numpy)
print(data_tensor)
[1 2 3]
tensor([10, 2, 3], dtype=torch.int32)
# 避免內存共享
import torch
import numpy as npdata_numpy = np.array([1, 2, 3])
data_tensor = torch.Tensor(data_numpy)
data_tensor[0] = 10
print(data_numpy)
print(data_tensor)
[1 2 3]
tensor([10., 2., 3.])
(4)標量張量和數字轉換
- 對于只有一個元素的張量,使用item()函數將該值從張量中提取出來
- 注意:在后面的反向傳播中,必須要加上item(),否則模型會報錯
import torchdata = torch.tensor(30)
print(data) # tensor(30)
print(data.item()) # 30data1 = torch.tensor([30])
print(data1) # tensor([30])
print(data1.item()) # 30 (得到的不是[30],最終只能得到數值)
3.張量數值計算
(1)張量的基本運算
加減乘除取負號
-
add, sub, mul, div, neg
-
add_, sub_, mul_, div_, neg_(其中帶下劃線的版本會修改原數據)
import torchtorch.random.manual_seed(22)
data = torch.randint(0, 10, [2, 3])
print(data)print(data.add(10))
print(data) # 原數據并沒有發生改變
tensor([[9, 6, 6],[4, 2, 2]])
tensor([[19, 16, 16],[14, 12, 12]])
tensor([[9, 6, 6],[4, 2, 2]])
import torchtorch.random.manual_seed(22)
data = torch.randint(0, 10, [2, 3])
print(data)print(data.add_(10))
print(data) # 原數據會發生改變
tensor([[9, 6, 6],[4, 2, 2]])
tensor([[19, 16, 16],[14, 12, 12]])
tensor([[19, 16, 16],[14, 12, 12]])
(2)點乘運算
- 定義:是兩個同維矩陣對應位置的元素相乘,使用mul和運算符*實現
import torchtorch.random.manual_seed(22)
data1 = torch.randint(0, 10, [2, 3])
print(data1)torch.random.manual_seed(23)
data2 = torch.randint(0, 10, [2, 3])
print(data2)# 點乘
print(torch.mul(data1, data2))print(data1 * data2)
輸出結果:
tensor([[9, 6, 6],[4, 2, 2]])
tensor([[1, 6, 6],[7, 0, 2]])
tensor([[ 9, 36, 36],[28, 0, 4]])
tensor([[ 9, 36, 36],
(3)矩陣乘法
- 矩陣乘法運算要求第一個矩陣shape:(n, m),第二個矩陣shape:(m ,p),兩個矩陣點積運算shape為(n, p)
- 運算符@用于進行兩個矩陣的乘積運算
- torch.matmul對進行乘積運算的兩矩陣形狀沒有限定,對數輸入的shape不同的張量,對應的最后幾個維度必須符合矩陣運算規則
import torchtorch.random.manual_seed(22)
data1 = torch.randint(0, 10, [2, 4])
print(data1)torch.random.manual_seed(23)
data2 = torch.randint(0, 10, [4, 5])
print(data2)# 矩陣乘法
print(data1 @ data2)print(torch.matmul(data1, data2))
輸出結果:
tensor([[9, 6, 6, 4],[2, 2, 2, 1]])
tensor([[1, 6, 6, 7, 0],[2, 7, 1, 4, 7],[5, 6, 3, 7, 8],[7, 5, 2, 9, 8]])
tensor([[ 79, 152, 86, 165, 122],[ 23, 43, 22, 45, 38]])
tensor([[ 79, 152, 86, 165, 122],[ 23, 43, 22, 45, 38]])
4.常見運算函數
- 均值
- 平方根
- 指數計算
- 對數計算
import torchdata = torch.randint(0, 10, [2, 3],dtype = torch.float64)
print(data)"""計算均值(注意:tensor必須為Float或者Double類型)"""
print(data.mean())
print(data.mean(dim = 0)) # 按列計算均值
print(data.mean(dim = 1)) # 按行進行計算"""計算總和"""
print(data.sum())
print(data.sum(dim = 0))
print(data.sum(dim = 1))"""計算平方"""
print(torch.pow(data, 2))"""計算平方根"""
print(data.sqrt())"""指數計算"""
print(data.exp())"""對數計算"""
print(data.log())
print(data.log2())
print(data.log10())