tensorflow - 用于训练和推理的 TensorFlow 嵌入
问题描述
我正在尝试使用 tensorflow 编写一个简单的神经机器翻译。但是对于 tensorflow 上的嵌入的理解,我有点卡住了:
- 我不明白之间的区别
tf.contrib.layers.embed_sequence(inputs, vocab_size=target_vocab_size,embed_dim=decoding_embedding_size)
和
dec_embeddings = tf.Variable(tf.random_uniform([target_vocab_size, decoding_embedding_size]))
dec_embed_input = tf.nn.embedding_lookup(dec_embeddings, dec_input)
在哪种情况下我应该使用一个到另一个?
- 我不明白的第二件事是关于 tf.contrib.seq2seq.TrainingHelper 和 tf.contrib.seq2seq.GreedyEmbeddingHelper。我知道在翻译的情况下,我们主要使用 TrainingHelper 进行训练步骤(使用前一个目标来预测下一个目标)和 GreedyEmbeddingHelper 进行推理步骤(使用前一个时间步来预测下一个目标)。但我不明白它是如何工作的。特别是使用的不同参数。例如,为什么在 TrainingHelper 的情况下我们需要一个序列长度(为什么我们不使用 EOS)?为什么他们两个都不使用 embedding_lookup 或 embedding_sequence 作为输入?
解决方案
我想你来自这个seq2seq 教程。即使这个问题开始变老,我也会尝试为像我这样路过的人回答:
- 第一个问题,我看了后面的源码
tf.contrib.layers.embed_sequence
,其实是用tf.nn.embedding_lookup
的。所以它只是包装它,并tf.Variable(tf.random_uniform([target_vocab_size, decoding_embedding_size]))
为您创建嵌入矩阵 ( )。尽管这很方便且不那么冗长,但使用embed_sequence
there 似乎并不是一种直接访问嵌入的方法。因此,如果您愿意,您必须使用相同的名称空间查询用作嵌入矩阵的内部变量。我不得不承认,上面教程中的代码令人困惑。我什至怀疑他在编码器和解码器中使用了不同的嵌入。 - 对于第二个问题:
- 我想这相当于使用序列长度或嵌入。
TrainingHelper
不需要,因为embedding_lookup
它只将输入转发到解码器,GreedyEmbeddingHelper
确实将文件作为第一个输入,embedding_lookup
如文档中所述。
推荐阅读
- java - 尝试连接到 Kuzzle 服务器时 SSL 握手中止
- computer-vision - 在 YOLACT/YOLACT++ 中只预测一个班级(人)
- database - 文档数据库
- jupyter-notebook - 无法使用 nbconvert 将 jupyter notebook 导出为任何其他格式
- python - 08001] 无法创建与数据库服务器的连接。索引 5 超出长度 5 的范围 - SQL 错误
- javascript - 有没有办法可以使用`router-outlet`在Angular中渲染一个2级嵌套组件?
- database - 发布 Asp.net core 3.1 + 数据库 + 迁移
- php - 如何在 php 电子邮件模板中使用 css display:none
- nestjs - 如何在 Nestjs 的控制器的构造函数中注入服务的接口?
- tensorflow - Tensorflow 2 中数据增强的使用