首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当嵌入矩阵的第一个维度增加时,如何使用tf.nn.embedding_look()?

当嵌入矩阵的第一个维度增加时,如何使用tf.nn.embedding_look()?
EN

Stack Overflow用户
提问于 2016-11-04 09:42:42
回答 1查看 66关注 0票数 0

我正在将词向量模型应用于在线新闻文章。因为我每天都能收到新文章,所以我不能知道“真实”的词汇量。

假设我现在有10篇文章,词汇量为1000。我将单词嵌入矩阵初始化为[1000, emb_size]形状,并基于10篇文章训练模型。在这之后,我得到了一篇有5个新词的新文章,所以词汇量变成了1005。为了用额外的文章训练模型,我必须保留旧的嵌入矩阵,并在底部添加5行新行,即[1005, emb_size]的形状。

嵌入矩阵最初是通过以下方式创建的:

代码语言:javascript
复制
self.word_embedding = tf.get_variable(
    name = 'word_embedding', 
    shape = [1000, opts.embed_size], 
    initializer = tf.random_uniform_initializer(-init_width, init_width)
)

我通过以下方式更新矩阵:

代码语言:javascript
复制
old_word_embedding = self.word_embedding
new_word_embedding = tf.get_variable(
    name = 'new_word_embedding', 
    shape = [5, opts.embed_size], 
    initializer = tf.random_uniform_initializer(-init_width, init_width)
)

tf.initialize_variables([add_word_embedding]).run()

self.word_embedding = tf.Variable(tf.concat(0, [old_outside_embedding, new_outside_embedding]), name = 'word_embedding')

如果我使用print self.word_embedding.get_shape(),它确实会给出正确的形状[1005, embsize]。但是,当模型开始训练新文章时,它会给我一个错误:

代码语言:javascript
复制
terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check
Aborted

我想知道是不是因为这句话:

center_emb = tf.nn.embedding_lookup(self.word_embedding, center)

在哪里embedding_lookup仍然使用旧的[1000, embed_size]嵌入矩阵?如果是这样,如何让它使用新的self.word_embedding

EN

回答 1

Stack Overflow用户

发布于 2016-11-04 09:54:04

您可以使用tf.pad()在维度上展开。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40414045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档