用 Python 从零开始创建神经网络(十三):训练数据集(Training Dataset)

训练数据集(Training Dataset)

引言

既然我们在讨论数据集和测试,就值得提到关于训练数据集的一些操作,这些操作称为预处理。然而,重要的是要记住,无论我们对训练数据进行什么预处理,这些处理也需要应用到验证数据、测试数据以及后续的预测数据上。

神经网络通常在值范围为 0 0 0到 1 1 1或 − 1 -1 −1到 1 1 1的数据上表现最佳,其中 − 1 -1 −1到 1 1 1范围更为优选。将数据中心化到 0 0 0可以帮助模型训练,因为这可以减弱权重在某个方向上的偏置。尽管在大多数情况下,模型在 0 0 0到 1 1 1范围内的数据上也能正常工作,但有时我们需要将数据重新缩放到 − 1 -1 −1到 1 1 1的范围,以使训练更稳定或获得更好的结果。

谈到数据范围,数据值不一定严格局限于 − 1 -1 −1到 1 1 1之间------模型在稍微超出该范围或某些值远大于范围时也能表现良好。这种情况通常发生在我们用权重乘以数据并将结果与偏置求和后,结果会传递给一个激活函数。许多激活函数在上述范围内表现良好。例如,softmax会输出一个范围在 0 0 0到 1 1 1之间的概率向量;sigmoid的输出范围也是 0 0 0到 1 1 1,而tanh的输出范围则是 − 1 -1 −1到 1 1 1。

另一个为何这种缩放理想的原因在于神经网络依赖大量的乘法运算。如果我们乘以大于 1 1 1或小于 − 1 -1 −1的数字,结果的规模会比原始值更大。而在 − 1 -1 −1到 1 1 1的范围内,结果是一个分数,即更小的值。将训练数据中的大数值与权重相乘可能会导致浮点溢出或不稳定性,例如权重增长过快。使用较小的数值更容易控制训练过程。

数据预处理有许多相关术语,例如标准化、缩放、方差缩放、均值去除(如前所述)、非线性变换、针对异常值的缩放等,但这些超出了本书的范围。我们仅通过将所有数字除以其绝对值的最大值来将数据缩放到一个范围。例如,对于一个值范围在 0 0 0到 255 255 255之间的图像,我们将整个数据集除以 255 255 255,使数据返回到 0 0 0到 1 1 1的范围。我们也可以减去 127.5 127.5 127.5(得到范围从 − 127.5 -127.5 −127.5到 127.5 127.5 127.5),然后再除以 127.5 127.5 127.5,使数据返回到 − 1 -1 −1到 1 1 1的范围。

我们需要确保对所有数据集(训练集、验证集和测试集)使用相同的缩放方式(相同的缩放参数)。例如,可以找到训练数据的最大值,并用这个数值除以训练、验证和测试数据的所有值。一般来说,我们应准备一个选择的缩放器,并在每个数据集上使用它的实例。需要记住的是,一旦我们训练了模型并想用新的样本进行预测时,必须使用与训练、验证和测试数据相同的缩放器实例对这些新样本进行缩放。通常情况下,当处理数据(例如传感器数据)时,需要将缩放器对象与模型一起保存,并在预测时使用,否则结果可能会有所不同,因为如果数据未经缩放,模型可能无法有效识别这些数据。

通常,用基于训练数据准备的缩放器对包含比训练数据更大的数字的数据集进行缩放是可以接受的。如果结果的数值略微超出 − 1 -1 −1到 1 1 1的范围,通常不会对验证或测试产生负面影响,因为我们不会在这些数据上进行训练。此外,对于线性缩放,我们可以使用不同的数据集来找到最大值,但要注意,对于非线性缩放,可能会泄露其他数据集的信息到训练数据集中,在这种情况下,缩放器应仅基于训练数据准备。

在训练样本较少的情况下,我们可以使用数据增强(Data Augmentation)。一个简单理解数据增强的方法是以图像为例。假设我们的模型目标是检测腐烂的水果------例如苹果。我们会从不同角度拍摄苹果的照片,并预测它是否腐烂。虽然我们需要更多的照片,但假设无法获取更多样本。这种情况下,我们可以对已有的照片进行旋转、裁剪,并将这些处理后的图像也保存为有效数据。通过这种方式,我们为数据集增加了样本数量,这有助于模型的泛化能力。

一般来说,数据增强只有在生成的增强样本与现实中可能出现的变化相似时才有用。例如,如果我们在构建检测路标的模型时,通常不会使用旋转增强,因为现实中路标通常不会被旋转(大多数情况下)。但如果你在开发自动驾驶汽车时,这种情况就值得考虑。比如,一个停车标志的螺栓松动并倒转了,但这并不意味着车辆可以忽视停车要求,因此模型需要考虑这些异常情况。

我们需要多少样本来训练模型呢?这个问题没有唯一答案------某些模型可能只需要每个类别少量的样本,而其他模型可能需要数百万甚至数十亿的样本。通常,每个类别几千个样本是必要的,而每个类别数万样本是比较理想的起点。具体需求取决于数据的复杂性和模型的规模。例如,如果模型需要预测包含简单两类的传感器数据,例如图像中是否有暗区域,那么每个类别几百个样本可能就足够了。而如果需要训练包含多特征和多类别的数据,则建议以数万样本为起点。如果你尝试训练一个聊天机器人以理解书面语言的复杂性,通常至少需要数百万样本。


本章的章节代码、更多资源和勘误表:https://nnfs.io/ch13

相关推荐
程序员黄同学29 分钟前
如何使用 Python 连接 MySQL 数据库?
数据库·python·mysql
I_Am_Me_29 分钟前
【JavaEE初阶】线程安全问题
开发语言·python
张叔zhangshu36 分钟前
TensorFlow 的基本概念和使用场景
人工智能·python·tensorflow
运维&陈同学37 分钟前
【Elasticsearch05】企业级日志分析系统ELK之集群工作原理
运维·开发语言·后端·python·elasticsearch·自动化·jenkins·哈希算法
新手小袁_J1 小时前
实现Python将csv数据导入到Neo4j
数据库·python·neo4j·《我是刑警》·python连接neo4j·python导入csv·csv数据集导入neo4j
清风ꦿ2 小时前
neo4j 图表数据导入到 TuGraph
python·neo4j·knowledge graph
深度学习lover4 小时前
[项目代码] YOLOv8 遥感航拍飞机和船舶识别 [目标检测]
python·yolo·目标检测·计算机视觉·遥感航拍飞机和船舶识别
云起无垠5 小时前
【论文速读】| FirmRCA:面向 ARM 嵌入式固件的后模糊测试分析,并实现高效的基于事件的故障定位
人工智能·自动化
水木流年追梦5 小时前
【python因果库实战10】为何需要因果分析
开发语言·python
m0_675988235 小时前
Leetcode2545:根据第 K 场考试的分数排序
python·算法·leetcode