導入 PyTorch 包
import torch
下面開始進行基本的資料計算與操作。
因為在PyTorch中對資料進行操作或計算時,都要求資料的類型是 Tensor 類型的,是以這裡會介紹幾個基礎的方法,用來生成或者計算 Tensor 類型的資料。
情況 1:
利用torch 直接生成形狀為 2x3 的,類型為 Tensor 的資料
a = torch.FloatTensor(2, 3)
直接将pytorch數組轉換為 tensor 的數組,注意生成的資料會将整數轉換為小數
b = torch.FloatTensor([2, 3, 4, 5])
Out:
tensor([[1.0802e-05, 2.6824e+23, 1.0325e-08],
[1.0663e-08, 8.5825e-07, 6.7061e+22]])
tensor([2., 3., 4., 5.])
情況 2:
生成資料為整數的tensor類型的,形狀為 2x3 的資料
a = torch.IntTensor(2, 3)
将pytorch的整數數組轉換為tensor類型的整數數組
b = torch.IntTensor([2, 3, 4, 5])
Out:
tensor([[50, 52, 84],
[48, 54, 58]], dtype=torch.int32)
tensor([2, 3, 4, 5], dtype=torch.int32)
情況 3:
生成形狀為 2x3,資料滿足均值為 0,标準差為 1,滿足正态分布的随機數組成的數組
a = torch.randn(2, 3)
print(a)
Out:
tensor([[-0.0308, 2.0391, 1.4417],
[-0.3386, -1.3921, -1.8082]])
情況 4:
生成從 1 開始,到 20 結束,資料之間的差距為 1 的數組,類型為 tensor
a = torch.range(1, 20, 1)
a
Out
tensor([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14., 15., 16., 17., 18., 19., 20.])
情況 5:
生成形狀為 2x3 的,全部資料都為 0 的tensor類型的資料
a = torch.zeros(2, 3)
a
Out
tensor([[0., 0., 0.],
[0., 0., 0.]])
情況 6:torch.abs()
求得tensor對象中每個元素的絕對值
a = torch.randn(2, 3)
print(a)
b = torch.abs(a)
print(b)
torch 的 abs 函數可以求得每個元素的絕對值。
Out
tensor([[-0.6038, -1.0905, 1.0314],
[ 0.1767, 0.1908, -0.7766]])
tensor([[0.6038, 1.0905, 1.0314],
[0.1767, 0.1908, 0.7766]])
情況 7:torch.add()
兩個形狀相同的 tensor 對應元素相加
a = torch.randn(2, 3)
print(a)
b = torch.randn(2, 3)
print(b)
# tensor 資料的相加
c = torch.add(a, b)
print(c)
# ----------------------------------------------
d = torch.randn(2, 3)
print(d)
# 為tensor 對象 d 中的每一個資料都加上 10
e = torch.add(d, 10)
print(e)
Out
tensor([[ 0.7141, -0.2872, -1.9718],
[-0.3137, 0.3511, 1.2788]])
tensor([[-2.2506, -0.5574, 0.2071],
[ 0.6107, -0.1757, 1.9230]])
tensor([[-1.5364, -0.8447, -1.7647],
[ 0.2969, 0.1754, 3.2018]])
tensor([[-0.9365, 0.5243, -0.9959],
[-0.7122, -1.3309, -0.6524]])
tensor([[ 9.0635, 10.5243, 9.0041],
[ 9.2878, 8.6691, 9.3476]])
情況 8:torch.clamp()
有時在進行模型訓練時,資料在傳入模型之前可能不太滿足要求,資料的取值範圍有些混亂,需要将資料的值進行一些調整。
a = torch.randn(2, 3)
print(a)
b = torch.clamp(a, -0.1, 0.1)
print(b)
函數 clamp 對 tensor 對象 a 裡的每一個資料進行處理。
- 如果這個資料小于 -0.1,則被修改為 -0.1;
- 如果這個資料在 -0.1 到 0.1 之間,則不做改動;
- 如果這個資料大于 0.1,則被修改為 0.1
Out
tensor([[ 0.4739, 0.1815, 1.1098],
[ 0.1936, -0.5545, -1.2362]])
tensor([[ 0.1000, 0.1000, 0.1000],
[ 0.1000, -0.1000, -0.1000]])
情況 9:torch.div()
torch.div() 兩個tensor相除
a = torch.randn(2, 3)
print(a)
b = torch.randn(2, 3)
print(b)
# a 中的每個資料除以 b 中對應的資料。最終得到的值會組成一個新的 tensor 資料,形狀與 a 和 b 相同。
c = torch.div(a, b)
print(c)
Out
tensor([[ 0.4680, -1.3055, 0.3307],
[ 0.8774, 0.5196, -0.1738]])
tensor([[-1.4679, 1.5512, 1.4118],
[ 0.6055, -2.0679, -1.4169]])
tensor([[-0.3188, -0.8416, 0.2342],
[ 1.4491, -0.2513, 0.1227]])
d = torch.randn(2, 3)
print(d)
# tensor 資料 d 中的每一個元素除以 10,得到新的 tensor 資料 e
e = torch.div(d, 10)
print(e)
Out
tensor([[ 1.5497, 1.0991, -1.7721],
[ 0.0774, 0.9674, 1.9654]])
tensor([[ 0.1550, 0.1099, -0.1772],
[ 0.0077, 0.0967, 0.1965]])
情況 10:torch.mul()
兩個形狀相同的 tensor,對應位置上的資料相乘,得到的結果的形狀也是相同的。
a = torch.randn(2, 3)
print(a)
b = torch.randn(2, 3)
print(b)
# a 和 b 中對應位置的元素想成,得到的結果的形狀與 a 或 b 相同
c = torch.mul(a, b)
print(c)
Out
tensor([[-0.2800, -1.2217, -0.5830],
[-0.5399, -0.4731, -1.5231]])
tensor([[ 0.5611, -2.0204, 1.7279],
[-0.4681, -0.5614, 0.5960]])
tensor([[-0.1571, 2.4684, -1.0073],
[ 0.2527, 0.2656, -0.9077]])
d = torch.randn(2, 3)
print(d)
# d 中的每一個元素除以 10,得到新的結果 e
e = torch.mul(d, 10)
print(e)
Out
tensor([[-1.3093, -0.2281, -0.5711],
[-0.7724, 1.2756, 0.1337]])
tensor([[-13.0926, -2.2809, -5.7112],
[ -7.7240, 12.7558, 1.3374]])
情況 11:torch.pow()
為 tensor 上每一個元素資料進行乘方運算
a = torch.randn(2, 3)
print(a)
# tensor 資料 a 裡的每一個元素都進行平方計算,得到結果 b,b的形狀與 a 相同
b = torch.pow(a, 2)
print(b)
Out
tensor([[-1.2164, 1.7688, -0.5575],
[ 0.4526, -0.6289, 0.0545]])
tensor([[1.4796e+00, 3.1287e+00, 3.1076e-01],
[2.0485e-01, 3.9549e-01, 2.9702e-03]])
情況 12:torch.mm()
兩個 tensor 的矩陣乘法
a = torch.randn(2, 3)
print(a)
b = torch.randn(3, 2)
print(b)
矩陣乘法:matrix multiple, 第一個tensor 是 2x3 形狀的,第二個 tensor 是 3x2 形狀的,通過矩陣相乘後,得到的結果的形狀是 2x2 的。
例如:a 的第一行的所有資料乘以 b 的第一列的對應的所有資料,相加後成為最後結果的第一行第一列的值,以此類推。
c = torch.mm(a, b)
print(c)
Out
tensor([[-0.8027, 2.2463, 0.6852],
[-1.5996, 1.9530, -2.8208]])
tensor([[-0.5764, 0.7365],
[-0.5506, -0.6967],
[-0.1764, 0.0131]])
tensor([[-0.8951, -2.1472],
[ 0.3441, -2.5757]])
情況 13:torch.mv()
矩陣與向量相乘。矩陣一般是二維或二維以上的,向量一般是一維的,要處理這樣的情形,就可以采用函數 mv 來完成次元不同的資料的計算。
a = torch.randn(2, 3)
print(a)
b = torch.randn(3)
print(b)
c = torch.mv(a, b)
print(c)
a 是矩陣,b 是向量,遇到這種情況就可以采用 mv 這個方法,用于處理矩陣與向量相乘的情景。最後得到的結果的形狀為 [2,] 的一維的tensor對象
Out
tensor([[-0.1294, 0.7586, -0.3315],
[-1.5170, -0.7117, -0.9626]])
tensor([-1.4257, -2.0987, -1.1804])
tensor([-1.0163, 4.7926])