tensorflow - 如果学习曲线显示验证误差低于训练误差,预测是否可信?
问题描述
我正在使用神经网络 (NN) 作为我的地球物理学论文的一部分,并且正在使用 TensorFlow 和 Keras 来训练我的网络。
我目前的任务是使用神经网络来近似热力学模型,即非线性回归问题。它采用 13 个输入参数并输出 450 个参数的速度剖面(速度与深度)。我的数据包含 100,000 个合成示例(即不存在噪声),分为训练(80k)、验证(10k)和测试(10k)。
我已经针对许多不同的架构测试了我的网络:更宽(5-800 个神经元)和更深(最多 10 层)、不同的学习率和批量大小,甚至针对多个 epoch(5000)。基本上所有标准的交易技巧......
但是,我对学习曲线显示的验证误差低于训练误差(对于我的所有测试)这一事实感到困惑,而且我从来没有能够过度拟合训练数据。见下图:
测试集上的误差相对较低,因此网络似乎能够做出不错的预测。似乎一个包含 50 个神经元的隐藏层就足够了。但是,由于学习曲线的行为,我不确定我是否可以相信这些结果。我认为这可能是由于验证集包含“容易”预测的示例,但我不知道应该如何更改它。也许更大的验证集?
总结一下:如果验证误差低于或非常接近训练误差,是否一定是一个坏信号?如果用所述网络做出的预测是不错的呢?
对于我的问题和数据,是否有可能根本不可能过度拟合?
解决方案
除了尝试更高的 k 倍数和额外的测试保留样本之外,可能在从原始数据集采样时将其混淆:在划分训练集和验证/测试集时选择分层样本。然后在不分层抽样的情况下划分验证集和测试集。
我的观点是,如果您在建模方法中引入更多变化(不违反任何“统计规则”),您可以对您创建的模型更有信心。
推荐阅读
- php - 根据条件在查询中设置参数
- sql - 当在不同的表上满足条件时,如何触发对表中值的更新?
- file - 无法在 Ansible 中从 include_vars 文件中构造和读取数据
- reactjs - 在 react-router 中使用 history.push() 传递道具时出现问题
- vulkan - 使用具有多个 VkRenderPass 的相同 VkPipeline
- android - 为什么我的 AutoCompleteTextView 的下拉列表仅在某些列表宽度下被键盘遮挡?
- php - Laravel - 获取网站唯一访问者数量
- angularjs - 如何在 angular-google-maps 2.2.1 中使用谷歌地图 API_KEY
- c - 在构建可执行文件时涉及 .so 库时对错误的未定义引用
- node.js - User.findOneAndUpdate 不返回更新的用户对象