我最近回顾了convolutional text classification的一个有趣的实现。然而,我回顾过的所有TensorFlow代码都使用随机(非预训练)嵌入向量,如下所示:
with tf.device('/cpu:0'), tf.name_scope("embedding"):
W = tf.Variable(
tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),
name="W")
self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x)
self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)
有没有人知道如何使用Word2vec的结果,或者一个手套预先训练的单词嵌入,而不是一个随机的?
我使用此方法加载和共享嵌入。
有几种方法可以在TensorFlow中使用预先训练的嵌入。假设您在一个名为} 时使用的张量
embedding
的NumPy数组中嵌入了vocab_size
行和embedding_dim
列,并且您希望创建一个可以在调用^{W
。只需将} :
W
创建为以embedding
为其值的^{这是最简单的方法,但它不具有内存效率,因为
tf.constant()
的值多次存储在内存中。因为embedding
可能非常大,所以应该只对玩具示例使用此方法。创建} 从NumPy数组初始化它:
W
作为tf.Variable
,并通过^{这样可以避免在图中存储
embedding
的副本,但它确实需要足够的内存来同时在内存中保留矩阵的两个副本(一个用于NumPy数组,另一个用于tf.Variable
)。请注意,我假设您希望在训练期间保持嵌入矩阵常量,所以W
是用trainable=False
创建的。如果嵌入被训练为另一个TensorFlow模型的一部分,则可以使用^{} 从另一个模型的检查点文件加载值。这意味着嵌入矩阵可以完全绕过Python。创建选项2中的
W
,然后执行以下操作:@mrry的答案是不正确的,因为它证明了每次网络运行时都会覆盖嵌入的权重,所以如果您采用小批量方法来训练网络,那么您就是覆盖了嵌入的权重。所以,在我看来,正确的预训练嵌入方法是:
相关问题 更多 >
编程相关推荐