当前位置: 首页 > article >正文

用 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


http://www.kler.cn/a/419501.html

相关文章:

  • 深入解析 Kubernetes 节点操作:Cordon、Uncordon 和 Drain 的使用与最佳实践
  • 龙蜥 Linux 安装 JDK
  • Vue中实现函数限流:节流和防抖
  • 0017. shell命令--tac
  • 基础(函数、枚举)错题汇总
  • 论文笔记(五十七)Diffusion Model Predictive Control
  • ArcGIS对地区进行筛选提取及投影转换
  • Elasticsearch 的存储与查询
  • 数据科学家创建识别假图像的工具
  • 【Go 基础】channel
  • Qt窗口的闪烁QWebEngineView
  • 按vue组件实例类型实现非侵入式国际化多语言翻译
  • 美畅物联丨如何通过 FFmpeg 解码视频
  • STM32 HAL库开发学习5. 系统滴答定时器
  • Linux HTTP代理Squid 基本变更配置及目标白名单方式限制转发
  • Flutter 之 InheritedWidget
  • 【大模型】ChatGPT 提示词优化进阶操作实战详解
  • 新能源,半导体,医药生物等高科技企业如何高效、安全、智能管理文件数据
  • 汽车IVI中控开发入门及进阶(三十五):架构QML App Architecture Best Practices
  • Docker Buildx 与 CNB 多平台构建实践
  • 无人机地面遥控遥测技术与算法概述!
  • 文库 | 从嬴图的技术文档聊起
  • 网络性能四大关键指标:带宽、时延、抖动和丢包率
  • vue项目中单独文件的js不存在this.$store?.state怎么办
  • 在RockyLinux9.4上安装Microk8s
  • Neo4j启动时指定JDK版本