0%

tensorflow

1.tf.clip_by_value

1
2
3
4
5
6
tf.clip_by_value(   
t,
clip_value_min,
clip_value_max,
name=None
)

Returns:A clipped Tensor.

输入一个张量t,把t中的每一个元素的值都压缩在clip_value_min和clip_value_max之间。小于min的让它等于min,大于max的元素的值等于max。

2.tf.clip_by_norm

1
2
3
4
5
6
tf.clip_by_norm(  
t,
clip_norm,
axes=None,
name=None
)

Returns:A clipped Tensor.

指对梯度进行裁剪,通过控制梯度的最大范式,防止梯度爆炸的问题,是一种比较常用的梯度规约的方式。

  • t: 输入tensor,也可以是list

  • clip_norm: 一个具体的数,如果
    $$
    l_2norm(t)≤l_2norm(clipnorm)
    $$
    则t不变化;否则
    $$
    t=\frac{t∗clipnorm}{l_2norm(t)}
    $$

3.minimize()

由源代码可以知道minimize()实际上包含了两个步骤,即

compute_gradients,用于计算梯度,

apply_gradients,用于使用计算得到的梯度来更新对应的variable。

4.EXAMPLE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import tensorflow as tf

x = tf.Variable(initial_value=50., dtype='float32')
w = tf.Variable(initial_value=10., dtype='float32')
y = w*x

opt = tf.train.GradientDescentOptimizer(0.5)
grads_vals = opt.compute_gradients(y, [w])

#list包括的是:梯度和更新变量的元组对
capped_gvs = [(tf.clip_by_value(grad, 2, 2), var)
for grad, var in grads_vals]

#执行对应变量的更新梯度操作
training_op = opt.apply_gradients(capped_gvs)

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(20):
print(sess.run(grads_vals))
print(sess.run(capped_gvs))
sess.run(training_op)
print(sess.run([x, w, y]))

结果:

[(50.0, 10.0)]
[(2.0, 10.0)]
[50.0, 9.0, 450.0]
[(50.0, 9.0)]
[(2.0, 9.0)]
[50.0, 8.0, 400.0]
[(50.0, 8.0)]
[(2.0, 8.0)]
[50.0, 7.0, 350.0]
[(50.0, 7.0)]
[(2.0, 7.0)]
[50.0, 6.0, 300.0]
[(50.0, 6.0)]
[(2.0, 6.0)]

------------- Thank you for reading -------------

Title - Artist
0:00