[PyTorch笔记]数据操作

[动手学深度学习PyTorch笔记]——数据操作

  • 1 引言
  • 2 预备知识
    • 2.1 数据操作
      • 2.1.1 入门
      • 2.1.2 运算符
      • 2.1.3 广播机制
      • 2.1.4 索引和切片
      • 2.1.5 节省内存
      • 2.1.6 转换为其他python对象
      • 2.1.7 总结
    • 2.2 数据预处理
      • 2.2.1 读取数据集
      • 2.2.2 处理缺失值
      • 2.2.3 转换为张量格式
      • 2.2.4 总结
    • 2.3 线性代数
      • 2.3.1 标量
      • 2.3.2 向量
      • 2.3.3 矩阵
      • 2.3.4 张量
      • 2.3.5 张量算法的基本性质
      • 2.3.6 降维
      • 2.3.7 点积(Dot Product)
      • 2.3.8 矩阵-向量积
      • 2.3.9 矩阵乘法
      • 2.3.10 范数
      • 2.3.11 总结
    • 2.4 微积分
      • 2.4.1 导数和微分
      • 2.4.2 偏导数
      • 2.4.3 梯度
      • 2.4.4 链式法则
      • 2.4.5 总结
    • 2.5 自动求导
      • 2.5.1 一个简单的例子
      • 2.5.2 分离计算
      • 2.5.3Python控制流的梯度计算
      • 2.5.4 总结

1 引言

1.机器学习研究计算机系统如何利用经验(通常是数据)来提高特定任务的性能。它结合了统计学、数据挖掘和优化的思想。通常,它是被用作实现人工智能解决方案的一种手段。
2.表示学习作为机器学习的一类,其研究的重点是如何自动找到合适的数据表示方式。深度学习是通过多层次的转换来进行的多层次的表示学习。
3.深度学习不仅取代了传统机器学习的浅层模型,而且取代了劳动密集型的特征工程。
4.最近在深度学习方面取得的许多进展,大都是由廉价传感器和互联网规模应用所产生的大量数据,以及(通过GPU)算力的突破来触发的。
5.整个系统优化是获得高性能的关键环节。有效的深度学习框架的开源使得这一点的设计和实现变得非常容易。

2 预备知识

2.1 数据操作

为了能够完成各种数据操作,我们需要某种方法来存储和操作数据。通常我们需要做两件重要的事情:
(1)获取数据;
(2)将数据读入计算机后对其进行处理。

首先,介绍n维数组,也称张量(tensor)。无论使用哪个深度学习框架,它的张量类斗鱼Numpy的ndarray类似。但深度学习框架又比Numpy的ndarray多一些重要功能:首先,GPU很好地支持加速计算,而Numpy仅支持CPU计算;其次,张量类支持自动微分。这些功能使得张量类更适合深度学习。

2.1.1 入门

首先,导入torch。虽然它被称为PyTorch,但是代码中使用torch而不是pytorch。

张量表示由数值组成的数组,这个数组可能有多个维度。具有轴的张量对应数学上的向量(vector); 具有两个轴的张量对应数学上的矩阵(matrix);具有两个轴以上的张量没有特殊的数学名称。

创建一个行向量X,包含以0开始的12个整数。

张量中的每个值都称为张量的 元素(element)。例如,张量 x 中有 12 个 元素。除非额外指定,新的张量将存储在内存中,并采用基于CPU的计算。

可以通过张量的shape属性来访问张量(沿每个轴的长度)的形状。

想知道张量中元素的总数,即形状的所有元素乘积,可以用size检查它的大小。

改变张量形状而不改变数量和元素值,可以用reshape。两个参数中,可以用一个-1来调用此自动计算出维度的功能。

有时,我们希望使0、全1、其他常量,或者从特定分布中随机采样的数字来初始化矩阵。我们可以创建 形状为(2,3,4)的张量,其中所有元素都设置为0。代码如下:

同样,我们可以创建形状为(2,3,4)的张量,其中所有元素都设置为1。代码如下:

有时我们想通过从某个特定的概率分布中随机采样来得到张量中每个元素的值。例如,当我们构造数组来作 为神经中的参数时,我们通常会随机初始化参数的值。以下代码创建形状为(3,4)的张量。其中的 每个元素都从均值为0、标准差为1的标准分布(正态分布)中随机采样。

我们还可以通过提供包含数值的Python列表(或嵌套列表),来为所需张量中的每个元素赋予确定值。在这里,最外层的列表对应于轴0,内层的列表对应于轴1。

2.1.2 运算符

常用的操作1:按元素(elementwise)运算。将标准标量运算符应用于数组的每个元素。对于任意具有相同形状的张量,常见的标准算数运算符(+,-,*,/,**)都可以被升级为按元素运算。

常用的操作2:张量拼接(concatenate)。只需要给定张量以及确定沿哪个轴拼接。

可以通过逻辑运算符构建二元张量。

对张量中的所有元素进行求和,会产生一个单元素张量。

2.1.3 广播机制

在张量形状不同时,我们可以调用广播机制来执行按元素操作。这种机制的工作方式如下:
1.通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;
2.对生成的数组执行按元素操作。

由于a和b分别是3 × 1和1 × 2矩阵,如果让它们相加,它们的形状不匹配。我们将两个矩阵广播为更大的3 × 2矩阵,如下所示:矩阵a将复制列,矩阵b将复制行,然后再按元素相加。

2.1.4 索引和切片

就像在任何其他Python数组中,张量中的元素可以通过索引访问。与任何Python数组:第元素的索引是0,最后元素索引是-1;可以指定范围以包含第元素和最后之前的元素。

除读取外,也可通过指定索引将元素写入矩阵。

如果想为多个元素赋值相同的值,我们只需要索引所有元素,然后为它们赋值。

2.1.5 节省内存

运些操作可能会导致为新结果分配内存。例如,如果我们= X + Y,我们将取消引指向的张量,而是指向新分配的内存处的张量。

我们ython的id()函数演示了这,它给我们提供了内存中引象的确切地址。运= Y + X后,我们会发现id(Y)指向另位置。这是因为Python计算Y + X,为结果分配新的内存,然后使Y指向内存中的这个新位置。

这可能是不可取的,原因有两个:

  1. ,我们不想总是不必要地分配内存。在机器学习中,我们可能有数百兆的参数,并且在内多次更新所有参数。通常情况下,我们希望原地执些更新;
  2. 如果我们不原地更新,其他引然会指向旧的内存位置,这样我们的某些代码可能会中引的参数。
    那怎样执行原地操作呢br> 可以使将操作的结果分配给先前分配的数组。

如果在后续计算中没有重复使用X,也可以使用X[:] = X + Y或X += Y来减少操作的内存开销。

2.1.6 转换为其他python对象

将深度学习框架定义的张量转换为NumPy张量(ndarray)很容易,反之也同样容易。torch张量和numpy数组将共享它们的底层内存,就地操作更改张量也会同时更改另张量。

要将为1的张量转换为Python标量,我们可以调tem函数或Python的内置函数。

2.1.7 总结

深度学习存储和操作数据的主要接口是张量(n维数组)。它提供了各种功能,包括基本数学运算、广播、索引、切片、内存节省和转换其他python对象。

2.2 数据预处理

为了能度学习来解决现实世界的问题,我们经常从预处理原始数据开始,是从那些准备好的张量格式数据开始。在Python中常数据分析中,我们通常使andas软件包。像庞Python系统中的许多其他扩展包,pandas可以与张量兼容。

2.2.1 读取数据集

举个例子,创建数据集,并存储在CSV(逗号分隔值)…/data/house_tiny.csv中。

来源:弓早早o_O

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2023年1月2日
下一篇 2023年1月2日

相关推荐