为了我的兴趣,我正在研究不同的物体检测算法。 对象检测slides here的主要参考是 Andrej Karpathy的幻灯片。
我想从一些参考文献开始,特别是允许我直接测试我的数据中提到的一些网络的东西(主要包括汽车和自行车比赛的车载摄像头)。
不幸的是我已经使用了一些预训练的网络(repo forked from JunshengFu one,我稍微调整了Yolo到我的用例),但分类准确性相当差,我想因为没有像F1这样的赛车训练实例。
出于这个原因,我想重新培训网络,这里是我发现问题最多的地方:
正确地训练一些网络需要硬件(功能强大的GPU)或者我没有时间,所以我想知道我是否可以重新训练网络的某些部分,特别是分类网络和 if有任何回购已经允许。提前谢谢
答案 0 :(得分:0)
这称为网络的精细调整或转移学习。基本上你可以为你找到的任何网络(当然有类似的问题域)做到这一点,然后根据你拥有的数据量,你可以微调整个网络或冻结一些层并只训练最后一层。对于您的情况,您可能需要冻结整个网络,除了最后完全连接的层(您将实际替换为新的,满足您的类数),这将执行分类。我不知道您使用的是哪个库,但tensorflow有官方tutorial on transfer-learning。然而,它并不是很清楚。
更多用户友好的教程,您可以在这里找到一些爱好者:tutorial。在这里,您还可以找到代码存储库。您需要进行的一项修正是作者对整个网络执行微调,而如果要冻结某些图层,则需要获取可训练变量的列表并删除要冻结的那些并将结果列表传递给优化器(所以他忽略了删除的变量),如下所示:
all_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,scope='InceptionResnetV2')
to_train = all_vars[-6:] // you better specify them by name explicitely, but this still will work
optimizer = tf.train.AdamOptimizer(lr=0.0001)
train_op = slim.learning.create_train_op(total_loss,optimizer, variables_to_train=to_train)
此外,tensorflow有所谓的模型动物园(一堆训练模型,你可以用于你的目的和转移学习)。你可以找到它here。