python - 关于 Keras/Tensorflow 中超参数调优的问题
问题描述
最近在研究深度学习,主要是靠Andrew Ng在Coursera上的Deep Learning Specialization。
我想建立自己的模型,MNIST
以 99% 的准确率进行分类(简单的 MLP 模型,而不是 CNN)。所以我KerasClassifier
用来包装我的模型并GridsearchCV
用来微调超参数(包括隐藏层数、单元数、辍学率等)
然而,当我谷歌“微调”时,大部分结果主要是关于“迁移学习”,它只是调整学习率、输出层数或冻结层数。
我知道这些著名的模型只需稍加改动就能解决许多问题。但是,如果我想从头开始构建一个小型模型来处理一个特殊问题,那么常见/最佳实践是什么?
所以我的问题主要是关于微调模型的常见/最佳实践:
- 微调的常用/最佳方法是什么?(我见过人们手动调整超参数,或使用 scikit-learn 的
RandomizedSearchCV
/GridSearchCV
或hyperas
) - 我应该使用 k 折交叉验证吗?(因为它是默认的集合
GridSearchCV
,它极大地增加了训练时间但帮助不大) - 对现成的模型稍加修改就足以解决大多数问题吗?如果不是,我应该往哪个方向前进?
谢谢!
解决方案
在深度学习中,微调通常是指根据来自新领域的数据重新训练预训练模型的某些层。我相信您正在寻找诸如“超参数优化”之类的东西。有多种方法可以解决这个问题。人们对最佳方法有自己的偏好。使用 RandomizedSearchCV/GridSearch CV 或两者的组合都可以。使用一些配置进行试验和错误是可以的。人们有时会完全重新训练众所周知的架构。其他人采用更复杂的方法,例如使用进化编程(遗传算法)优化超参数。所以你有点被宠坏了。
通常只有在您的数据集较小时才需要交叉验证,并且进一步拆分为训练集和测试集会减小测试集的大小,从而降低结果的统计显着性(可靠性)。如果你有足够的数据,你可以继续,只是分成训练/验证/测试集。但它通常是必要的,因为大量标记数据往往很少见。
如果现成的模型可用于您要解决的问题,请使用它们!虽然熟悉实现和源代码很有见地,但无需重新发明轮子并重写这些解决方案!
推荐阅读
- scala - 在 scala 2.13+ / 3.x 中,我们如何解决抽象类型的菱形继承问题?
- javascript - 使用 Heroku 托管 API 在 MongoDB 上保存数据
- python-3.x - PyQt5 动态更新 QGridLayout 的内容
- python - 如何在控制台上打印更新加载栏?
- java - 在java中生成json文件。代码正在运行。需要一些修改帮助
- reactjs - 当我单击自定义列渲染中的按钮时,反应材料表失去其排序状态(任何状态更新都会导致此问题)
- c - C中的N体模拟
- security - 如何检测作弊引擎?
- flutter - 如何在 FLUTTER 中将设备置于静音状态?
- javascript - 如何使用 js 或 jquery 在两个 css 文件之间切换?