jiesutd / LatticeLSTM

Chinese NER using Lattice LSTM. Code for ACL 2018 paper.
1.79k stars 457 forks source link

自己训练的数据集在test时候报错 #13

Closed MrRace closed 6 years ago

MrRace commented 6 years ago

用自己已经标注过的语料做了训练,保存了模型到磁盘。在测试阶段,重新加载模型,然后执行后报错。 报错显示维度不匹配。 错误信息如下:

build batched crf...
Traceback (most recent call last):
  File "main.py", line 442, in <module>
    load_model_decode(model_dir, data, 'test', gpu, seg)
  File "main.py", line 348, in load_model_decode
    model.load_state_dict(torch.load(model_dir),strict=False)
  File "/root/anaconda2/lib/python2.7/site-packages/torch/nn/modules/module.py", line 487, in load_state_dict
    .format(name, own_state[name].size(), param.size()))
RuntimeError: While copying the parameter named lstm.hidden2tag.weight, whose dimensions in the model are torch.Size([9, 200]) and whose dimensions in the checkpoint are torch.Size([7, 200]).

但是训练和测试的时候,网络结构并没有改动,怎么会出现维度失配?还是其他原因?

jiesutd commented 6 years ago

可能是你的测试集的label种类(8-9 个左右?)比训练集的label种类(6-7个左右?)更多。你可以检查一下你的数据。

MrRace commented 6 years ago

@jiesutd 后来我发现可能是因为在status == 'test'的时候数据加载问题。 原来代码先后加载了"dev" data 和“test” data.

data.generate_instance_with_gaz(dev_file,'dev')
load_model_decode(model_dir, data , 'dev', gpu, seg)
data.generate_instance_with_gaz(test_file,'test')
load_model_decode(model_dir, data, 'test', gpu, seg)

当我去掉其中一者,就另一者的测试就可以正常执行。那么,您在代码原文中dev data和test data先后加载,运行时候,没有报错?究竟是为何?

jiesutd commented 6 years ago

我猜测可能和代码没关系,在标准数据集上没有出现这种错误。你得检查你的dev 和 test 数据中是否存在额外的label. 另外建议你用decode model 而不是 test model ,因为后者只是我用来方便看标准数据集结果的。

MrRace commented 6 years ago

@jiesutd (1)如果dev data或者test data存在额外的label,那么单个执行,比如

data.generate_instance_with_gaz(dev_file,'dev')
load_model_decode(model_dir, data , 'dev', gpu, seg)

或者

data.generate_instance_with_gaz(test_file,'test')
load_model_decode(model_dir, data, 'test', gpu, seg)

是会失败吧。但是,上面两种情况,分开执行,都是可以正常执行。只是如果两个代码放一起,先后执行才会出现我上面说的维度不匹配问题。 所以,我觉得如果dev 或者test数据集的标注label类别超出train之外的话,那单个的test或者dev执行也会失败。 (2)之所以用test model,是想对训练的模型,在test和dev数据集上分别评估模型性能。是否我用错了?你提到你用test model来查看标准数据集结果?是指的模型评估还是??可能理解上有偏差。 decode model是用于对新语料的实体抽取吧,如果decode model上采用dev或者test data,是什么的作用??似乎只能看模型的识别结果。还有其他的?

jiesutd commented 6 years ago

1) 到底是否存在额外的label你直接检查你的数据就行了,不用猜测。可能的情况是训练集的label 有 A, B, C 开发集的label 是A, B, D 测试集的label是A, B, E。 这样每种数据的label 都只有三个,但是开发测试合在一起就有4个label. 总之这种猜测没什么意义,你只要检查你的数据就行了。 2)如果你仔细看代码的话, test 的模式和decode的模式是一样的。只不过test 是decode dev/test 两个数据。decode 可以decode 任意数据。