Closed fengxyStar closed 4 years ago
感谢您的提问。metric.log中的数据是用来画图的,传给fitlog.add_best_metric()接口才是用来显示到表格中的。这里是由于(1)有时候比较难判断metric中哪个值是需要优化的(而且有时候是越大越好有时候越小越好),所以fitlog没法(因为我懒)实现自动抓取最好的那次记录;(2)有时候记录的时候可能同时存在多个metric(例如即有dev集也有test集的结果),需要按照dev集选择对应epoch的test集的结果。fitlog.add_best_metric()这个接口永远都只选择最近一次输入给它的结果,一个使用例子是
# 我就只写训练循环这部分的代码了
best_dev_acc = -1
for i in range(1, n_epochs):
for x,y in dataset:
# training loop
dev_acc, test_acc = GetEvaluationResult()
fitlog.add_metric(name='dev', value=dev_acc, step=i*num_step_per_epoch, epoch=i)
fitlog.add_metric(name='test', value=test_acc, step=i*num_step_per_epoch, epoch=i)
if best_dev_acc<dev_acc:
fitlog.add_best_metric(name='dev', value=dev_acc)
fitlog.add_best_metric(name='test', value=test_acc) # 这样前端显示的test acc对应的就是dev最佳时的结果
best_dev_acc = dev_acc
感谢您的提问。metric.log中的数据是用来画图的,传给fitlog.add_best_metric()接口才是用来显示到表格中的。这里是由于(1)有时候比较难判断metric中哪个值是需要优化的(而且有时候是越大越好有时候越小越好),所以fitlog没法(~因为我懒~)实现自动抓取最好的那次记录;(2)有时候记录的时候可能同时存在多个metric(例如即有dev集也有test集的结果),需要按照dev集选择对应epoch的test集的结果。fitlog.add_best_metric()这个接口永远都只选择最近一次输入给它的结果,一个使用例子是
# 我就只写训练循环这部分的代码了 best_dev_acc = -1 for i in range(1, n_epochs): for x,y in dataset: # training loop dev_acc, test_acc = GetEvaluationResult() fitlog.add_metric(name='dev', value=dev_acc, step=i*num_step_per_epoch, epoch=i) fitlog.add_metric(name='test', value=test_acc, step=i*num_step_per_epoch, epoch=i) if best_dev_acc<dev_acc: fitlog.add_best_metric(name='dev', value=dev_acc) fitlog.add_best_metric(name='test', value=test_acc) # 这样前端显示的test acc对应的就是dev最佳时的结果 best_dev_acc = dev_acc
感谢回答!我了解为什么表格里没有add_metric记录的数据了,但还有一个问题:如果metric.log中的数据是用来画图的,而且我的metric.log里也有数据,但为什么我点击右上角对比画图选项的时候(我是想实现首页展示的“支持多条log的metric收敛曲线对比”的功能),会出现如下的情况:
- 能选择的指标只有best_map,没有我每一epoch记录的map、topkmap等
2.就算选择best_map进行画图后,还会出现
第一个问题算是功能性失误(我没考虑到有时候某些metric可能会不显示到前端这个场景),就是只能选择暴露在table之中的metric;第二个问题,是之前实现的时候的一个bug,我最近似乎是修复了,您尝试通过pip install git+https://github.com/fastnlp/fitlog 安装最新版试一下。
第一个问题算是功能性失误(我没考虑到有时候某些metric可能会不显示到前端这个场景),就是只能选择暴露在table之中的metric;第二个问题,是之前实现的时候的一个bug,我最近似乎是修复了,您尝试通过pip install git+https://github.com/fastnlp/fitlog 安装最新版试一下。
抱歉前几天服务器网络出了一点问题,没办法安装最新版。刚才安装了最新版本跑一下,但还是会出现上面的第二个问题
你能把你记录metric和best_metric的代码贴一下吗?因为有可能是由于metric和best_metric名称没对齐,不过我不太确定。或者如果你方便的话,你可以把你的log脱敏后上传三条给我。
下面的代码和log都是输出一个metric的情况下(因为我之前的回答中,实验是每个epoch会输出三个metric(一开始的图片),后来怀疑是否是这里有问题,我就改成了每个epoch只输出一个metric,不过发现并不能解决问题。
记录metric和best_mteric的代码如下:
best_map = -1
epochs = 11
for epoch in range(epochs):
# train
# test
results = evaluate_fun() # results为dictionary,存储了多个metric,下面只记录了其中一个
fitlog.add_metric(results['map'], name='map', step=epoch, epoch=epoch)
if best_map < results['map']:
fitlog.add_best_metric(results['map'], name='best_map')
best_map = results['map']
log记录如下: log.zip
表格中显示的记录如下:
嗯,原因是由于你table里面叫best_map但是曲线里面叫map,对应不上。用下面的(把best_map修改为map)
best_map = -1
epochs = 11
for epoch in range(epochs):
# train
# test
results = evaluate_fun() # results为dictionary,存储了多个metric,下面只记录了其中一个
fitlog.add_metric(results['map'], name='map', step=epoch, epoch=epoch)
if best_map < results['map']:
fitlog.add_best_metric(results['map'], name='map') # 修改成map
best_map = results['map']
嗯,原因是由于你table里面叫best_map但是曲线里面叫map,对应不上。用下面的(把best_map修改为map)
best_map = -1 epochs = 11 for epoch in range(epochs): # train # test results = evaluate_fun() # results为dictionary,存储了多个metric,下面只记录了其中一个 fitlog.add_metric(results['map'], name='map', step=epoch, epoch=epoch) if best_map < results['map']: fitlog.add_best_metric(results['map'], name='map') # 修改成map best_map = results['map']
的确是这个问题,非常感谢!!现在可以正常画出metric收敛曲线的图了,辛苦了!
我在代码中使用 fitlog.add_metric(results, name='map', step=epoch)记录每一轮的结果,log.metric中有我记录的数据,但在表格中并没有显示,不知道为什么会出现这个问题