在使用ernie-1.0模型时因为我的数据文本太长,我需要增加max_seq_len长度,但修改时发现只要不是512这个数就会报错,错误日志如下:
ValueError: (InvalidArgument) Variable value (input) of OP(fluid.layers.embedding) expected >= 0 and < 513, but got 513. Please check input value.
[Hint: Expected ids[i] < row_number, but received ids[i]:513 >= row_number:513.] (at /home/Paddle/paddle/fluid/operators/lookup_table_v2_op.h:77)
[operator < lookup_table_v2 > error]
代码如下:
def convert_example(example, tokenizer, label_vocab, no_entity_id, max_seq_len):
tokens, labels = example
tokenized_input = tokenizer(tokens, return_length=True, is_split_into_words=True, max_seq_len=max_seq_len)
if len(tokenized_input['input_ids']) - 2 < len(labels):
labels = labels[:len(tokenized_input['input_ids']) - 2]
labels = ['O'] + labels + ['O']
tokenized_input['labels'] = [label_vocab[x] for x in labels]
return tokenized_input['input_ids'], tokenized_input['token_type_ids'], tokenized_input['seq_len'], tokenized_input['labels']
max_seq_len最长只支持512。是因为bert预训练模型就只支持512,你可以通过自定义模型和数据读取的办法训练更长的数据。或者沿用预训练模型,但对输入进行切分。注意的是,512是论文中为了平衡效率和性能,并没有特别的理论证明。
好的,十分感谢,处理方法我了解了,我再问个问题哈,如果只是512个文本,那么前后文关系模型该如何识别呢? 比如我这个数据中前面512的文本有信息影响了后面512的文本信息,这种会不会导致存在部分结果的错误隐患。
影响肯定会有一点,但是不会太多,首先512是作者实验的结果,其次,你想本来训练的数据最长就是512,你非要塞1024进去。模型肯定也只能学到两个512的特征。但是有个改进办法,你搞个512的滑窗,在你的数据上滑一遍然后求平均。当然最好就是自己重新训练。