PyTorch 基础(1) 张量 Tensor

使用张量处理数据

张量(Tensors)类似于numpy中的ndarrays,Tensors可以在GPU中加速运算。
我们首先导入torch

from __future__ import print_function # python2中使用print()的输出函数
import torch

然后我们创建一个3行和4列的2D数组(通常也叫矩阵),并且把每个元素初始化成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]

类似的,我们可以创建数组每个元素被初始化成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]

或者从数组直接构造

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

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

我们经常需要创建随机数组,就是说每个元素的值都是随机采样而来,这个经常被用来初始化模型参数。下面创建数组,它的元素服从均值0方差1的正态分布。

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]

每个数组的形状可以通过.shape来获取

print(x.size()) 

(3L, 4L)

它的总元素个数,是形状的累乘。

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

12

操作符

PyTorch支持大量的数学操作符,例如按元素加法:

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]

指数运算:

print(torch.exp(x))

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

也可以转置一个矩阵然后计算矩阵乘法:

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]

可以索引数组:

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

2
4
[torch.FloatTensor of size 2]

形状转换(Broadcasting)

当二元操作符左右两边Tensor形状不一样时,系统会尝试将其复制到一个共同的形状。例如a的第0维是3, b的第0维是1,那么a+b时会将b沿着第0维复制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的转换

Tensor可以很方便同numpy进行转换

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 = x + y, 我们会把y从现在指向的实例转到新建的实例上去。我们可以用Python的id()函数来看这个是怎么执行的:

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

False

我们可以把结果通过[:]写到一个之前开好的数组里:

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创建了临时空间,然后再复制到z。需要避免这个开销,我们可以使用操作符的全名版本中的out参数:

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

如果现有的数组不会复用,我们也可以用y.add_(x)达到这个目的,类似的操作还有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计算

通过在张量后加上.cuda()可以把Tensors移动到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)]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容