Paddle paddle 序列标注任务的训练高级API model.fit 和 评价指标ChunkEvaluator报错,跟踪源码,疑似是paddle的bug

z9gpfhce  于 2022-04-21  发布在  Java
关注(0)|答案(5)|浏览(212)

代码:
metric = ChunkEvaluator(label_list=label_vocab.keys(), suffix=True)
input_ids = InputSpec((-1, -1), dtype="int64", name="input_ids")
input_token_type = InputSpec((-1, -1), dtype="int64", name="input_token_type")

seq_len = InputSpec((-1, -1), dtype="int64", name="seq_len")

labels = InputSpec((-1, -1), dtype="int64", name="labels")
model = paddle.Model(pre_model, [input_ids, input_token_type], [labels])
model.prepare(optimizer=optimizer, loss=criterion, metrics=metric)
model.fit(train_data=train_loader, eval_data=dev_loader, save_dir=save_dir)

报错:
...
File "/Users/timmike/me/pythonwork/pyproject1/venv/lib/python3.7/site-packages/paddle/hapi/model.py", line 1058, in train_batch
loss = self._adapter.train_batch(inputs, labels)
File "/Users/timmike/me/pythonwork/pyproject1/venv/lib/python3.7/site-packages/paddle/hapi/model.py", line 734, in train_batch
metric_outs = metric.compute(*(to_list(outputs) + labels))
TypeError: compute() missing 1 required positional argument: 'labels'

跟踪:
源码位置
metric_outs = metric.compute(*(to_list(outputs) + labels)) 是一个有两个item的list,

但是ChunkEvaluator.compute()方法是三个参数,具体如下:

compute(self, lengths, predictions, labels, dummy=None):

结论:
要不是我的数据的的输入有问题,要不就是paddle 处理 metric (ChunkEvaluator)的时候,有问题

ctehm74n

ctehm74n1#

您好,我们已经收到了您的问题,会安排技术人员尽快解答您的问题,请耐心等待。请您再次检查是否提供了清晰的问题描述、复现代码、环境&版本、报错信息等。同时,您也可以通过查看官网API文档常见问题历史IssueAI社区来寻求解答。祝您生活愉快~

Hi! We've received your issue and please be patient to get responded. We will arrange technicians to answer your questions as soon as possible. Please make sure that you have posted enough message to demo your request. You may also check out the APIFAQGithub Issue and AI community to get the answer.Have a nice day!

gkl3eglg

gkl3eglg2#

可以先确认一下是否输入了label,报错显示没有传入,可能是把outputs整个当成了lengths参数,labels当成了
predictions参数传到接口里面了

xghobddn

xghobddn3#

可以先确认一下是否输入了label,报错显示没有传入,可能是把outputs整个当成了lengths参数,labels当成了
predictions参数传到接口里面了

labels 确定是输入了。代码也debug到了。
就像您说的,应该是把outputs整个当成了lengths参数,labels当成了predictions参数传到接口里面了。但是怎么解决这个问题?

是不是paddle 框架应该判断,如果是 ChunkEvaluator 类型,需要传入一个length参数,这个length参数,在
model = paddle.Model(pre_model, [input_ids, input_token_type], [labels]),这里试了好多次,不知道怎么传入进去,也报了好多错。

tkclm6bt

tkclm6bt4#

可以先确认一下是否输入了label,报错显示没有传入,可能是把outputs整个当成了lengths参数,labels当成了
predictions参数传到接口里面了

labels 确定是输入了。代码也debug到了。
就像您说的,应该是把outputs整个当成了lengths参数,labels当成了predictions参数传到接口里面了。但是怎么解决这个问题?

是不是paddle 框架应该判断,如果是 ChunkEvaluator 类型,需要传入一个length参数,这个length参数,在
model = paddle.Model(pre_model, [input_ids, input_token_type], [labels]),这里试了好多次,不知道怎么传入进去,也报了好多错。

compute接口传输入的时候不要把outputs当成整个list传进去,分开传进去。
paddle.Model(pre_model, [input_ids, input_token_type], [labels]) 这里把list符号去掉

a0zr77ik

a0zr77ik5#

可以先确认一下是否输入了label,报错显示没有传入,可能是把outputs整个当成了lengths参数,labels当成了
predictions参数传到接口里面了

labels 确定是输入了。代码也debug到了。
就像您说的,应该是把outputs整个当成了lengths参数,labels当成了predictions参数传到接口里面了。但是怎么解决这个问题?
是不是paddle 框架应该判断,如果是 ChunkEvaluator 类型,需要传入一个length参数,这个length参数,在
model = paddle.Model(pre_model, [input_ids, input_token_type], [labels]),这里试了好多次,不知道怎么传入进去,也报了好多错。

compute接口传输入的时候不要把outputs当成整个list传进去,分开传进去。
paddle.Model(pre_model, [input_ids, input_token_type], [labels]) 这里把list符号去掉

大神,您好。

paddle.Model 类的 init 方法,系统定义只支持三个参数,分别是 network,inputs,labels ,源码如下:
definit(self, network, inputs=None, labels=None):

如果把list 符号去掉,init 方法,只能接收 pre_model , input_ids 和 input_toke_type 三个参数,labels参数接收不到,系统报错。
TypeError:init() takes from 2 to 4 positional arguments but 5 were given。

在 padele.hapi.modey.py 文件中 734行调用了compute 方法,大概如下:

metric_outs = metric.compute(*(to_list(outputs) + labels))

这个方法 框架已经写死了,没法改...

相关问题