tf. clip_by_global_norm

下面这两篇博客就这个问题讲的很详细:
https://blog.csdn.net/u010814042/article/details/76154391
https://blog.csdn.net/u013713117/article/details/56281715
下面的代码是双向lstm+crf计算损失的部分,但是思路是通用的。

with tf.variable_scope('crf'):
    self.log_likelihood, self.transition_params = crf.crf_log_likelihood(inputs=self.logits,tag_indices=self.targets,sequence_lengths=self.sequence_length)

with tf.name_scope('loss'):
    #因为我们希望self.log_likelihood最大,所以相当于求-self.log_likelihood的最小值
    self.log_loss = tf.reduce_mean(-self.log_likelihood)
    #正则
    self.l2_loss = tf.contrib.layers.apply_regularization(
        regularizer=tf.contrib.layers.l2_regularizer(0.0001),
        weights_list=tf.trainable_variables())
    self.loss = self.log_loss+self.l2_loss

self.train_summary = tf.summary.scalar('loss',self.loss)
self.vali_summary = tf.summary.scalar('loss',self.loss)
# self.merged = tf.summary.merge_all()
optimizer = tf.train.AdamOptimizer(self.learning_rate)
# optimizer = tf.train.GradientDescentOptimizer(self.learning_rate)
#获取所有可训练的向量
tvars = tf.trainable_variables()
#gradients是计算向量,输入是loss和所有trainable的向量。
#clip_by_global_norm是梯度缩放输入是所有trainable向量的梯度,和所有trainable向量,返回第一个clip好的梯度,第二个globalnorm
grads, _ = tf.clip_by_global_norm(tf.gradients(self.loss, tvars), self.clip_grad)
#apply_gradients是tf.train.Optimizer.minimize实际操作中两步中的一步,minizie其实是分了两步运算,第一步计算梯度tf.train.Optimizer.compute_gradients和第二步更新梯度
#tf.train.Optimizer.apply_gradients,由于我们已经计算股哦梯度了,所以我们只用更新梯度就可以了,输入格式就是如下zip(梯度向量,变量向量)
#tvars的格式可以参考这篇博客:https://blog.csdn.net/u014595019/article/details/52805444
self.train_op = optimizer.apply_gradients(zip(grads, tvars))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值