翻译:Tensorflow 2 过拟合与欠拟合

翻译:Tensorflow 2 过拟合与欠拟合

拟合

数据拟合又称曲线拟合,俗称拉曲线,是一种把现有数据透过数学方法来代入一条数式的表示方式。科学和工程问题可以通过诸如采样、实验等方法获得若干离散的数据,根据这些数据,我们往往希望得到一个连续的函数(也就是曲线)或者更加密集的离散方程与已知数据相吻合,这过程就叫做拟合(fitting)。

数据拟合概述图

过拟合和欠拟合

在之前的分类文本(classifying text)和预测燃料效率(predicting fuel efficiency)的例子中,我们看到我们的模型在验证数据上的准确性会在经过几个 Epoch 的训练后达到顶峰,然后会停滞不前或开始下降。

换句话说,我们的模型会过度拟合训练数据。学习如何处理过拟合很重要。尽管在训练集上获得高精度是可能的,但我们真正想要的是,开发一个能够很好地推广到测试集(或模型没有见过的数据)的模型。

过拟合的反义词是欠拟合。当测试数据仍有改进空间时,就会出现拟合不足。出现这种情况的原因有很多:模型不够强大、过于标准化,或者只是训练的时间不够长。这意味着神经网络没有(完全)学习到训练数据中的模式。

但是,如果训练时间过长,模型就会开始过度适应,从训练数据中学习到那些不能适应到测试数据中的特征。我们需要找到一个平衡点。在下面的探索中,我们将理解如何训练一个适当数量的 Epoch 。

为了防止过拟合,最好的解决方案是使用更完整的训练数据。数据集应该涵盖我们期望让模型进行处理的所有输入情况。其他额外的数据可能只有在涉及新的情况时才有用。

在更完整的数据上训练的模型自然会拟合得更好。在我们不能再完善数据集的情况下,下一个最好的解决方案是使用正则化之类的技术。这些限制了模型可以存储的信息的数量和类型。如果一个网络只能记住少量的识别模式,那么优化过程将迫使它专注于那些最突出的模式,这些模式具有更好的推广机会。

我的理解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是基于TensorFlow欠拟合过拟合Python示例: 首先,我们需要导入必要的库和数据集: ```python import tensorflow as tf from tensorflow import keras import numpy as np # 加载数据集 (x_train, y_train), (x_test, y_test) = keras.datasets.boston_housing.load_data(seed=42) ``` 接下来,我们需要对数据进行预处理: ```python # 标准化数据 mean = x_train.mean(axis=0) std = x_train.std(axis=0) x_train = (x_train - mean) / std x_test = (x_test - mean) / std ``` 然后,我们可以定义一个函数来构建模型: ```python def build_model(): model = keras.Sequential([ keras.layers.Dense(64, activation='relu', input_shape=(x_train.shape[1],)), keras.layers.Dense(64, activation='relu'), keras.layers.Dense(1) ]) optimizer = tf.keras.optimizers.RMSprop(0.001) model.compile(loss='mse', optimizer=optimizer, metrics=['mae']) return model ``` 接下来,我们可以训练模型并绘制训练和验证的损失曲线: ```python # 构建模型 model = build_model() # 训练模型 history = model.fit(x_train, y_train, epochs=500, validation_split=0.2, verbose=0) # 绘制训练和验证的损失曲线 import matplotlib.pyplot as plt def plot_history(history): plt.figure() plt.xlabel('Epoch') plt.ylabel('Mean Abs Error [$1000]') plt.plot(history.epoch, np.array(history.history['mae']), label='Train Loss') plt.plot(history.epoch, np.array(history.history['val_mae']), label = 'Val loss') plt.legend() plt.ylim([0,5]) plt.show() plot_history(history) ``` 最后,我们可以使用测试集评估模型的性能: ```python # 使用测试集评估模型的性能 test_loss, test_mae = model.evaluate(x_test, y_test, verbose=0) print('Test MAE: ${:,.2f}'.format(test_mae * 1000)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kuku123465

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值