machine-learning - Tensorflow Inception 模型再训练,为什么不向 SVM 提供瓶颈?
问题描述
在初始模型上进行“迁移学习”或“再训练”的常用方法是从模型中获取瓶颈层,将瓶颈张量压缩为平坦的 2048 个神经元层,然后添加一个神经元数量与要分类的类别数量(最终是 softmax)。
我的问题是:将这个瓶颈层训练为神经元网络,为什么不将这些高度抽象的 2048 特征提供给 SVM,这可能会获得更好的结果?
非常感谢!
解决方案
如今的趋势是执行端到端学习,而不是让模型学习一些抽象表示,然后将该表示提供给其他模型(例如 SVM)。
这种趋势背后的直觉如下:如果你A
在某个子任务上优化一个S1
模型,B
在另一个子任务上优化一个模型S2
,这两个模型都会收敛到某个局部最优解。与通过优化完整任务获得的最优值相比,预计这两个局部最优值的组合是次优的S = (S1 + S2)
。在端到端优化模型时,您可以一起调整模型的所有部分以更好地解决任务。但是,当您拆分模型并分别训练其不同部分时,您会破坏各部分之间的直接信号,并且难以为改善模型A
结果的特定任务改善模型的输出B
因为您没有直接的方法来优化这两个模型。
你的建议在过去很受欢迎。例如,Girshick 的原始RCNN论文使用预训练的卷积神经网络来提取特征,然后将这些特征馈送到 SVM 进行分类。
然而,这种方法在 R-CNN 的下一个迭代中被放弃了,Fast RCNN,SVM 步骤被 softmax 取代。在Fast R-CNN的表 8 第 5.4 节中,作者将同一模型与 SVM 与 softmax 进行了比较,他们得出的结论是 softmax 略微优于 SVM 版本。
推荐阅读
- powershell - 仅运行选定的命令/行
- android - Android Studio 无法解析 MapView 类
- go - 如何在 Go 中导入和构建一组本地模块
- javascript - 如何在 JS 中“重置”整个脚本?
- database - IBM DB2 PIVOT 一个完整的日期表
- javascript - 如何在javascript中将标题/键添加到多个对象的数组中?
- java - Spring Boot 相当于 Dropwizard 命令?
- java - 将枚举转换为字符串时的奇怪行为
- sqlite - 按第一个非空列排序 sql 查询结果
- reactjs - image 和 h4 元素在 React Material UI 中没有并排出现