用 Python 从零开始创建神经网络(十二):验证数据(Validation Data)

验证数据(Validation Data)

引言

在优化章节中,我们使用超参数调优来选择能够带来更好结果的超参数,但还有一个问题需要澄清:我们不应该使用测试数据集来检查不同的超参数。如果这样做,我们实际上是在将模型手动优化到测试数据集上,从而使模型偏向于对这些数据过拟合,而测试数据集本应仅用于最终检查模型是否训练和泛化得当。换句话说,如果我们调整网络的参数以适配测试数据,那么本质上就是在测试数据上优化网络,这是一种过拟合测试数据的方式。

因此,使用测试数据集进行超参数调优是一个错误。测试数据集应仅作为未见过的数据,不应该以任何方式影响模型(超参数调优正是这样的一种影响),测试数据集的唯一用途是评估性能。

超参数调优可以通过另一个被称为验证数据集的数据集来完成。测试数据集需要包含真实的样本外数据,但对于验证数据集,我们在选择数据时有更多的自由。如果我们有大量的训练数据,并且可以分出一部分用于验证,那么我们可以将其视为样本外数据,类似于测试数据集。现在,我们可以使用这个新的验证数据集来寻找最佳参数,并在最后使用测试数据集来测试模型,看是否真的调整了模型,还是只是让模型对验证数据过拟合。

在某些情况下,我们可能会面临数据不足的问题,无法从训练数据中再创建一个新的数据集。在这些情况下,我们有两个选择:

第一个选择是临时将训练数据分成一个较小的训练数据集和验证数据集,用于超参数调优。之后,使用最终确定的超参数集在所有训练数据上训练模型。由于我们是根据从训练数据中分出的一部分验证数据来调整模型的,所以允许这样做。需要记住的是,我们仍然保留一个测试数据集,用于在训练后检查模型的性能。

第二种选择是在数据不足时使用一种称为交叉验证的过程。交叉验证主要用于训练数据集很小,无法分出数据用于验证的情况。其工作原理是将训练数据集分成若干部分,例如5份。然后,我们在前4份数据上训练模型,在最后一份数据上验证。到目前为止,这与前面描述的情况类似——我们也只是使用了训练数据集,并且可以在未用于训练的数据上验证。然而,交叉验证的不同之处在于我们随后会交换样本。例如,如果我们有5份数据,可以称为A、B、C、D和E。我们可能首先在A、B、

### 如何用Python从头构建和训练AI模型 要使用 Python 从零开始构建和训练 AI 模型,可以从以下几个方面入手: #### 1. 基础环境搭建 为了构建和训练神经网络模型,通常需要安装一些必要的库。例如 TensorFlow 或 PyTorch 是常用的深度学习框架。可以通过以下命令安装这些工具: ```bash pip install tensorflow numpy matplotlib scikit-learn ``` 这一步骤提供了基础支持,使得后续能够定义、编译以及训练模型。 #### 2. 数据准备 任何机器学习项目的核心都是数据。假设我们要解决的是一个简单的二分类问题(如区分猫和狗),可以按照如下方式加载数据[^1]: ```python import tensorflow as tf from tensorflow.keras.utils import image_dataset_from_directory data_dir = 'path_to_your_data' train_ds = image_dataset_from_directory( data_dir, validation_split=0.2, subset="training", seed=123, image_size=(180, 180), batch_size=32) val_ds = image_dataset_from_directory( data_dir, validation_split=0.2, subset="validation", seed=123, image_size=(180, 180), batch_size=32) ``` 上述代码展示了如何利用 `image_dataset_from_directory` 函数快速创建训练验证。 #### 3. 构建模型结构 接着定义模型架构。对于初学者来说,可以选择简单但有效的多层感知机 (MLP) 或卷积神经网络 (CNN),后者更适合图像处理任务。下面是一个 CNN 的例子: ```python from tensorflow import keras from tensorflow.keras import layers model = keras.Sequential([ layers.Rescaling(1./255, input_shape=(180, 180, 3)), layers.Conv2D(16, 3, padding='same', activation='relu'), layers.MaxPooling2D(), layers.Conv2D(32, 3, padding='same', activation='relu'), layers.MaxPooling2D(), layers.Conv2D(64, 3, padding='same', activation='relu'), layers.MaxPooling2D(), layers.Flatten(), layers.Dense(128, activation='relu'), layers.Dense(1) ]) ``` 此部分描述了一个典型的 CNN 结构,其中包含了多个卷积层和池化操作以提取特征,并最终通过全连接层完成分类任务。 #### 4. 编译模型 在实际运行之前还需指定损失函数、优化器以及其他超参数设置。以下是常见的配置方法: ```python model.compile(optimizer='adam', loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=['accuracy']) ``` 此处选择了 Adam 作为优化算法,因为它具有良好的收敛性能;而 Binary Cross Entropy 则适用于两类别之间的概率估计。 #### 5. 训练过程 最后进入正式的训练阶段。调用 fit 方法即可启动整个流程: ```python epochs = 10 history = model.fit( train_ds, validation_data=val_ds, epochs=epochs ) ``` 这段脚本会迭代给定次数(epoch数),每次更新权重直至达到最佳状态或者满足停止条件为止。 #### 6. 测试与部署 经过充分训练之后,应该对新样本进行预测检验其泛化能力。同时也可以考虑保存当前版本以便日后重复使用或进一步改进[^2]: ```python model.save('saved_model/my_model') new_model = tf.keras.models.load_model('saved_model/my_model') ``` 以上就是完整的基于 Python 和 Tensorflow 实现的人工智能模型开发路径概述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值