动手学深度学习V2---数据操作+数据预处理

动手学深度学习V2---数据操作+数据预处理

  • 数据操作
    • N维数组样例
    • 创建数组
    • 访问元素
  • 数据操作实现
    • 基本操作
    • 运算
    • 广播机制
    • 索引和切片
    • 节省内存
    • 转换为其他 Python 对象
  • 数据预处理实现
    • 读取数据集
    • 处理缺失值
    • 转换为张量格式

感谢李沐老师,这是李沐老师的 B站号,赶紧一键三连走起哈哈哈

数据操作

N维数组样例

N维数组是机器学习和神经网络的主要数据结构

动手学深度学习V2---数据操作+数据预处理_第1张图片
动手学深度学习V2---数据操作+数据预处理_第2张图片

创建数组

动手学深度学习V2---数据操作+数据预处理_第3张图片

访问元素

动手学深度学习V2---数据操作+数据预处理_第4张图片
注:[::3,::2]行每隔3个取值,列每隔2个取值

数据操作实现

基本操作

1.导入torch
在这里插入图片描述

2.张量表示由⼀个数值组成的数组,这个数组可能有多个维度,⼀个轴的张量对应数学上的向量(vector),
具有两个轴的张量对应数学上的 矩阵(matrix)

在这里插入图片描述
3.通过张量的 shape 属性来访问张量的形状(沿每个轴的⻓度) 在这里插入图片描述
4.张量中元素的总数
在这里插入图片描述
5.改变⼀个张量的形状而不改变元素数量和元素值,可以调用 reshape 函数,也可以通过在希望张量自动推
断的维度放置-1来调用此功能。在下面的例子中,我们可以用x.reshape(-1,4)或x.reshape(3,-1)来
取代x.reshape(3,4)

动手学深度学习V2---数据操作+数据预处理_第5张图片
6.使用全0、全1、其他常量或者从特定分布中随机采样的数字来初始化矩阵
动手学深度学习V2---数据操作+数据预处理_第6张图片
7.通过从某个特定的概率分布中随机采样来得到张量中每个元素的值
动手学深度学习V2---数据操作+数据预处理_第7张图片
8.通过提供包含数值的 Python 列表(或嵌套列表)来为所需张量中的每个元素赋予确定值
动手学深度学习V2---数据操作+数据预处理_第8张图片

运算

1.对于任意具有相同形状的张量,常见的标准算术运算符(+、-、*、/ 和 **)都可以被升级为按元素运算,在同⼀形状的任意两个张量上调用按元素操作
动手学深度学习V2---数据操作+数据预处理_第9张图片
2.按元素方式应用更多的计算,包括像求幂这样的⼀元运算符
动手学深度学习V2---数据操作+数据预处理_第10张图片
注: torch.exp()操作不支持Long类型的张量作为输入,如下图所示,解决方法: 将张量转为浮点型即可
动手学深度学习V2---数据操作+数据预处理_第11张图片
3.可以把多个张量连结(concatenate)在⼀起,沿行(轴-0,形状的第⼀个元素)和按列(轴-1,形状的第⼆个元素)连结两个矩阵
动手学深度学习V2---数据操作+数据预处理_第12张图片
4.通过逻辑运算符构建⼆元张量
动手学深度学习V2---数据操作+数据预处理_第13张图片
5.对张量中的所有元素进行求和会产生⼀个只有⼀个元素的张量
在这里插入图片描述

广播机制

1.即使形状不同,我们仍然可以通过调用广播机制(broadcasting mechanism)来执行按元素操作
动手学深度学习V2---数据操作+数据预处理_第14张图片
注:通过适当复制元素来扩展⼀个或两个数组,以便在转换之后,两个张量具有相同的形状,由于 a 和 b 分别是 3 × 1 和 1 × 2 矩阵,如果我们让它们相加,它们的形状不匹配。我们将两个矩阵广播为⼀个更大的 3 × 2 矩阵,如下所示:矩阵 a将复制列,矩阵 b将复制行,然后再按元素相加。

索引和切片

1.可以用 [-1] 选择最后⼀个元素,可以用[1:3] 选择第二个和第三个元素
动手学深度学习V2---数据操作+数据预处理_第15张图片
2.以通过指定索引来将元素写入矩阵
动手学深度学习V2---数据操作+数据预处理_第16张图片
3.为多个元素赋值相同的值,我们只需要索引所有元素,然后为它们赋值
动手学深度学习V2---数据操作+数据预处理_第17张图片
注:[0:2, :] 访问第1行和第2行,其中“:”代表沿轴 1(列)的所有元素

节省内存

1.运行一些操作可能会导致为新结果分配内存,⽤Y = X + Y,将取消引用 Y 指向的张
量,而是指向新分配的内存处的张量

动手学深度学习V2---数据操作+数据预处理_第18张图片
注:在上面的例子中,我们用 Python 的 id() 函数演示了这⼀点,它给我们提供了内存中引用对象的确切地址。运行Y = Y + X 后,我们会发现 id(Y) 指向另⼀个位置。这是因为 Python 首先计算 Y + X,为结果分配新的内存,然后使 Y 指向内存中的这个新位置。

2.执行原地操作
动手学深度学习V2---数据操作+数据预处理_第19张图片
注:(1)为什要执行原地操作?原因有两个:首先,我们不想总是不必要地分配内存。在机器学习中,我们可能有数百兆的参数,并且在⼀秒内多次更新所有参数。通常情况下,我们希望原地执行这些更新。其次,我们可能通过多个变量指向相同参数。如果我们不原地更新,其他引⽤仍然会指向旧的内存位置,这样我们的某些代码可能会⽆意中引用旧的参数。
(2)怎样执行原地操作?可以使用切片表示法将操作的结果分配给先前分配的数组,例如Y[:] = “表达式”。为了说明这⼀点,我们首先创建⼀个新的矩阵 Z,其形状与另⼀个 Y 相同,使用zeros_like 来分配⼀个全0的块。

3.在后续计算中没有重复使⽤ X,我们也可以使⽤ X[:] = X + Y 或 X += Y 来减少操作的内存开销。
动手学深度学习V2---数据操作+数据预处理_第20张图片

转换为其他 Python 对象

1.转换为 NumPy 张量
动手学深度学习V2---数据操作+数据预处理_第21张图片
2.将大小为1的张量转换为 Python 标量,我们可以调用 item 函数或 Python 的内置函数
动手学深度学习V2---数据操作+数据预处理_第22张图片
注:item()是得到一个元素张量里面的元素值

数据预处理实现

读取数据集

1.创建⼀个人工数据集,并存储在csv(逗号分隔值)文件
动手学深度学习V2---数据操作+数据预处理_第23张图片
注:(1)import os在python环境下对文件,文件夹执行操作的一个模块;
(2)os.path.join()函数:连接两个或更多的路径名组件;
(3)os.makedirs(name, mode=0o777, exist_ok=False)
作用:用来创建多层目录(单层请用os.mkdir)
参数说明:
name:你想创建的目录名
mode:要为目录设置的权限数字模式,默认的模式为 0o777 (八进制)。
exist_ok:是否在目录存在时触发异常。如果exist_ok为False(默认值),则在目标目录已存在的情况下触发FileExistsError异常;如果exist_ok为True,则在目标目录已存在的情况下不会触发FileExistsError异常。
(4)with open(data_file, ‘w’) as f:
作用:文件的写操作
参数说明:
w: 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

2.从创建的CSV文件中加载原始数据集
动手学深度学习V2---数据操作+数据预处理_第24张图片

处理缺失值

1.处理缺失的数据,典型的方法包括插值和删除,其中插值用替代值代替缺失值,而删除则忽略缺失值
动手学深度学习V2---数据操作+数据预处理_第25张图片
动手学深度学习V2---数据操作+数据预处理_第26张图片

注:(1)“NaN”项代表缺失值;
(2)pandas.get_dummies(data, prefix=None, prefix_sep=’_’, dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)
作用:pandas 中的 get_dummies 方法主要用于对类别型特征做 One-Hot 编码(独热编码);
参数说明:dummy_na: bool, default False:如果忽略False NaNs,则添加一列来指示NaNs;
(3)对于inputs中的类别值或离散值,我们将“NaN”视为⼀个类别。由于“巷⼦”(“Alley”)列只接受两种类
型的类别值“Pave”和“NaN”,pandas可以⾃动将此列转换为两列“Alley_Pave”和“Alley_nan”。巷⼦
类型为“Pave”的⾏会将“Alley_Pave”的值设置为1,“Alley_nan”的值设置为0。缺少巷⼦类型的⾏会将
“Alley_Pave”和“Alley_nan”分别设置为0和1。

转换为张量格式

1.现在inputs和outputs中的所有条⽬都是数值类型,它们可以转换为张量格式
动手学深度学习V2---数据操作+数据预处理_第27张图片
注:当数据采⽤张量格式后,可引⼊的那些张量函数来进⼀步操作。

参考:
动手学深度学习
04 数据操作 + 数据预处理【动手学深度学习v2】

你可能感兴趣的:(动手学深度学习,python,深度学习,机器学习)