Luka0612 / cw2vec

基于字符训练词向量
89 stars 30 forks source link

我在 #7

Open daqiang2 opened 5 years ago

daqiang2 commented 5 years ago

我在load_model的时候出现了normalized_embeddings与模型中的不匹配的问题,提示说原模型中的为(3876,128),可以询问一下这是为什么》

Luka0612 commented 5 years ago

@daqiang2 麻烦清楚描述下或者截图你的运行,以及报错的内容哈

daqiang2 commented 5 years ago

image 在lodel_model时,加载出来的normalized_embeddings的维度是(3876,,128),不是预想的(200000,128), 你好方便给个联系方式吗 ?这样交流方便些,谢谢麻烦你了。我的qq 457705137

Luka0612 commented 5 years ago

@daqiang2 你好,不太习惯加联系方式,就在这沟通,其他有相同问题的小伙伴也可以看到。你看下vocabulary_size是否设置成200000

daqiang2 commented 5 years ago

我检查过vocabulary这个设置使正确,但加载出来的embedding似乎是stroke_embedding

daqiang2 commented 5 years ago

我也详细看代码了按理说是没错的,不知道为什么?

Luka0612 commented 5 years ago

@daqiang2 你用word_embedding的代码加载了stroke_embedding的内容了,改下代码或改下记载的路径

daqiang2 commented 5 years ago

我加载的是是你提供的训练模型cw2vec的保存参数, image 这里是加载模型中normalized_embedding啊,怎么加载出来就成了stroke_embedding呢?

zzb5233 commented 5 years ago

embeddings_stroke = tf.Variable(tf.random_uniform([self.stroke_size, self.embedding_size], -1.0, 1.0))

将最后的stroke为0

one_hot = tf.one_hot(0, self.stroke_size, dtype=tf.float32) one_hot = tf.transpose(tf.reshape(tf.tile(one_hot, [self.embedding_size]), shape=[self.embedding_size, self.stroke_size])) embeddings_stroke = embeddings_stroke - embeddings_stroke[0]*one_hot lookup_embed = tf.nn.embedding_lookup(embeddings_stroke, train_inputs) stroke_length = get_length(lookup_embed) embed = [] for i in range(self.batch_size): embed.append(tf.reduce_sum(lookup_embed[i][:stroke_length[i]], 0)) 这段没有看懂,我测试感觉是在找最大值。 word2vec_basic.py中这块是: embed = tf.nn.embedding_lookup(embeddings, train_inputs)

zzb5233 commented 5 years ago

get_length以前的代码与word2vec_basic.py的几乎一致,不一样的地方是embeddings_stroke[0]被设置为全0列表,而word2vec_basic.py中是直接使用初始化后的embeddings,然后调用tf.nn.embedding_lookup()

Luka0612 commented 5 years ago

@zzb5233 关键不是设置为全0列表这个,因为字符编码跟词编码是不一样的,词是多个偏旁部首的组合,所以需要tf.reduce_sum

zzb5233 commented 5 years ago

你是把原来的[batch_size, stroke_seq_length, embedding_size]最后一个纬度按照实际长度进行了加和操作,变成了[batch_size, embedding_size],这样做是为了啥?

ixxooi-baijian commented 5 years ago

我加载的是是你提供的训练模型cw2vec的保存参数, image 这里是加载模型中normalized_embedding啊,怎么加载出来就成了stroke_embedding呢?

问题解决了吗。我也是这个问题