crownpku / Information-Extraction-Chinese

Chinese Named Entity Recognition with IDCNN/biLSTM+CRF, and Relation Extraction with biGRU+2ATT 中文实体识别与关系提取
2.22k stars 814 forks source link

如果增加一个关系种类,那么如何改进已有代码 #23

Open SuperSaiyanSSS opened 6 years ago

SuperSaiyanSSS commented 6 years ago

前提:用示例数据可以运行成功 在示例数据的12个关系后新增一个关系 我在network.py中将Settings类的num_classes由12改为13 在test_GRU,py中将main_for_evaluation()中的test_settings.num_classesmain(_)中的test_settings.num_classes更改为13 同时original_data中的train.txt/test.txt/relation2id.txt也作了相应更新,增加了新数据和关系 确保是第一次运行initial.py(即之前没有data中之前的npy) 但运行仍然报错如下

Caused by op 'save/Assign_10', defined at:
  File "test_GRU.py", line 339, in <module>
    tf.app.run()
  File "/home/wxw/.conda/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/platform/app.py", line 48, in run
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
  File "test_GRU.py", line 177, in main
    saver = tf.train.Saver(names_to_vars)
  File "/home/wxw/.conda/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/training/saver.py", line 1218, in __init__
    self.build()
  File "/home/wxw/.conda/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/training/saver.py", line 1227, in build
    self._build(self._filename, build_save=True, build_restore=True)
  File "/home/wxw/.conda/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/training/saver.py", line 1263, in _build
    build_save=build_save, build_restore=build_restore)
  File "/home/wxw/.conda/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/training/saver.py", line 751, in _build_internal
    restore_sequentially, reshape)
  File "/home/wxw/.conda/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/training/saver.py", line 439, in _AddRestoreOps
    assign_ops.append(saveable.restore(tensors, shapes))
  File "/home/wxw/.conda/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/training/saver.py", line 160, in restore
    self.op.get_shape().is_fully_defined())
  File "/home/wxw/.conda/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/ops/state_ops.py", line 276, in assign
    validate_shape=validate_shape)
  File "/home/wxw/.conda/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/ops/gen_state_ops.py", line 57, in assign
    use_locking=use_locking, name=name)
  File "/home/wxw/.conda/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 787, in _apply_op_helper
    op_def=op_def)
  File "/home/wxw/.conda/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 2956, in create_op
    op_def=op_def)
  File "/home/wxw/.conda/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1470, in __init__
    self._traceback = self._graph._extract_stack()  # pylint: disable=protected-access

InvalidArgumentError (see above for traceback): Assign requires shapes of both tensors to match. lhs shape= [13] rhs shape= [12]
     [[Node: save/Assign_10 = Assign[T=DT_FLOAT, _class=["loc:@model/bias_d"], use_locking=true, validate_shape=true, _device="/job:localhost/replica:0/task:0/device:CPU:0"](model/bias_d, save/RestoreV2_10)]]

暂时不知道还有哪些需要更改的地方,希望指点一二

crownpku commented 6 years ago

看上去你是没有重新训练模型而直接跑了test?

SuperSaiyanSSS commented 6 years ago

明白了,原来只有到8000步之后才会保存模型。 请问步数多少是否和训练样本数有关?一千多个样本训练了100多步就停止了

qinshimeng18 commented 6 years ago

@SuperSaiyanSSS (epoch*data_num)/big_num(also batch size) = steps

SuperSaiyanSSS commented 6 years ago

非常感谢!

doubaojun commented 6 years ago

@SuperSaiyanSSS 您的问答中“明白了,原来只有到8000步之后才会保存模型。 请问步数多少是否和训练样本数有关?一千多个样本训练了100多步就停止了”,8000步、步数都是什么意思啊?我也是在作者的十二个关系后面添加了一个,也把原来的num_classes = 12中的12改成了13,我的也是报出和你一样的错误,应该怎么做才正确啊?

doubaojun commented 6 years ago

我的这个工程也是这种错误,在原有的12种关系后面直接添加了一种关系,现在也是一样的报错,应该怎么解决啊,急,谢谢各位大佬

SuperSaiyanSSS commented 6 years ago

@dbj0606 1,步数是指循环训练迭代的次数。

2,因为作者发的这个项目的文本原料太少(为了验证方便起见),迭代训练了100多次(由楼上的公式(epoch*data_num)/big_num(also batch size) = steps可得)就停止了。而作者代码则设定了只有在8000次以上才保存模型。

3,因此,你加了一个关系后,100多步训练得到的模型并没有保存,用的模型仍然是作者项目预先训练好的12个关系/8000多步训练的模型。(即model文件夹中原有的模型)。所以,用的模型无法支持13个关系。

4,其实你就算不加第13个关系,按原代码运行,训练的模型也没有保存,用的模型仍然是作者项目预先训练好的12个关系/8000多步训练的模型

5,综上,你加了第13个关系后,要么加语料,让其足够训练到8000步以上,要么把代码里大于8000步保存改成大于100步保存。代码在train_GRU.py的第125行。

doubaojun commented 6 years ago

@SuperSaiyanSSS 好的,明白了,非常感谢您。

qinshimeng18 commented 6 years ago

@SuperSaiyanSSS 老铁有没有想出什么好方法提升准确率和鲁棒性的呢? 我现在想到的有 1 dropout 参数 2 one-hot形式的位置编码(还没太想通为啥随即初始化的向量也可以那么work 3 往数据里面加入噪声 4 人为的定义一些规则?

leolle commented 6 years ago

@SuperSaiyanSSS @crownpku 我也是按照1楼的方法增加了一个类,加了训练数据。我已经在train_GRU.py里面把save model的条件改为了

                    if current_step > 100 and current_step % 10 == 0:
                        print('saving model')

为什么test的时候还是报错啊? InvalidArgumentError (see above for traceback): Assign requires shapes of both tensors to match. lhs shape= [13] rhs shape= [12] [[Node: save/Assign_10 = Assign[T=DT_FLOAT, _class=["loc:@model/bias_d"], use_locking=true, validate_shape=true, _device="/job:localhost/replica:0/task:0/device:GPU:0"](model/bias_d, save/RestoreV2_10/_17)]] [[Node: save/RestoreV2_14/_18 = _SendT=DT_FLOAT, client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_54_save/RestoreV2_14", _device="/job:localhost/replica:0/task:0/device:CPU:0"]]

doubaojun commented 6 years ago

@leolle 因为你没有进行训练,直接进行测试了,需要先进行训练模型的

leolle commented 6 years ago

@AmberCa 我训练了啊

doubaojun commented 6 years ago

@leolle 你的test_GRU.py的main函数中的第一行有没有这么一句话pathname = "./model/ATT_GRU_model-9000",ATT_GRU_model-9000这个是作者原来的训练的模型,你需要改成自己的训练的模型的名字

leolle commented 6 years ago

@AmberCa 谢谢。 该在test_GRU.py里面改:

def main(_):
    pathname = "./model/ATT_GRU_model-190"
    wordembedding = np.load('./data/vec.npy')

只加了7行数据,测试结果看起来还行: 请输入中文句子,格式为 "name1 name2 sentence":中国人寿保险(集团)公司 中国人寿保险股份有限公司 中国人寿保险(集团)公司发起设立中国人寿保险股份有限公司 实体1: 中国人寿保险(集团)公司 实体2: 中国人寿保险股份有限公司 中国人寿保险(集团)公司发起设立中国人寿保险股份有限公司 关系是: No.1: 设立, Probability is 0.45160645 No.2: 合作, Probability is 0.18407393 No.3: 好友, Probability is 0.08524712