tensorflow2.x 张量限幅

tf.clip_by_value()
# tf.clip_by_value()
a = tf.range(10)
print(a)
print(tf.maximum(a, 2))#限制最小为 2
print(tf.minimum(a, 8))#限制最大为 8
print(tf.clip_by_value(a, 2, 8)) # 限制最小为2,最大为8
'''
参数:tensor, clip_value_min, clip_value_max,name=None
clip_value_min:最小限幅
clip_value_max:最大限幅

'''
tf.nn.relu()
#tf.nn.relu() 将所有小于0的数变为0
#tf.nn.relu(a) == tf.maximum(a, 0)
a = tf.range(10)
a = a - 5
print(a)
print(tf.nn.relu(a))
print(tf.maximum(a, 0))
tf.clip_by_norm()

为什么要根据一个范数来进行裁剪?
对于一个vector(向量),例如(x,y),若只是对于x进行裁剪,而未对y进行裁剪,
则意味着即使你改变了一个vector的方向,对于一个gradient(梯度)来说,我们
是不希望改变gradient方向的,因为gradient是已经计算出来的,若剪裁改变了
gradient的方向,不利于我们计算最优解

所以,我们既需要把值限定在一个最小的范围之内,但是又不希望改变方向的话,
我们就有一个 等比例的放缩

只改变模,不改变方向


'''
为什么要根据一个范数来进行裁剪?
对于一个vector(向量),例如(x,y),若只是对于x进行裁剪,而未对y进行裁剪,
则意味着即使你改变了一个vector的方向,对于一个gradient(梯度)来说,我们
是不希望改变gradient方向的,因为gradient是已经计算出来的,若剪裁改变了
gradient的方向,不利于我们计算最优解
-------
所以,我们既需要把值限定在一个最小的范围之内,但是又不希望改变方向的话,
我们就有一个 等比例的放缩
1.求出整体的模的长度
2.除以二范数,归一到0-1的范围之内
3.乘以一个值,进行等比例的放缩
'''
#tf.clip_by_norm()
a = tf.random.normal([2,2],mean=10)
print(a)
print(tf.norm(a))#求出范数
aa = tf.clip_by_norm(a,15)#对a进行一个放缩
print(aa)
print(tf.norm(aa))#aa的范数
gradient clipping

问题:

  • 梯度爆炸
  • 梯度消失

对所有的norm进行缩放
裁剪前
在这里插入图片描述

裁剪
在这里插入图片描述裁剪后
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值