预计浮点数32,得到<tensorflow.python.framework.indexed_slices。改为"索引切片"类型的索引切片



我正在尝试构建一个函数来执行损失优化,我正在使用Adam优化器,其学习率将在类中通过。然而,有人建议我使用clip_by_norm函数应用剪裁来消除爆炸梯度。

def perform_optimization(self):
"""Specifies the optimizer and train_op for the model."""
# Create an optimizer (tf.train.AdamOptimizer)
self.optimizer =  tf.train.AdamOptimizer(learning_rate= self.learning_rate_ph)
self.grads_and_vars = self.optimizer.compute_gradients(self.loss)
clip_norm = tf.cast(1.0, tf.float32)
self.grads_and_vars = tf.clip_by_norm(t=self.grads_and_vars,clip_norm=clip_norm) 
self.train_op = self.optimizer.apply_gradients(self.grads_and_vars)

我得到了标题中显示的错误,我跟踪了类中的所有函数,错误是因为这行

self.grads_and_vars = tf.clip_by_norm(t=self.grads_and_vars,clip_norm=clip_norm)

我不太确定我做错了什么,因为这是我第一次使用clip_by_norm。有什么想法吗?

发现变量self.grads_and_vars同时包含梯度和变量的错误,所以我必须进行列表理解,才能得到如下的梯度

self.grads_and_vars =[(tf.clip_by_value(grad, -1., 1.), var) for grad, var in self.grads_and_vars]

它成功了!

最新更新