PyTorch 笔记(02)— 常用创建 Tensor 方法(torch.Tensor、ones、zeros、eye、arange、linspace、rand、randn、new)
1. Tensor 概念分類
PyTorch 中的張量(Tensor)類似 NumPy 中的 ndarrays,之所以稱之為 Tensor 的另一個原因是它可以運行在 GPU 中,以加速運算。
1.1 從接口的角度分類
對 Tensor 的操作可分為以下兩類:
torch.function,如torch.save等;tensor.function,如tensor.view等;
為方便使用,對 Tensor 的大部分操作同時支持這兩種接口,比如 torch.sum(a, b) 和 a.sum(b) 功能是等價的。
1.2 從存儲的角度分類
對 Tensor 的操作又可分為以下兩類:
- 不會修改自身的數據,如
a.add(b),加法結果會返回一個新的tensor; - 會修改自身的數據,如
a.add_(b),加法結果仍儲存在a中,但是a已經被修改了;
注意:函數名以 _ 結尾的都是 inplace 方式,即會修改調用者自己的數據。
2. Tensor 創建方法
PyTorch 中的 Tensor 也有自己的數據類型定義方式,常用的如下。
2.1 torch.Tensor
需要注意的是,使用 torch.Tensor(*sizes) 創建 Tensor 時,系統不會立即分配空間,只會計算當前內容空間是否夠用,使用到 Tensor 時才會分配,而其它操作都會在創建完成后立即進行空間分配。
用于創建一個 Tensor ,即可接受 list 作為參數,也可以接受指定形狀作為參數,還能傳入其它的 tensor 。
Tensor接受形狀參數,創建一個 2*3 的Tensor
In [1]: import torch as t In [2]: a = t.Tensor(2,3) In [3]: a
Out[3]:
tensor([[2.6380e+23, 1.3070e-14, 4.4721e+21],[6.8233e+22, 3.0217e+32, 4.6161e+24]])In [4]: a.type()
Out[4]: 'torch.FloatTensor'
- 將列表轉換為
Tensor
In [5]: b = t.Tensor([[1,2], [3,4]]) In [6]: b
Out[6]:
tensor([[1., 2.],[3., 4.]])In [7]: b.type()
Out[7]: 'torch.FloatTensor'
Tensor轉換為list
In [5]: b = t.Tensor([[1,2], [3,4]]) In [6]: b
Out[6]:
tensor([[1., 2.],[3., 4.]])In [7]: b.type()
Out[7]: 'torch.FloatTensor'In [8]: b.tolist()
Out[8]: [[1.0, 2.0], [3.0, 4.0]]In [9]: type(b.tolist())
Out[9]: list
- 創建一個元素為 2 和 3 的
Tensor
In [10]: c = t.Tensor((2,3)) In [11]: c
Out[11]: tensor([2., 3.])In [12]: c.type()
Out[12]: 'torch.FloatTensor'
2.2 torch.ones
用于生成數據類型為浮點型且維度指定的 Tensor,不過這個浮點型的 Tensor中的元素值全部為 1,dtype 參數可以指定其數據類型。
In [1]: import torch as t In [2]: t.ones(2,3)
Out[2]:
tensor([[1., 1., 1.],[1., 1., 1.]])In [3]: t.ones(2,3, dtype=t.int)
Out[3]:
tensor([[1, 1, 1],[1, 1, 1]], dtype=torch.int32)In [4]:
2.3 torch.zeros
用于生成數據類型為浮點型且維度指定的 Tensor,不過這個浮點型的 Tensor中的元素值全部為 0,dtype 參數可以指定其數據類型。
import torcha = torch.zeros(2, 3, dtype=torch.int8)
print a
輸出結果:
tensor([[0, 0, 0],[0, 0, 0]], dtype=torch.int8)
2.4 torch.eye
用于生成數據類型為浮點型且維度指定的 Tensor,不過這個浮點型的 Tensor中對角線元素均為 1 ,dtype 參數可以指定其數據類型。
In [5]: t.eye(3,3)
Out[5]:
tensor([[1., 0., 0.],[0., 1., 0.],[0., 0., 1.]])In [6]:
2.5 torch.arange
用于生成數據類型為浮點型且自定義起始范圍和結束范圍的 Tensor,所以傳遞給 torch.linspace 的參數有三個,分別是范圍的起始值、范圍的結束值和步長,其中,步長用于指定從起始值到結束值的每步的數據間隔。
import torcha = torch.arange(1, 10, 2)
輸出結果:
tensor([1, 3, 5, 7, 9])
2.6 torch.linspace
用于生成數據類型為長整型且自定義起始范圍和結束范圍的 Tensor,所以傳遞給 torch.arange 的參數有三個,分別是范圍的起始值、范圍的結束值和均勻分成的份數,其中,份數用于將起始值和結束值劃分為幾份。
In [7]: t.linspace(1, 10, 5)
Out[7]: tensor([ 1.0000, 3.2500, 5.5000, 7.7500, 10.0000])In [8]: t.linspace(1, 11, 5)
Out[8]: tensor([ 1.0000, 3.5000, 6.0000, 8.5000, 11.0000])In [9]:
2.7 torch.rand
用于生成數據類型為浮點型且維度指定的隨機 Tensor,和在 NumPy 中使用 numpy.rand 生成隨機數的方法類似,隨機生成的浮點數據在 0~1 區間均勻分布。
import torcha = torch.rand(2, 3)
輸出結果:
tensor([[0.6882, 0.4118, 0.2646],[0.0583, 0.2187, 0.8093]])
2.8 torch.randn
用于生成數據類型為浮點型且維度指定的隨機 Tensor,和在 NumPy 中使用 numpy.randn 生成隨機數的方法類似,隨機生成的浮點數的取值滿足均值為 0、方差為 1 的正態分布。
import torcha = torch.randn(2, 3)
輸出結果:
tensor([[ 0.2214, -0.0139, -0.0720],[ 0.2548, -1.3364, 0.3924]])
2.9 torch.new
Tensor 還有一個 new 方法,用法與 t.Tensor 一樣, 會調用該 Tensor 對應類型的構造函數,生成與當前 tensor 類型一致的 tensor。
In [126]: a = t.Tensor(2,3) In [127]: a
Out[127]:
tensor([[ 1.8829e+26, 4.5702e-41, -2.4199e-18],[-1.1804e+24, 2.3408e+26, 4.5702e-41]])In [128]: a.new(2,3)
Out[128]:
tensor([[-7.1914e+16, 4.5702e-41, 3.3177e+05],[ 0.0000e+00, 2.3408e+26, 4.5702e-41]])In [129]: a.new(3,4)
Out[129]:
tensor([[-7.1914e+16, 4.5702e-41, 3.4704e+05, 0.0000e+00],[-7.1913e+16, 4.5702e-41, -7.1913e+16, 4.5702e-41],[-7.6770e+16, 4.5702e-41, -7.6770e+16, 4.5702e-41]])In [130]: a.new(3,4).type()
Out[130]: 'torch.FloatTensor'In [131]:
總結
以上是生活随笔為你收集整理的PyTorch 笔记(02)— 常用创建 Tensor 方法(torch.Tensor、ones、zeros、eye、arange、linspace、rand、randn、new)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如初的下一句是什么啊?
- 下一篇: 剑走偏锋下一句是什么呢?