Pytorch_第二篇_Pytorch tensors 张量基础用法和常用操作

Pytorch tensors (张量)


Introduce

Pytorch的Tensors可以理解成Numpy中的数组ndarrays(0维张量为标量,一维张量为向量,二维向量为矩阵,三维以上张量统称为多维张量),但是Tensors 支持GPU并行计算,这是其最大的一个优点。

本文首先介绍tensor的基础用法,主要tensor的创建方式以及tensor的常用操作。

tensors 基础用法

  • tensors 常用创建方法
# 创建一个5行3列的矩阵,数据类型为long
x = torch.empty(5,3,dtype=torch.long)
# 类似的还有如下创建方式:
x = torch.zeros()
x = torch.ones()
x = torch.ones_like(z) # 创建一个与z形状相同的全1张量。
x = torch.rand()
x = torch.eye(2,2) # 2x2单位矩阵
x = torch.tensor([5.5, 3.0])  # 向量
# x = torch.tensor(5.5) 标量
# x = torch.tensor([[5.5, 3.0]]) 矩阵 

# 对x重新赋值(第一种是5X3全1矩阵,第二种是随机,size与x相同,新制定type覆盖旧type)
x = x.new_ones(5,3,dtype=torch.double)
x = torch.randn_like(x,dtype=torch.float)

# tensor与numpy array的相互转换,需要注意的是他们两个用的都是共同的内存空间,即不管哪一个的值发生改变,另外一个都会相应改变
# 从numpy array创建tensor
x = torch.from_numpy(np.ones(5))
# tensor转化为numpy array,调用.numpy()即可
y = x.numpy()


# 返回x的规模,返回值类型为元组tuple,张量也支持Numpy的shpae属性
x.size()
# 改变张量的维度,与Numpy的reshape类似
x = torch.randn(4, 4) # torch.Size([4, 4])
y = x.view(16) # torch.Size([16]), equal to y = torch.reshape(x,[16])
z = x.view(-1, 8)  # torch.Size([2, 8]),其中-1表示从其他维度大小推断当前维度大小

# note: 当张量使用了permute和transpose后,tensor占用的内存可能就变得不连续了,因此不能用view()函数来改变张量维度。必须先执行函数contiguous()使tensor占用内存空间连续,其次再使用view()函数改变维度才可。但是后续Pytorch增加了函数reshape()来改变tensor维度,相当于x.contigous().view()的功能,因此要改变维度直接使用y=torch.reshape(x,[16])即可。
  • tensors 常用操作方式
# tensor的拼接
# cat(),不增加新的维度,在某维度上拼接tensor(理解向量或矩阵的拼接就行)
# example 1
x = torch.randn(2,3)
y = torch.randn(1,3)
z = torch.cat((x, y), 0)   # 在0维(行)拼接y (y作为x的新行,增加行),维度为(3,3)
# example 2
x = torch.randn(2,3)
y = torch.randn(2,1)
z = torch.cat((x, y), 1) # 在1维(列)拼接y (y作为x的新列,增加列),维度为(2,4)



# tensor的堆叠
# stack(),增加新的维度,在新的维度上拼接tensor(无法想象,可以理解成新创建一个维度,然后把要堆叠的tensor放上去,新维度的大小就为要堆叠tensor的个数)
# 以下例子请注意堆叠后新size中3的位置
# example 1
x = torch.randn(1,2)
y = torch.randn(1,2)
z = torch.randn(1,2)
p = torch.cat((x, y,z), 0) # 在第0维度上堆叠,维度为 (3x1x2)
# example 2
x = torch.randn(1,2)
y = torch.randn(1,2)
z = torch.randn(1,2)
p = torch.cat((x, y,z), 1)  # 在第1维度上堆叠,维度为 (1x3x2)
# example 3
x = torch.randn(1,2)
y = torch.randn(1,2)
z = torch.randn(1,2)
p = torch.cat((x, y,z), 2) # 在第2维度上堆叠,维度为 (1x2x3)



# tensor交换两个维度,size中对应维度大小也交换,二维情况下类比于二维矩阵的转置
# transpose()
# exmample
x = torch.randn(1,2)
x = x.transpose(0,1) # equal to x.transpose_(0,1)
print(x.size()) # torch.Size([2, 1])
# note: 一般情况下,函数后面有加_,如x.transpose_(0,1),才会直接对原始tensor x进行操作,否则是返回一个新的tensor,而原始tensor x保持不变。



# tensor交换多个维度,size中对应维度大小也交换
# permute()
# example
x = torch.randn(1,2,3)
x = x.permute(2,0,1) # 理解为第零维度用原始第二维度填充,第一维度用原始第零维度填充,第二维度用原始第一维度填充
print(x.size()) # torch.Size([3, 1, 2])



# tensor压缩和解压维度
# squeeze(dim):如果dim维为大小为1,则去除,否则不做任何变化。如若不指定dim,则去除所有大小为1的维度。
# unsqueeze(dim):在dim上添加一个维度,维度大小为1。
# example
z = torch.randn(1,2)
z.squeeze_()
print(z.size()) # torch.Size([2])
z.unsqueeze_(1)
print(z.size()) # torch.Size([2, 1])

# note: 另外一些常用的方法,比如.sum()、.max()、x[1:]等基本操作都与numpy中的用法类似。


本文参考-1

本文参考-2

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