1.tf.clip_by_norm
clip_by_norm(t, clip_norm, axes=None, name=None)
- t: 输入tensor,也可以是list
- clip_norm: 一个具体的数,如果l2norm(t) ≤ clip_norm, 则t不变化;否则t=t∗clip_norm / l2norm(t)
- axes:指定计算l2norm的维度,如果不指定,利用t中所有元素计算l2norm,对于一维tensor没有影响,对于二维tensor会有影响
让我们看一个具体的例子:
对于a而言,是利用[[3.0, 4.0], [1.0, 2.0]]计算整体l2norm,l2norm(t) = 5.477,由于l2norm(t) ≥ 2,所以每一项值为t∗clip_norm / l2norm(t);
对于b而言,指定了axes=1,那么表示分别对每一行进行操作,[3.0, 4.0]的l2norm为5,5>4,需要进行裁剪;[1.0, 2.0]的l2norm为2.236,由于2.236<4,所以不进行裁剪
import tensorflow as tf
a = tf.clip_by_norm([[3.0, 4.0], [1.0, 2.0]], clip_norm=2)
b = tf.clip_by_norm([[3.0, 4.0], [1.0, 2.0]], axes=1, clip_norm=4)
sess = tf.Session()
print(sess.run(a))
print(sess.run(b))
---------------------------------
[[1.095445 1.4605935 ]
[0.36514837 0.73029673]]
[[2.4 3.2]
[1. 2. ]]2.tf.clip_by_global_norm
tf.clip_by_global_norm(t_list, clip_norm, use_norm=None, name=None)
理解了clip_by_norm中的axes其实就比较好理解这个了,clip_by_global_norm相当于不指定axes,即利用所有元素计算一个global norm。另外,还需要注意的是,clip_by_global_norm返回值有两个,分别为裁剪后的tensor和global norm
import tensorflow as tf
a = tf.clip_by_norm([[3.0, 4.0], [1.0, 2.0]], clip_norm=2)
b, _ = tf.clip_by_global_norm([[3.0, 4.0], [1.0, 2.0]], clip_norm=2)
sess = tf.Session()
print(sess.run(a))
print(sess.run(b))
-------------------------------------
[[1.095445 1.4605935 ]
[0.36514837 0.73029673]]
[array([1.0954452, 1.4605935], dtype=float32), array([0.36514837, 0.73029673], dtype=float32)]
版权声明:本文为lichaobxd原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。