在 eager 模式下计算两个嵌入时出现梯度错误
Gradient error occurred when calculate two embeddings on eager mode
当我尝试在 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
我试图定位错误并简化代码,然后发现在eager模式下在一个动态图中计算两个嵌入时会出现错误。
在静态图模式下添加两个embeddings没有报错
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])
但是当我在eager模式下运行下面的代码时,出现了错误。
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)
eager 模式下的代码有什么问题,如何在 eager 模式下计算两个嵌入?
这里发生了两件事:
我认为这是 eager execution 引入的错误,我已经为此提交了 https://github.com/tensorflow/tensorflow/issues/18180。我不认为这在 1.6 版中存在,所以也许您可以在此期间尝试使用它。
就是说,我注意到您在损失函数中定义了一个 Embedding
图层对象。这意味着每次调用 loss
都会创建一个新的 Embedding
,这可能不是您想要的。相反,您可能希望将代码重组为:
emb = tf.keras.layers.Embedding(10000,50)
emb2 = tf.keras.layers.Embedding(10000,50)
默认损失(y):
y_ = emb(tf.constant(100)) + emb2(tf.constant(100))
return tf.reduce_sum(y - y_)
随着急切执行,参数所有权更多 "Pythonic",因为与 Embedding
对象(emb
和 emb2
)关联的参数具有创建它们的对象。
希望对您有所帮助。
当我尝试在 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
我试图定位错误并简化代码,然后发现在eager模式下在一个动态图中计算两个嵌入时会出现错误。
在静态图模式下添加两个embeddings没有报错
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])
但是当我在eager模式下运行下面的代码时,出现了错误。
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)
eager 模式下的代码有什么问题,如何在 eager 模式下计算两个嵌入?
这里发生了两件事:
我认为这是 eager execution 引入的错误,我已经为此提交了 https://github.com/tensorflow/tensorflow/issues/18180。我不认为这在 1.6 版中存在,所以也许您可以在此期间尝试使用它。
就是说,我注意到您在损失函数中定义了一个
Embedding
图层对象。这意味着每次调用loss
都会创建一个新的Embedding
,这可能不是您想要的。相反,您可能希望将代码重组为:emb = tf.keras.layers.Embedding(10000,50) emb2 = tf.keras.layers.Embedding(10000,50)
默认损失(y): y_ = emb(tf.constant(100)) + emb2(tf.constant(100)) return tf.reduce_sum(y - y_)
随着急切执行,参数所有权更多 "Pythonic",因为与 Embedding
对象(emb
和 emb2
)关联的参数具有创建它们的对象。
希望对您有所帮助。