在eager模式下计算两个嵌入时发生了梯度错误

时间:2018-04-02 03:33:49

标签: tensorflow embedding eager dynet

当我尝试在eager模式下使用tensorflow重写dynet project时,发生了以下错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError: cannot compute ConcatV2 as input #1 was expected to be a float tensor but is a int32 tensor [Op:ConcatV2] name: concat

我试图找到错误并简化代码,然后发现当在急切模式下的一个动态图中计算两个嵌入时,会发生错误。

在静态图形模式下添加两个嵌入时没有错误。

with tf.Graph().as_default():
    emb = tf.keras.layers.Embedding(10000, 50)
    emb2 = tf.keras.layers.Embedding(10000, 50)
    y_ = emb(tf.constant(100)) + emb2(tf.constant(100))
    y = tf.ones((1, 50))
    loss = tf.reduce_sum(y - y_)
    optimizer = tf.train.MomentumOptimizer(0.2,0.5).minimize(loss)
    init = tf.global_variables_initializer()
    with tf.Session() as sess:
        sess.run(init)
       sess.run(fetches=[loss, optimizer])

但是当我在急切模式下运行以下代码时,发生了错误。

tfe.enable_eager_execution()

def loss(y):
    emb = tf.keras.layers.Embedding(10000,50)
    emb2 = tf.keras.layers.Embedding(10000,50)
    y_ = emb(tf.constant(100)) + emb2(tf.constant(100))
    return tf.reduce_sum(y - y_)

y = tf.ones((1, 50))
grads = tfe.implicit_gradients(loss)(y)
tf.train.MomentumOptimizer(0.2, 0.5).apply_gradients(grads)

热切模式下的代码出了什么问题,如何在急切模式下计算两次嵌入?

1 个答案:

答案 0 :(得分:1)

这里有两件事:

  1. 我认为这是一个急切执行的错误,我已经为此提交了https://github.com/tensorflow/tensorflow/issues/18180。我不认为这是在1.6版本中存在的,所以也许你可以在过渡期间尝试使用它。

  2. 那就是说,我注意到你在损失函数中定义了一个Embedding图层对象。这意味着loss的每次调用都会创建一个新的Embedding,这可能不是您想要的。相反,您可能希望将代码重构为:

    emb = tf.keras.layers.Embedding(10000,50) emb2 = tf.keras.layers.Embedding(10000,50)

    def loss(y):     y_ = emb(tf.constant(100))+ emb2(tf.constant(100))     return tf.reduce_sum(y - y _)

  3. 通过急切执行,参数所有权更多" Pythonic",因为与Embedding对象(embemb2)关联的参数具有生命周期创建它们的对象。

    希望有所帮助。