动手学深度学习pytorch版2——数据基础

课程主页:https://courses.d2l.ai/zh-v2
教材:https://zh-v2.d2l.ai/
课程论坛讨论:https://discuss.d2l.ai/c/16
Pytorch论坛:https://discuss.pytorch.org/
温故而知新!!!

创建数组

1) 创建数组所需参数如下述表格所示:

参数参数说明
形状如3*4矩阵
元素的数据类型如32位浮点数
元素的值如全是0,或全是随机数

2) 创建数组的2种方法:使用方法创建+手动创建

  1. 使用方法创建:
    a) 使用arange方法和reshape方法创建数组
    x = torch.arange(12, dtype = torch.int).reshape(3, 4)创建一个二维数组,行数为3,列数为4,数据类型为整型数据(int)
    arange和reshape方法
    b) 使用zeros方法创建数组
    y = torch.zeros((3, 4)),创建一个二维数组,行数为3,列数为4,数据类型为float型,数据元素的值均为0zeros方法 c) 使用ones方法创建数组
    y = torch.ones((3, 4))创建一个二维数组,行数为3,列数为4,数据类型为float型,数据元素的值均为1ones方法
    d) 使用randn方法创建数组
    y = torch.randn((3, 4))创建一个二维数组,行数为3,列数为4,数据类型为float型,数据元素的值均为随机数randn方法

  2. 手动创建: 使用tensor方法,手动输入数组
    同上,创建二维数组,行数为3,列数为4,数据元素的值由用户的输入决定,代码实例如下:

    z = torch.tensor([[1, 2, 3, 4], [6, 6, 6, 6], [4, 4, 4, 4]])
    

    在这里插入图片描述

查询数组的形状

通过张量的shape属性来访问张量的形状,通过方法numel来访问张量的大小

x.shape
x.numel()

shape和numel

访问数组中元素

借用课程PPT便于说明,python中数据都默认从0开始,所以[1,2]实际访问的是第2行第3列的元素7,其余依此类推。同时注意::为跳跃访问操作,[::3, ::2]表示从第0行开始,先访问第0个元素,然后访问第0+2=2个元素,以此类推,直到第一行元素访问结束,然后访问第0+3=3行元素,以此类推,直到矩阵元素访问结束。

备注:访问的同时,也可以对元素的值进行修改,且该修改为原地修改,不会导致内存地址的变化。
课程PPT
使用代码实践一波:

y = (torch.arange(16) + 1).reshape(4, 4)
print(y)
print(y[1, 2])
print(y[1, :])
print(y[:, 1])
print(y[1:3, 1:])
print(y[::3, ::2])

在这里插入图片描述

数组的广播机制

在某些情况下,即使形状不同,仍然可以通过调用广播机制(broadcasting mechanism)来执行按元素操作。广播机制的工作方式如下:首先,通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;其次,对生成的数组执行按元素操作。

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

在这里插入图片描述

数组的内存分配

运行⼀些操作可能会导致为新结果分配新的内存。例如,如果我们用Y = X + Y,系统将为计算的结果分配一个新的内存,并且Y指向该新分配的内存,同时释放Y的旧地址所指的内存。实例如下:

X = torch.tensor([1])
Y = torch.tensor([2])
print("Y原本指向的内存地址:")
print(id(Y))
before = id(Y)
Y = Y + X
print("\n" + "Y现在指向的内存地址:")
print(id(Y))
after = id(Y)
print("\n" + "两者是否相等:")
print(before == after)

在这里插入图片描述
使用python语言写代码时,尤其需要注意其内存分配机制。此处给出两种原地修改的方法:

  1. 使用切片表示法将操作的结果分配给先前分配的数组
X = torch.tensor([1])
Y = torch.tensor([2])
Z = torch.zeros_like(Y)
print("Z原本指向的内存地址:")
print(id(Z))
before = id(Z)
Z[:] = Y + X
print("\n" + "Z现在指向的内存地址:")
print(id(Z))
after = id(Z)
print("\n" + "两者是否相等:")
print(before == after)

切片表示法

  1. 使用+=类似的操作
X = torch.tensor([1])
Y = torch.tensor([2])
print("Y原本指向的内存地址:")
print(id(Y))
before = id(Y)
Y += X
print("\n" + "Y现在指向的内存地址:")
print(id(Y))
after = id(Y)
print("\n" + "两者是否相等:")
print(before == after)

+=操作

数据类型转换
  1. numpy类型转换为tensor类型:使用tensor方法进行转换
A = X.numpy()
B = torch.tensor(A)
type(A), type(B)

在这里插入图片描述
2. tensor类型转换为标量类型:可使用item方法方法进行转换,也可使用Python已有的类型进行强制转换(如:int,float

a = torch.tensor([4])
a, a.item(), int(a), float(a)

转换为标量

参考文献
  1. 动⼿学深度学习 Release 2.0.0-beta0
  2. 数据操作
  3. 数据操作实现
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值