天天看點

PyTorch 技術總結:基本的資料計算

作者:GreatMan
PyTorch 技術總結:基本的資料計算

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

繼續閱讀