我正在尝试构建一个函数来执行损失优化,我正在使用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]
它成功了!