PyTorch 基礎(chǔ)(1) 張量 Tensor

使用張量處理數(shù)據(jù)

張量(Tensors)類似于numpy中的ndarrays炭序,Tensors可以在GPU中加速運(yùn)算跺株。
我們首先導(dǎo)入torch

from __future__ import print_function # python2中使用print()的輸出函數(shù)
import torch

然后我們創(chuàng)建一個(gè)3行和4列的2D數(shù)組(通常也叫矩陣),并且把每個(gè)元素初始化成0

x = torch.zeros(3, 4)
print(x)

0 0 0 0
0 0 0 0
0 0 0 0
[torch.FloatTensor of size 3x4]

類似的府喳,我們可以創(chuàng)建數(shù)組每個(gè)元素被初始化成1蒲肋。

x = torch.ones(3, 4)
print(x)

1 1 1 1
1 1 1 1
1 1 1 1
[torch.FloatTensor of size 3x4]

或者從數(shù)組直接構(gòu)造

x = torch.FloatTensor([[1,2],[3,4]])
print(x)

1 2
3 4
[torch.FloatTensor of size 2x2]

我們經(jīng)常需要?jiǎng)?chuàng)建隨機(jī)數(shù)組,就是說每個(gè)元素的值都是隨機(jī)采樣而來,這個(gè)經(jīng)常被用來初始化模型參數(shù)兜粘。下面創(chuàng)建數(shù)組申窘,它的元素服從均值0方差1的正態(tài)分布。

y = torch.randn(3, 4)
print(y)

1.8000 -1.2639 -0.5560 0.4861
-0.7101 -0.1594 -0.8752 -0.1776
-0.5662 -0.1355 -1.0900 -0.1244
[torch.FloatTensor of size 3x4]

每個(gè)數(shù)組的形狀可以通過.shape來獲取

print(x.size()) 

(3L, 4L)

它的總元素個(gè)數(shù)孔轴,是形狀的累乘剃法。

x_num = x.size(0) * x.size(1)
print(x_num)

12

操作符

PyTorch支持大量的數(shù)學(xué)操作符,例如按元素加法:

x = torch.FloatTensor([[1,2],[3,4]])
y = torch.FloatTensor([[5,6],[7,8]])
print(x + y) # 或者print(torch.add(x, y))

6 8
10 12
[torch.FloatTensor of size 2x2]

乘法:

print(x * y)

5 12
21 32
[torch.FloatTensor of size 2x2]

指數(shù)運(yùn)算:

print(torch.exp(x))

2.7183 7.3891
20.0855 54.5981
[torch.FloatTensor of size 2x2]

也可以轉(zhuǎn)置一個(gè)矩陣然后計(jì)算矩陣乘法:

x = torch.FloatTensor([[1,2,3],[4,5,6]])
y = torch.FloatTensor([[7,8,9],[10,11,12]])
print(torch.matmul(x, torch.t(y)))

50 68
122 167
[torch.FloatTensor of size 2x2]

可以索引數(shù)組:

x = torch.FloatTensor([[1,2],[3,4]])
print(x[:,1]) #提取第2列

2
4
[torch.FloatTensor of size 2]

形狀轉(zhuǎn)換(Broadcasting)

當(dāng)二元操作符左右兩邊Tensor形狀不一樣時(shí)距糖,系統(tǒng)會嘗試將其復(fù)制到一個(gè)共同的形狀玄窝。例如a的第0維是3, b的第0維是1,那么a+b時(shí)會將b沿著第0維復(fù)制3遍:

a = torch.arange(0, 3).resize_(3, 1)
b = torch.arange(0, 2).resize_(1, 2)
print(a)
print(b)
print(a + b)

0
1
2
[torch.FloatTensor of size 3x1]
0 1
[torch.FloatTensor of size 1x2]
0 1
1 2
2 3
[torch.FloatTensor of size 3x2]

跟NumPy的轉(zhuǎn)換

Tensor可以很方便同numpy進(jìn)行轉(zhuǎn)換

x = np.ones((2, 3)).astype(np.float32)
y = torch.from_numpy(x) # numpy -> tensor
z = y.numpy() # tensor -> numpy
print(x)
print(y)
print(z)

[[ 1. 1. 1.]
[ 1. 1. 1.]]
1 1 1
1 1 1
[torch.FloatTensor of size 2x3]
[[ 1. 1. 1.]
[ 1. 1. 1.]]

替換操作(In-place)

在前面的樣例中悍引,我們?yōu)槊總€(gè)操作新開內(nèi)存來存儲它的結(jié)果。例如帽氓,如果我們寫y = x + y, 我們會把y從現(xiàn)在指向的實(shí)例轉(zhuǎn)到新建的實(shí)例上去趣斤。我們可以用Python的id()函數(shù)來看這個(gè)是怎么執(zhí)行的:

x = torch.ones(3,4)
y = torch.ones(3,4)
before = id(y)
y = y + x
print(id(y) == before)

False

我們可以把結(jié)果通過[:]寫到一個(gè)之前開好的數(shù)組里:

x = torch.ones(3,4)
y = torch.ones(3,4)
z = torch.zeros(x.size())
before = id(z)
z[:] = x + y
print(id(z) == before)

True

但是這里我們還是為x+y創(chuàng)建了臨時(shí)空間,然后再復(fù)制到z黎休。需要避免這個(gè)開銷浓领,我們可以使用操作符的全名版本中的out參數(shù):

torch.add(x, y, out=z)

如果現(xiàn)有的數(shù)組不會復(fù)用,我們也可以用y.add_(x)達(dá)到這個(gè)目的势腮,類似的操作還有x.copy_(y)联贩,x.t_()

x = torch.ones(3,4)
y = torch.ones(3,4)
before = id(y)
y.add_(x)
print(id(y) == before)

True

截取(Slicing)

截取x的第2、3行:

x = torch.arange(0,9).resize_(3,3)
print(x)
print(x[1:3])

0 1 2
3 4 5
6 7 8
[torch.FloatTensor of size 3x3]
3 4 5
6 7 8
[torch.FloatTensor of size 2x3]

截取x的第2捎拯、3列:

x = torch.arange(0,9).resize_(3,3)
print(x)
print(x[:,1:3])

0 1 2
3 4 5
6 7 8
[torch.FloatTensor of size 3x3]
1 2
4 5
7 8
[torch.FloatTensor of size 3x2]

以及直接寫入指定位置:

x[1,2] = 9.0
print(x)

0 1 2
3 4 9
6 7 8
[torch.FloatTensor of size 3x3]

多維截壤峄稀:

print(x[1:2,1:3])

4 9
[torch.FloatTensor of size 1x2]

多維寫入:

x[1:2,1:3] = 9.0
print(x)

0 1 2
3 9 9
6 7 8
[torch.FloatTensor of size 3x3]

GPU計(jì)算

通過在張量后加上.cuda()可以把Tensors移動(dòng)到GPU上

x = torch.arange(0,9).resize_(3,3)
y = torch.arange(1,10).resize_(3,3)
print(x)
print(y)
if torch.cuda.is_available():
    x = x.cuda()
    y = y.cuda()
print(x)
print(y)
print(x+y)

0 1 2
3 4 5
6 7 8
[torch.cuda.FloatTensor of size 3x3 (GPU 0)]
1 2 3
4 5 6
7 8 9
[torch.cuda.FloatTensor of size 3x3 (GPU 0)]
1 3 5
7 9 11
13 15 17
[torch.cuda.FloatTensor of size 3x3 (GPU 0)]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市署照,隨后出現(xiàn)的幾起案子祸泪,更是在濱河造成了極大的恐慌,老刑警劉巖建芙,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件没隘,死亡現(xiàn)場離奇詭異,居然都是意外死亡禁荸,警方通過查閱死者的電腦和手機(jī)右蒲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赶熟,“玉大人瑰妄,你說我怎么就攤上這事【螅” “怎么了翰撑?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我眶诈,道長涨醋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任逝撬,我火速辦了婚禮浴骂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宪潮。我一直安慰自己溯警,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布狡相。 她就那樣靜靜地躺著梯轻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尽棕。 梳的紋絲不亂的頭發(fā)上喳挑,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機(jī)與錄音滔悉,去河邊找鬼伊诵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛回官,可吹牛的內(nèi)容都是我干的曹宴。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼歉提,長吁一口氣:“原來是場噩夢啊……” “哼笛坦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唯袄,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤弯屈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后恋拷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體资厉,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年蔬顾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宴偿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诀豁,死狀恐怖窄刘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舷胜,我是刑警寧澤娩践,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響翻伺,放射性物質(zhì)發(fā)生泄漏材泄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一吨岭、第九天 我趴在偏房一處隱蔽的房頂上張望拉宗。 院中可真熱鬧,春花似錦辣辫、人聲如沸旦事。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姐浮。三九已至,卻和暖如春化戳,著一層夾襖步出監(jiān)牢的瞬間单料,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工点楼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人白对。 一個(gè)月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓掠廓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親甩恼。 傳聞我的和親對象是個(gè)殘疾皇子蟀瞧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容