一、梯度裁剪
1.1 根据value值裁剪.
optimizer = tf.train.AdamOptimizer(learning_rate=lr)
gvs = optimizer.compute_gradients(cost)
capped_gvs = [(tf.clip_by_value(grad, clip_value_min=-1, clip_value_max=1), var) for grad, var in gvs]
train_op = optimizer.apply_gradients(capped_gvs)
1.2 根据梯度范式裁剪.
二、检查哪些变量无梯度
变量无梯度,说明不更新,如果需要更新,那么就有问题。
2.1 通过代码检查
gradients = tf.gradients(total_loss, tf.trainable_variables())
for var, grad in zip(tf.trainable_variables(), ):
if grad is None:
print(var)
这样输出的变量即为不更新的。
2.2 通过tensorboard检查
三、获取变量梯度值
3.1 获取某个命名空间下的全部梯度值
gradients = tf.gradients(total_loss, tf.trainable_variables(scope="word_bow_loss"))
3.2 获取某个集合下的全部梯度值
tf.add_to_collection("check_g_v", common_probs)
tf.add_to_collection("check_g_v", copy_probs)
tf.add_to_collection("check_g_v", entity_probs)
gradients = tf.gradients(total_loss, tf.get_collection(check_g_v))