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 的操作又可分為以下兩類:
- 不會修改自身的數(shù)據(jù),如
a.add(b),加法結(jié)果會返回一個新的tensor; - 會修改自身的數(shù)據(jù),如
a.add_(b),加法結(jié)果仍儲存在a中,但是a已經(jīng)被修改了;
注意:函數(shù)名以 _ 結(jié)尾的都是 inplace 方式,即會修改調(diào)用者自己的數(shù)據(jù)。
2. Tensor 創(chuàng)建方法
PyTorch 中的 Tensor 也有自己的數(shù)據(jù)類型定義方式,常用的如下。
2.1 torch.Tensor
需要注意的是,使用 torch.Tensor(*sizes) 創(chuàng)建 Tensor 時,系統(tǒng)不會立即分配空間,只會計算當前內(nèi)容空間是否夠用,使用到 Tensor 時才會分配,而其它操作都會在創(chuàng)建完成后立即進行空間分配。
用于創(chuàng)建一個 Tensor ,即可接受 list 作為參數(shù),也可以接受指定形狀作為參數(shù),還能傳入其它的 tensor 。
Tensor接受形狀參數(shù),創(chuàng)建一個 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'
- 將列表轉(zhuǎn)換為
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轉(zhuǎn)換為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
- 創(chuàng)建一個元素為 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
用于生成數(shù)據(jù)類型為浮點型且維度指定的 Tensor,不過這個浮點型的 Tensor中的元素值全部為 1,dtype 參數(shù)可以指定其數(shù)據(jù)類型。
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
用于生成數(shù)據(jù)類型為浮點型且維度指定的 Tensor,不過這個浮點型的 Tensor中的元素值全部為 0,dtype 參數(shù)可以指定其數(shù)據(jù)類型。
import torcha = torch.zeros(2, 3, dtype=torch.int8)
print a
輸出結(jié)果:
tensor([[0, 0, 0],[0, 0, 0]], dtype=torch.int8)
2.4 torch.eye
用于生成數(shù)據(jù)類型為浮點型且維度指定的 Tensor,不過這個浮點型的 Tensor中對角線元素均為 1 ,dtype 參數(shù)可以指定其數(shù)據(jù)類型。
In [5]: t.eye(3,3)
Out[5]:
tensor([[1., 0., 0.],[0., 1., 0.],[0., 0., 1.]])In [6]:
2.5 torch.arange
用于生成數(shù)據(jù)類型為浮點型且自定義起始范圍和結(jié)束范圍的 Tensor,所以傳遞給 torch.linspace 的參數(shù)有三個,分別是范圍的起始值、范圍的結(jié)束值和步長,其中,步長用于指定從起始值到結(jié)束值的每步的數(shù)據(jù)間隔。
import torcha = torch.arange(1, 10, 2)
輸出結(jié)果:
tensor([1, 3, 5, 7, 9])
2.6 torch.linspace
用于生成數(shù)據(jù)類型為長整型且自定義起始范圍和結(jié)束范圍的 Tensor,所以傳遞給 torch.arange 的參數(shù)有三個,分別是范圍的起始值、范圍的結(jié)束值和均勻分成的份數(shù),其中,份數(shù)用于將起始值和結(jié)束值劃分為幾份。
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
用于生成數(shù)據(jù)類型為浮點型且維度指定的隨機 Tensor,和在 NumPy 中使用 numpy.rand 生成隨機數(shù)的方法類似,隨機生成的浮點數(shù)據(jù)在 0~1 區(qū)間均勻分布。
import torcha = torch.rand(2, 3)
輸出結(jié)果:
tensor([[0.6882, 0.4118, 0.2646],[0.0583, 0.2187, 0.8093]])
2.8 torch.randn
用于生成數(shù)據(jù)類型為浮點型且維度指定的隨機 Tensor,和在 NumPy 中使用 numpy.randn 生成隨機數(shù)的方法類似,隨機生成的浮點數(shù)的取值滿足均值為 0、方差為 1 的正態(tài)分布。
import torcha = torch.randn(2, 3)
輸出結(jié)果:
tensor([[ 0.2214, -0.0139, -0.0720],[ 0.2548, -1.3364, 0.3924]])
2.9 torch.new
Tensor 還有一個 new 方法,用法與 t.Tensor 一樣, 會調(diào)用該 Tensor 對應類型的構(gòu)造函數(shù),生成與當前 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]:
總結(jié)
以上是生活随笔為你收集整理的PyTorch 笔记(02)— 常用创建 Tensor 方法(torch.Tensor、ones、zeros、eye、arange、linspace、rand、randn、new)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如初的下一句是什么啊?
- 下一篇: PyTorch 笔记(03)— Tens