感谢Google提供了与TensorFlow API一起使用的几个预先训练好的模型。
我想知道如何通过向模型添加新类别来重新训练上述存储库中提供的预训练模型。 例如,经过训练的COCO数据集模型有90个类别,我想添加1或2个类别到现有模型中,并得到一个92个类别的目标检测模型。
本地运行是该存储库提供的,但它会完全替换这些预训练类别为新训练的类别。只有train和eval被提及。
所以,还有其他方法重新训练模型并获得92个类别的结果吗?
感谢Google提供了与TensorFlow API一起使用的几个预先训练好的模型。
我想知道如何通过向模型添加新类别来重新训练上述存储库中提供的预训练模型。 例如,经过训练的COCO数据集模型有90个类别,我想添加1或2个类别到现有模型中,并得到一个92个类别的目标检测模型。
本地运行是该存储库提供的,但它会完全替换这些预训练类别为新训练的类别。只有train和eval被提及。
所以,还有其他方法重新训练模型并获得92个类别的结果吗?
问题:如何向已经训练好的网络添加更多类别?
具体来说,我们想保持所有网络不变,只更改新类别的输出。这意味着对于像ResNet这样的网络,我们想保留除最后一层之外的所有内容,并以某种方式扩展最后一层以包含新的类别。
答案:将现有的最后一层与您训练的新层合并
具体来说,我们将用足够大的全连接层替换最后一层,以容纳您的新类别和旧类别。使用随机权重进行初始化,然后在您的类别和其他少量类别上进行训练。训练完成后,将原始最后一个全连接层的权重复制到您新训练的全连接层中。
例如,如果先前的最后一层是1024x90矩阵,而您的新最后一层是1024x92矩阵,则将1024x90复制到新的1024x92相应位置。这将破坏性地替换所有旧类别的训练,但保留您新类别的训练。这很好,因为您可能没有使用相同数量的旧类别进行训练。如果有偏差,则同样处理。
你的最终网络只有1024x2个新权重值(加上任何偏置),对应于你的新类别。 需要注意的是,虽然这种方法训练速度快,能够快速得到结果,但它的表现不如在全面的数据集上重新训练。 尽管如此,它仍然可以很好地工作 ;)