buppt / ChineseNER

中文命名实体识别,实体抽取,tensorflow,pytorch,BiLSTM+CRF
1.39k stars 394 forks source link

train.py中的预训练向量没加载成功,而全部加载的是111111111111 #27

Open wujixian opened 5 years ago

wujixian commented 5 years ago

tensorflow版本的tran.py文件在加载预训练向量的时候,原始的是word2id找到的是id,而不是字,word2vec里的词向量都是以字为主的,所以word2id应该改成id2word. 如果不改的话 也是能用的,不过embedding_pre全部是111111111,而不是vec.txt里的字向量。建议楼主改下这个坑,很难发现的。

buppt commented 5 years ago

遍历的是 word2id 中的 key 值,也就是 word,感觉没有错呢?

wujixian commented 5 years ago

遍历的是 word2id 中的 key 值,也就是 word,感觉没有错呢?

for word in word2id: if word2vec.has_key(word): embedding_pre.append(word2vec[word]) else: embedding_pre.append(unknow_pre) 你这边的code for word in word2id:不是取得是value吗?value是id,id是数字啊 而 word2vec.has_key(word):取得是key key 是word value是vector。所以 一个是数字 一个是字, 两个永远不会相等的呀,一直执行的是else,而unknow_pre是填充的1111111, 最总就导致embedding_pre全是1111

buppt commented 5 years ago

遍历的是 word2id 中的 key 值,也就是 word,感觉没有错呢?

for word in word2id: if word2vec.has_key(word): embedding_pre.append(word2vec[word]) else: embedding_pre.append(unknow_pre) 你这边的code for word in word2id:不是取得是value吗?value是id,id是数字啊 而 word2vec.has_key(word):取得是key key 是word value是vector。所以 一个是数字 一个是字, 两个永远不会相等的呀,一直执行的是else,而unknow_pre是填充的1111111, 最总就导致embedding_pre全是1111

py2 for in 遍历的是 key 啊,难道 py3 不是?

wujixian commented 5 years ago

遍历的是 word2id 中的 key 值,也就是 word,感觉没有错呢?

for word in word2id: if word2vec.has_key(word): embedding_pre.append(word2vec[word]) else: embedding_pre.append(unknow_pre) 你这边的code for word in word2id:不是取得是value吗?value是id,id是数字啊 而 word2vec.has_key(word):取得是key key 是word value是vector。所以 一个是数字 一个是字, 两个永远不会相等的呀,一直执行的是else,而unknow_pre是填充的1111111, 最总就导致embedding_pre全是1111

py2 for in 遍历的是 key 啊,难道 py3 不是?

wujixian commented 5 years ago

遍历的是 word2id 中的 key 值,也就是 word,感觉没有错呢?

for word in word2id: if word2vec.has_key(word): embedding_pre.append(word2vec[word]) else: embedding_pre.append(unknow_pre) 你这边的code for word in word2id:不是取得是value吗?value是id,id是数字啊 而 word2vec.has_key(word):取得是key key 是word value是vector。所以 一个是数字 一个是字, 两个永远不会相等的呀,一直执行的是else,而unknow_pre是填充的1111111, 最总就导致embedding_pre全是1111

py2 for in 遍历的是 key 啊,难道 py3 不是?

额,py3 是value。不是key,好吧,怪不得那 ,我确实改成py3了。

Dcatefate commented 5 years ago

has.key()这个函数不存在了吧,后来怎么改的,我也遇见了embedding_pre全是1111

wujixian commented 5 years ago

has.key()这个函数不存在了吧,后来怎么改的,我也遇见了embedding_pre全是1111

for word in id2word:
    # if word2vec.has_key(word):
    if word in bert_vector:
        embedding_pre.append(bert_vector[word])
    else:
        embedding_pre.append(unknow_pre)

改成这样就好了

wujixian commented 5 years ago

has.key()这个函数不存在了吧,后来怎么改的,我也遇见了embedding_pre全是1111

for word in id2word:
    # if word2vec.has_key(word):
    if word in bert_vector:
        embedding_pre.append(bert_vector[word])
    else:
        embedding_pre.append(unknow_pre)

改成这样就好了

记得把bert_vector替换成word2vec。我后来用了bert的词向量,改了code 忘记改回来了!你改一下把

flybesty commented 5 years ago

运行python train.py,报错:No such file or directory: '../data/renmindata.pkl',创建renmindata.pkl再运行python train.py,报错: File "train.py", line 18, in word2id = pickle.load(inp) EOFError: Ran out of input 菜鸟一个,请教

wujixian commented 5 years ago

运行python train.py,报错:No such file or directory: '../data/renmindata.pkl',创建renmindata.pkl再运行python train.py,报错: File "train.py", line 18, in word2id = pickle.load(inp) EOFError: Ran out of input 菜鸟一个,请教

renmindata.pkl是要用数据创建的,不是你创建的名字相同的就完事了 ,renmindata.pkl这个文件存放的是所有你的数据。你得先生成renmindata.pkl文件 ,才能进行训练。

Rainysunnyday commented 4 years ago

运行python train.py,报错:No such file or directory: '../data/renmindata.pkl',创建renmindata.pkl再运行python train.py,报错: File "train.py", line 18, in word2id = pickle.load(inp) EOFError: Ran out of input 菜鸟一个,请教

renmindata.pkl是要用数据创建的,不是你创建的名字相同的就完事了 ,renmindata.pkl这个文件存放的是所有你的数据。你得先生成renmindata.pkl文件 ,才能进行训练。

咋生成啊0.0

wujixian commented 4 years ago

运行python train.py,报错:No such file or directory: '../data/renmindata.pkl',创建renmindata.pkl再运行python train.py,报错: File "train.py", line 18, in word2id = pickle.load(inp) EOFError: Ran out of input 菜鸟一个,请教

renmindata.pkl是要用数据创建的,不是你创建的名字相同的就完事了 ,renmindata.pkl这个文件存放的是所有你的数据。你得先生成renmindata.pkl文件 ,才能进行训练。

咋生成啊0.0

运行ChineseNER-master\data\renMinRiBao\data_renmin_word.py文件 就能生成renmindata.pkl

Rainysunnyday commented 4 years ago

运行python train.py,报错:No such file or directory: '../data/renmindata.pkl',创建renmindata.pkl再运行python train.py,报错: File "train.py", line 18, in word2id = pickle.load(inp) EOFError: Ran out of input 菜鸟一个,请教

renmindata.pkl是要用数据创建的,不是你创建的名字相同的就完事了 ,renmindata.pkl这个文件存放的是所有你的数据。你得先生成renmindata.pkl文件 ,才能进行训练。

咋生成啊0.0

运行python train.py,报错:No such file or directory: '../data/renmindata.pkl',创建renmindata.pkl再运行python train.py,报错: File "train.py", line 18, in word2id = pickle.load(inp) EOFError: Ran out of input 菜鸟一个,请教

renmindata.pkl是要用数据创建的,不是你创建的名字相同的就完事了 ,renmindata.pkl这个文件存放的是所有你的数据。你得先生成renmindata.pkl文件 ,才能进行训练。

咋生成啊0.0

运行ChineseNER-master\data\renMinRiBao\data_renmin_word.py文件 就能生成renmindata.pkl

啊哦,知道了0.0,蟹蟹~

Rainysunnyday commented 4 years ago

还有个问题,就是tenserflow2.0里面没有contrib了要怎么办啊,运行train.py pretrained的时候一直报错:AttributeERROR:'module' object has no attribute 'contrib'。

wujixian commented 4 years ago

还有个问题,就是tenserflow2.0里面没有contrib了要怎么办啊,运行train.py pretrained的时候一直报错:AttributeERROR:'module' object has no attribute 'contrib'。

1.0 和2.0是不兼容的,他这个是1.0的版本 ,你要么换成1.0的 要么把代码改动一下适应2.0

Rainysunnyday commented 4 years ago

还有个问题,就是tenserflow2.0里面没有contrib了要怎么办啊,运行train.py pretrained的时候一直报错:AttributeERROR:'module' object has no attribute 'contrib'。

1.0 和2.0是不兼容的,他这个是1.0的版本 ,你要么换成1.0的 要么把代码改动一下适应2.0

好的吧,我改成1.7.0的了,谢谢你~

chmaojian commented 4 years ago

tensorflow版本的tran.py文件在加载预训练向量的时候,原始的是word2id找到的是id,而不是字,word2vec里的词向量都是以字为主的,所以word2id应该改成id2word. 如果不改的话 也是能用的,不过embedding_pre全部是111111111,而不是vec.txt里的字向量。建议楼主改下这个坑,很难发现的。

您好,发现在bilstm-crf模型中,词向量是随机生成的,没有用的训练好的词向量(vec.txt)

wujixian commented 4 years ago

tensorflow版本的tran.py文件在加载预训练向量的时候,原始的是word2id找到的是id,而不是字,word2vec里的词向量都是以字为主的,所以word2id应该改成id2word. 如果不改的话 也是能用的,不过embedding_pre全部是111111111,而不是vec.txt里的字向量。建议楼主改下这个坑,很难发现的。

您好,发现在bilstm-crf模型中,词向量是随机生成的,没有用的训练好的词向量(vec.txt)

你把上次训练的模型restore一下不就成了,向量就变成不是随机的了

chmaojian commented 4 years ago

tensorflow版本的tran.py文件在加载预训练向量的时候,原始的是word2id找到的是id,而不是字,word2vec里的词向量都是以字为主的,所以word2id应该改成id2word. 如果不改的话 也是能用的,不过embedding_pre全部是111111111,而不是vec.txt里的字向量。建议楼主改下这个坑,很难发现的。

您好,发现在bilstm-crf模型中,词向量是随机生成的,没有用的训练好的词向量(vec.txt)

你把上次训练的模型restore一下不就成了,向量就变成不是随机的了

在训练的时候,虽然把embedding_pretrained传到了bilstm-crf中, if self.pretrained: embeddings_init = word_embeddings.assign(self.embedding_pretrained) 但是得到的embeddings_init 在训练中并没有用到。 如果把embeddings_init 换成word_embeddings,可以训练模型,但是在测试的时候会报错