如何将 word2vec 导入 TensorFlow Seq2Seq 模型?
How to import word2vec into TensorFlow Seq2Seq model?
我正在玩 Tensorflow 序列到序列翻译模型。我想知道我是否可以将我自己的 word2vec 导入到这个模型中?而不是使用教程中提到的原始'dense representation'。
在我看来,TensorFlow 似乎对 seq2seq 模型使用了 One-Hot 表示。首先,对于函数 tf.nn.seq2seq.embedding_attention_seq2seq
,编码器的输入是标记化符号,例如'a' 将是“4”,'dog' 将是“15715”等,并且需要 num_encoder_symbols。所以我认为这让我提供了单词的位置和单词的总数,然后该函数可以在 One-Hot 表示中表示单词。源码还在学习中,看不懂。
谁能给我一个关于上述问题的想法?
seq2seq embedding_* 函数确实创建了与 word2vec 非常相似的嵌入矩阵。它们是一个名为 sth 的变量,如下所示:
EMBEDDING_KEY = "embedding_attention_seq2seq/RNN/EmbeddingWrapper/embedding"
知道了这个,修改这个变量就可以了。我的意思是——以某种格式获取 word2vec 向量,比如文本文件。假设你的词汇量在 model.vocab 中,你可以按照下面的代码片段所示的方式分配读取向量(这只是一个片段,你必须更改它才能使其工作,但我希望它能显示想法)。
vectors_variable = [v for v in tf.trainable_variables()
if EMBEDDING_KEY in v.name]
if len(vectors_variable) != 1:
print("Word vector variable not found or too many.")
sys.exit(1)
vectors_variable = vectors_variable[0]
vectors = vectors_variable.eval()
print("Setting word vectors from %s" % FLAGS.word_vector_file)
with gfile.GFile(FLAGS.word_vector_file, mode="r") as f:
# Lines have format: dog 0.045123 -0.61323 0.413667 ...
for line in f:
line_parts = line.split()
# The first part is the word.
word = line_parts[0]
if word in model.vocab:
# Remaining parts are components of the vector.
word_vector = np.array(map(float, line_parts[1:]))
if len(word_vector) != vec_size:
print("Warn: Word '%s', Expecting vector size %d, found %d"
% (word, vec_size, len(word_vector)))
else:
vectors[model.vocab[word]] = word_vector
# Assign the modified vectors to the vectors_variable in the graph.
session.run([vectors_variable.initializer],
{vectors_variable.initializer.inputs[1]: vectors})
我想使用 Matthew 提到的范围样式,你可以获得变量:
with tf.variable_scope("embedding_attention_seq2seq"):
with tf.variable_scope("RNN"):
with tf.variable_scope("EmbeddingWrapper", reuse=True):
embedding = vs.get_variable("embedding", [shape], [trainable=])
此外,我想您也想将嵌入注入到解码器中,它的键(或范围)类似于:
"embedding_attention_seq2seq/embedding_attention_decoder/embedding"
感谢您的回答,Lukasz!
我想知道,代码片段中的 <b>model.vocab[word]</b>
到底代表什么?只是单词在词汇表中的位置?
在这种情况下,遍历词汇表并为 w2v 模型中存在的单词注入 w2v 向量会不会更快。
我正在玩 Tensorflow 序列到序列翻译模型。我想知道我是否可以将我自己的 word2vec 导入到这个模型中?而不是使用教程中提到的原始'dense representation'。
在我看来,TensorFlow 似乎对 seq2seq 模型使用了 One-Hot 表示。首先,对于函数 tf.nn.seq2seq.embedding_attention_seq2seq
,编码器的输入是标记化符号,例如'a' 将是“4”,'dog' 将是“15715”等,并且需要 num_encoder_symbols。所以我认为这让我提供了单词的位置和单词的总数,然后该函数可以在 One-Hot 表示中表示单词。源码还在学习中,看不懂。
谁能给我一个关于上述问题的想法?
seq2seq embedding_* 函数确实创建了与 word2vec 非常相似的嵌入矩阵。它们是一个名为 sth 的变量,如下所示:
EMBEDDING_KEY = "embedding_attention_seq2seq/RNN/EmbeddingWrapper/embedding"
知道了这个,修改这个变量就可以了。我的意思是——以某种格式获取 word2vec 向量,比如文本文件。假设你的词汇量在 model.vocab 中,你可以按照下面的代码片段所示的方式分配读取向量(这只是一个片段,你必须更改它才能使其工作,但我希望它能显示想法)。
vectors_variable = [v for v in tf.trainable_variables()
if EMBEDDING_KEY in v.name]
if len(vectors_variable) != 1:
print("Word vector variable not found or too many.")
sys.exit(1)
vectors_variable = vectors_variable[0]
vectors = vectors_variable.eval()
print("Setting word vectors from %s" % FLAGS.word_vector_file)
with gfile.GFile(FLAGS.word_vector_file, mode="r") as f:
# Lines have format: dog 0.045123 -0.61323 0.413667 ...
for line in f:
line_parts = line.split()
# The first part is the word.
word = line_parts[0]
if word in model.vocab:
# Remaining parts are components of the vector.
word_vector = np.array(map(float, line_parts[1:]))
if len(word_vector) != vec_size:
print("Warn: Word '%s', Expecting vector size %d, found %d"
% (word, vec_size, len(word_vector)))
else:
vectors[model.vocab[word]] = word_vector
# Assign the modified vectors to the vectors_variable in the graph.
session.run([vectors_variable.initializer],
{vectors_variable.initializer.inputs[1]: vectors})
我想使用 Matthew 提到的范围样式,你可以获得变量:
with tf.variable_scope("embedding_attention_seq2seq"):
with tf.variable_scope("RNN"):
with tf.variable_scope("EmbeddingWrapper", reuse=True):
embedding = vs.get_variable("embedding", [shape], [trainable=])
此外,我想您也想将嵌入注入到解码器中,它的键(或范围)类似于:
"embedding_attention_seq2seq/embedding_attention_decoder/embedding"
感谢您的回答,Lukasz!
我想知道,代码片段中的 <b>model.vocab[word]</b>
到底代表什么?只是单词在词汇表中的位置?
在这种情况下,遍历词汇表并为 w2v 模型中存在的单词注入 w2v 向量会不会更快。