TensorFlow2.0(5):张量限幅

简介: TensorFlow2.0(5):张量限幅

1 maxmium()与minmium()


maximum()用于限制最小值,也即是说,将一个tensor中小于指定值的元素替换为指定值:


import tensorflow as tf


a = tf.range(10)a


<tf.Tensor: id=3, shape=(10,), dtype=int32, numpy=array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32)>


tf.maximum(a, 4)


<tf.Tensor: id=5, shape=(10,), dtype=int32, numpy=array([4, 4, 4, 4, 4, 5, 6, 7, 8, 9], dtype=int32)>


b = tf.random.uniform([3,4], minval=1, maxval=10, dtype=tf.int32)b


<tf.Tensor: id=9, shape=(3, 4), dtype=int32, numpy=
array([[8, 2, 4, 1],
       [9, 5, 4, 7],
       [6, 5, 8, 6]], dtype=int32)>


tf.maximum(b, 4)


<tf.Tensor: id=11, shape=(3, 4), dtype=int32, numpy=
array([[8, 4, 4, 4],
       [9, 5, 4, 7],
       [6, 5, 8, 6]], dtype=int32)>


minium()方法与maximum()方法想法,用于限制一个tensor的最大值,即将tensor中大于指定值的元素替换为指定值:


tf.minimum(a, 6)


<tf.Tensor: id=13, shape=(10,), dtype=int32, numpy=array([0, 1, 2, 3, 4, 5, 6, 6, 6, 6], dtype=int32)>


tf.minimum(b, 6)


<tf.Tensor: id=15, shape=(3, 4), dtype=int32, numpy=
array([[6, 2, 4, 1],
       [6, 5, 4, 6],
       [6, 5, 6, 6]], dtype=int32)>


如果要同时限制一个tensor的最大值和最小值,可以这么做:


tf.minimum(tf.maximum(b,4),6)


<tf.Tensor: id=19, shape=(3, 4), dtype=int32, numpy=
array([[6, 4, 4, 4],
       [6, 5, 4, 6],
       [6, 5, 6, 6]], dtype=int32)>


这种同时调用minmium()和maxmium()的方法不够便捷,所以TensorFlow中提供了clip_by_value()方法来实现这一功能。


2 clip_by_value()


clip_by_value()底层也是通过调用minmium()和maxmium()方法来实现同时限制最大值、最小值功能,我们现在来感受一下:


b


<tf.Tensor: id=9, shape=(3, 4), dtype=int32, numpy=
array([[8, 2, 4, 1],
       [9, 5, 4, 7],
       [6, 5, 8, 6]], dtype=int32)>


tf.clip_by_value(b,4,6)


<tf.Tensor: id=23, shape=(3, 4), dtype=int32, numpy=
array([[6, 4, 4, 4],
       [6, 5, 4, 6],
       [6, 5, 6, 6]], dtype=int32)>


3 relu()


relu()方法将tensor最小值限制为0,相当于tf.maxmium(a,0),注意,relu()方法在tf.nn模块中:


a = tf.range(-5,5,1)a


<tf.Tensor: id=27, shape=(10,), dtype=int32, numpy=array([-5, -4, -3, -2, -1,  0,  1,  2,  3,  4], dtype=int32)>


tf.nn.relu(a)


<tf.Tensor: id=28, shape=(10,), dtype=int32, numpy=array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4], dtype=int32)>



b = tf.random.uniform([3,4],minval=-10, maxval=10,
dtype=tf.int32)b


<tf.Tensor: id=32, shape=(3, 4), dtype=int32, numpy=
array([[-8, -1, -4,  7],
       [-6, -3,  2, -8],
       [ 5,  6,  2,  5]], dtype=int32)>


tf.nn.relu(b)


<tf.Tensor: id=33, shape=(3, 4), dtype=int32, numpy=
array([[0, 0, 0, 7],
       [0, 0, 2, 0],
       [5, 6, 2, 5]], dtype=int32)>


4 cli_by_norm()


cli_by_norm()方法是根据tensor的L2范数(模)和给定裁切值按比例对tensor进行限幅。这种方法可以在不改变方向的前提下,按比例对向量进行限幅。我们先手动实现这一过程,先定义一个向量:


a = tf.random.normal([2,3],mean=10)a


<tf.Tensor: id=39, shape=(2, 3), dtype=float32, numpy=
array([[ 9.93618 , 10.367402,  9.617832],
       [ 8.890949,  9.650288,  9.430309]], dtype=float32)>


然后求这个向量的L2范数,也就是向量的模:


n = tf.norm(a) n


<tf.Tensor: id=44, shape=(), dtype=float32, numpy=23.66054>


向量处理模,就可以将向量缩放到0到1范围:


a1 = a / na1


<tf.Tensor: id=45, shape=(2, 3), dtype=float32, numpy=
array([[0.41994733, 0.43817267, 0.4064925 ],
       [0.3757712 , 0.4078642 , 0.39856696]], dtype=float32)>


对向量限幅时,例如限制在10范围内:


a2 = a1 * 10a2


<tf.Tensor: id=47, shape=(2, 3), dtype=float32, numpy=
array([[4.1994734, 4.3817267, 4.064925 ],
       [3.757712 , 4.078642 , 3.9856696]], dtype=float32)>


clip_by_norm()方法实现的就是上述步骤:


tf.clip_by_norm(a,10)


<tf.Tensor: id=63, shape=(2, 3), dtype=float32, numpy=
array([[4.1994734, 4.3817267, 4.064925 ],
       [3.757712 , 4.0786424, 3.9856696]], dtype=float32)>


当然,cli_by_norm()方法内部还做了一个判断:如果给定的裁切值大于tensor的模,那就不会去对tensor进行修改,依旧返回tensor本身。继续上面例子,a的模为25.625225,如果给定的裁切值大于这个值,就不会对a进行限幅:


tf.clip_by_norm(a,26)


<tf.Tensor: id=79, shape=(2, 3), dtype=float32, numpy=
array([[ 9.936181, 10.367402,  9.617832],
       [ 8.890949,  9.650288,  9.430309]], dtype=float32)>


5 clip_by_global_norm()


在梯度更新等诸多场景中,需要同时综合多个参数(tensor)进行梯度更新,这时候,clip_by_norm()就满足不了需求了,所以就有了cip_by_global_norm()方法。


cip_by_global_norm()方法限幅原理与clip_by_norm()是一样的,都是综合范数和给定的裁切值进行限幅,不同的是,cip_by_global_norm()方法方法计算范数时是综合给定的多个tensor进行计算。


注:clip_by_global_norm()方法用于修正梯度值,控制梯度爆炸的问题。梯度爆炸和梯度弥散的原因一样,都是因为链式法则求导的关系,导致梯度的指数级衰减。为了避免梯度爆炸,需要对梯度进行修剪。


以下面三个向量为例,同时进行限幅:


t1 = tf.random.normal([3],mean=10)t1


<tf.Tensor: id=85, shape=(3,), dtype=float32, numpy=array([8.257121, 7.466969, 8.756236], dtype=float32)>


t2 = tf.random.normal([3],mean=10)t2


<tf.Tensor: id=91, shape=(3,), dtype=float32, numpy=array([10.112761, 10.555879,  9.646121], dtype=float32)>


t3 = tf.random.normal([3],mean=10)t3


<tf.Tensor: id=97, shape=(3,), dtype=float32, numpy=array([9.884818, 8.648524, 9.125227], dtype=float32)>


t_list = [t1,t2,t3]


首先计算全局L2范数,计算公式为:global_norm = sqrt(sum([L2norm(t)**2 for t in t_list]))


global_norm = tf.norm([tf.norm(t) for t in t_list])


假设给定裁切值为25:


[t*25/global_norm for t in t_list]


[<tf.Tensor: id=121, shape=(3,), dtype=float32, numpy=array([7.4725804, 6.757504 , 7.9242725], dtype=float32)>,
 <tf.Tensor: id=124, shape=(3,), dtype=float32, numpy=array([9.151909, 9.552924, 8.729607], dtype=float32)>,
 <tf.Tensor: id=127, shape=(3,), dtype=float32, numpy=array([8.945623, 7.826795, 8.258204], dtype=float32)>]


tf.clip_by_global_norm(t_list,25)


([<tf.Tensor: id=148, shape=(3,), dtype=float32, numpy=array([7.47258  , 6.7575035, 7.9242725], dtype=float32)>,
  <tf.Tensor: id=149, shape=(3,), dtype=float32, numpy=array([9.151908, 9.552924, 8.729606], dtype=float32)>,
  <tf.Tensor: id=150, shape=(3,), dtype=float32, numpy=array([8.945623 , 7.8267946, 8.2582035], dtype=float32)>],
 <tf.Tensor: id=136, shape=(), dtype=float32, numpy=27.624733>)


计算结果是一样的,不过clip_by_global_norm()返回两个值,分别是各向量限幅后的返回值列表、全局范数。

相关文章
|
3月前
|
机器学习/深度学习 算法 PyTorch
【深度学习】TensorFlow面试题:什么是TensorFlow?你对张量了解多少?TensorFlow有什么优势?TensorFlow比PyTorch有什么不同?该如何选择?
关于TensorFlow面试题的总结,涵盖了TensorFlow的基本概念、张量的理解、TensorFlow的优势、数据加载方式、算法通用步骤、过拟合解决方法,以及TensorFlow与PyTorch的区别和选择建议。
260 2
|
6月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
TensorFlow核心组件详解:张量、图与会话
【4月更文挑战第17天】TensorFlow的核心是张量、计算图和会话。张量是基本数据单元,表示任意维度数组;计算图描述操作及它们的依赖关系,优化运行效率;会话是执行计算图的环境,负责操作执行和资源管理。在TF 2.x中,Eager Execution模式简化了代码,无需显式创建会话。理解这些组件有助于高效开发深度学习模型。
|
6月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
【深度学习】Tensorflow、MindSpore框架介绍及张量算子操作实战(超详细 附源码)
【深度学习】Tensorflow、MindSpore框架介绍及张量算子操作实战(超详细 附源码)
210 0
|
TensorFlow 算法框架/工具 索引
《30天吃掉那只 TensorFlow2.0》 4-2 张量的数学运算
《30天吃掉那只 TensorFlow2.0》 4-2 张量的数学运算
《30天吃掉那只 TensorFlow2.0》 4-2 张量的数学运算
|
存储 索引 Python
《30天吃掉那只 TensorFlow2.0》 4-1 张量的结构操作
《30天吃掉那只 TensorFlow2.0》 4-1 张量的结构操作
《30天吃掉那只 TensorFlow2.0》 4-1 张量的结构操作
|
机器学习/深度学习 TensorFlow 算法框架/工具
【深度学习】Tensorflow学习(1)张量与常用函数 2
【深度学习】Tensorflow学习(1)张量与常用函数
267 0
【深度学习】Tensorflow学习(1)张量与常用函数 2
|
机器学习/深度学习 TensorFlow 算法框架/工具
【深度学习】Tensorflow学习(1)张量与常用函数 1
【深度学习】Tensorflow学习(1)张量与常用函数
130 0
【深度学习】Tensorflow学习(1)张量与常用函数 1
|
TensorFlow 算法框架/工具 索引
TensorFlow2.0(1):基本数据结构——张量
TensorFlow2.0(1):基本数据结构——张量
|
机器学习/深度学习 前端开发 TensorFlow
深度学习:Tensorflow的基本概念和张量
深度学习:Tensorflow的基本概念和张量
190 0
下一篇
无影云桌面