我在Keras中有一个对象检测模型,希望根据验证集上计算的平均精度(mAP)来监控我的训练。在
我已经将tensorflow-models中的代码移植到使用提供的模型和数据运行评估的脚本中。但它不是作为Keras度量来实现的,而是作为一个独立类来实现的:
evaluation = SSDEvaluation(model, data, data_size)
mAP = evaluation.evaluate()
我完全接受这样的生活。事实上,我不希望在培训批次中计算它,因为它会减慢培训的速度。在
我的问题是:如何根据在每个epoch之后计算的度量重用ReduceLROnPlateau
和{
您可以使用更新^{cd1>}对象的LambdaCallback来完成此操作:
假设您的
evaluation.evaluate()
返回一个类似{'val/mAP': value}
的字典,您可以这样做:这里的技巧是
^{pr2}$logs
将进一步传递给其他回调,因此它们可以直接访问该值:它将自动出现在
CSVLogger
和任何其他回调中。但是请注意,eval_callback
必须在使用回调列表中的值的任何回调之前:我不确定什么是
SSDEvaluation
,但是如果没有开销的任何平均预精度计算是可以接受的,我建议使用keras callbacks的以下方法。在您希望oto使用两个callbacl-}值。它们从method的
EarlyStopping
和ReduceLROnPlateau
-它们都作用于epoch结束并监视loss
或{logs
参数获得此值-将实际的映射发送到日志值,我们强制此方法和从日志中获取精度值的所有回调使用它。Callbcaks从这里选择值(thisineinthecode-early stopping,thisone表示Reduce LR)。
所以,我们应该为两个回调“伪造”日志。我想这不是理想的,但有效的解决方案。在
这些类继承回调并计算map值,同时避免通过共享对象
^{pr2}$Hub
重新计算map。在-它只是共享映射值的枢纽。可能会引起一些副作用。你可以尽量避免使用它。在
-此函数计算并共享地图
-NB不要在构造函数中使用
monitor
参数!您应该使用'acc',参数已设置为正确的值。在一些测试:
-一个简单的“测试套件”。现在去试穿:
好吧,看来至少早一点就可以了。我想,
ReduceLROnPlateau
到,因为它们使用相同的日志和相似的逻辑-如果设置了适当的参数。在如果您不想使用sklearn函数,但是
SSDEvaluation
(我就是找不到它是什么)——tou可以很容易地采用on_epoch_method
函数来处理这个求值函数。在希望有帮助。在
相关问题 更多 >
编程相关推荐