【笔记——李沐动手学深度学习】2.1 数据操作
·
文章目录
省略前面的环境安装部分。在安装环境遇阻,不过好在在CSDN找到了部分解决方案,加上DeepSeek成功安装了需要的环境。(最主要是版本的问题,因为李沐老师用的是旧版python)
1.数据操作
1. N维数组
- 机器学习用的最多的是N维数组,N维数组是机器学习和神经网络的主要数据结构。
0维:标量(即一个数字)
1维:向量
2维:矩阵(每一行是一个样本,每一列是不同样本的相同种特征)
3维:长 * 宽 * 通道(此处RGB是三通道)
4维:n个三维数组放在一起,如一个RGB图片的批量,一个batch
5维:如视频的批量(多了一个时间的维度)


2.创建数组
- 创建数组需要:**形状、指定每个元素的数据类型**、元素值。
如下图表示,所有元素的值是 按照正态分布表示的, 右图指 元素值 可以按均匀分布来产生。
3.访问元素
- 可以根据切片,或者间隔步长访问元素。
- 比如:
[::3,::2]是每隔3行、2列访问。
注:索引都是从0开始
1.访问第一行第二列的元素
2.访问第一行所有元素
3.访问第一列所有元素
4.访问第一至三行(左闭右开,即 第一、二行,不含第三行) 的 第一列及之后的所有元素
5.跳着访问:每隔3行 、每隔2列 取一个元素

2. 数据操作实现
1. 导入torch
- 首先,我们导入torch。请注意,虽然它被称为PyTorch,但是代码中使用torch而不是pytorch。

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

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

4. 张量元素数

5. 改变张量形状
- 要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数。
- 例如,可以把张量x从形状为(12,)的行向量转换为形状为(3,4)的矩阵。 这个新的张量包含与转换前相同的值,但是它被看成一个3行4列的矩阵。

- 如果我们的目标形状是(高度,宽度), 那么在知道宽度后,高度会被自动计算得出,不必我们自己做除法。
- 我们可以通过 -1 来调用此自动计算出维度的功能。 即我们可以用 x.reshape(-1,4) 或 x.reshape(3,-1) 来取代x.reshape(3,4)。

6. 初始化张量
- 使用全0、全1、其他常量,或者从特定分布中随机采样的数字来初始化矩阵。
- 我们可以创建一个形状为(2,3,4)的张量,其中所有元素都设置为0。

- 同样,我们可以创建一个形状为(2,3,4)的张量,其中所有元素都设置为1。

- randn:生成服从标准正态分布(均值为 0,标准差为 1)的随机数。

- 通过提供包含数值的Python列表(或嵌套列表),来为所需张量中的每个元素赋予确定值。

7. 运算
- 常见的标准算术运算符 (+、-、*、/ 和 ** ) 都可以被升级为按元素运算

- 求幂

- 连结

- 通过逻辑运算符构建二元张量

- 对张量中的所有元素进行求和

8. 广播
- 在某些情况下,即使形状不同,我们仍然可以通过调用 广播机制(broadcasting mechanism)来执行按元素操作。
- 通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状。
- 对生成的数组执行按元素操作。
- 维度必须相同,否则无法广播。

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

9. 索引和切片
- 与任何Python数组一样:第一个元素的索引是0,最后一个元素索引是-1; 可以指定范围以包含第一个元素和最后一个之前的元素。
- 如下所示,我们可以用
[-1]选择最后一个元素,可以用[1:3]选择第二个和第三个元素:

- 指定索引来将元素写入矩阵

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

10.节省内存
- 运行一些操作可能会导致为新结果分配内存
- Python的
id()函数给我们提供了内存中引用对象的确切地址。

- 使用切片表示法将操作的结果分配给先前分配的数组,就可以保证原地更新。

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

11. 转换为其他Python对象

- 用于将一个标量(例如单个数值)转换为 Python 的原生数据类型(如int、float等)。当a是一个 Numpy 数组且数组只有一个元素时,使用
item()方法可以提取这个元素的值并转换为 Python 内置类型。

12. 小结
- 深度学习存储和操作数据的主要接口是张量( n n n维数组)。它提供了各种功能,包括基本数学运算、广播、索引、切片、内存节省和转换其他Python对象。
更多推荐
所有评论(0)