栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Python

tensorflow2.x 张量限幅

Python 更新时间:发布时间: 百科书网 趣学号

张量限幅
        • tf.clip_by_value()
        • tf.nn.relu()
        • tf.clip_by_norm()
        • gradient clipping

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进行缩放
裁剪前:

裁剪:
裁剪后:

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/280578.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号