Closed MrRace closed 6 years ago
可能是你的测试集的label种类(8-9 个左右?)比训练集的label种类(6-7个左右?)更多。你可以检查一下你的数据。
@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先后加载,运行时候,没有报错?究竟是为何?
我猜测可能和代码没关系,在标准数据集上没有出现这种错误。你得检查你的dev 和 test 数据中是否存在额外的label. 另外建议你用decode
model 而不是 test
model ,因为后者只是我用来方便看标准数据集结果的。
@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,是什么的作用??似乎只能看模型的识别结果。还有其他的?
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 任意数据。
用自己已经标注过的语料做了训练,保存了模型到磁盘。在测试阶段,重新加载模型,然后执行后报错。 报错显示维度不匹配。 错误信息如下:
但是训练和测试的时候,网络结构并没有改动,怎么会出现维度失配?还是其他原因?