【Dive into Deep Learning / 动手学深度学习】第二章 - 第一节:数据操作

904 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

前言

Hello!

非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~  

自我介绍 ଘ(੭ˊᵕˋ)੭

昵称:海轰

标签:程序猿|C++选手|学生

简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖...已保研。

学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!  

唯有努力💪  

知其然 知其所以然!

2.1 数据操作

2.1.1. 入门

torch.arange()

x = torch.arange(12)
x

tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

shape

x.shape

torch.Size([12])

numel()

张量中元素的总数

x.numel()

12

reshape()

在这里插入图片描述

可以用-1来调用此自动计算出维度的功能。 即我们可以用x.reshape(-1,4)x.reshape(3,-1)来取代x.reshape(3,4)

ones()

torch.ones((2, 3, 4))

在这里插入图片描述

randn()

创建一个形状为(a,b,..)的张量。 其中的每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样

torch.randn(3, 4)

在这里插入图片描述

2.1.2. 运算符

+、-、*、/、** 、exp

同一形状的任意两个张量上调用按元素操作

在这里插入图片描述 在这里插入图片描述

总结:张量形状一样,在对应位置的元素进行相应的运算

多个张量连结(concatenate)

使用torch.cat()

在这里插入图片描述

==

在这里插入图片描述

sum()

在这里插入图片描述

2.1.3. 广播机制

在这里插入图片描述 在这里插入图片描述

a是31列, b是1行三列
a与b相加时
a变为32列(扩列),b也变为32列(扩行),再相加(对应位置元素相加)

2.1.4. 索引和切片

在这里插入图片描述

X[1:3]:[1,3),第一行、第二行(不包括第三行)


指定索引来将元素写入矩阵 在这里插入图片描述


在这里插入图片描述

2.1.5. 节省内存

在这里插入图片描述 id():查询变量在内存中的位置

执行Y=Y+X时

先计算Y+X,得到一个结果,会保存在一个新的内存里面

然后再使变量Y指向这个内存

一般来说,这样的操作不可取:同时更新多个参数,需要多个新内存

所以需要尽量进行原地更新

若不进行原地更新,其他引用仍然会指向旧的内存位置, 某些代码可能会无意中引用旧的参数

比如原来Y和K、T都指向一个内存地址,但是执行完Y=Y+X后,Y指向了新的内存地址,但是K、T依然还指向原来的内存地址,再使用K、T则会发生错误,所以尽量需要原地修改,这样修改后,K、T、Y依然指向的是同一个内存地址


可以使用切片表示法将操作的结果分配给先前分配的数组,例如Y[:] = <expression>,实现原地操作

X = torch.arange(3)
Y = torch.arange(3)
before = id(Y)
Y = Y + X
id(Y) == before

# False

使用Y[:] = Y + X

X = torch.arange(3)
Y = torch.arange(3)
before = id(Y)
Y[:] = Y + X
id(Y) == before

# True

或者 Y += X

X = torch.arange(3)
Y = torch.arange(3)
before = id(Y)
Y += X
id(Y) == before

# True

2.1.6. 转换为其他Python对象

在这里插入图片描述

结语

学习资料:http://zh.d2l.ai/

文章仅作为个人学习笔记记录,记录从0到1的一个过程

希望对您有一点点帮助,如有错误欢迎小伙伴指正

在这里插入图片描述