tf.train.GradientDescentOptimizer().minimize()细致探索

1.tf.train.GradientDescentOptimizer().minimize()

其中的minimize可以拆为以下两个步骤:
① 梯度计算
② 将计算出来的梯度应用到变量的更新中
拆开的好处是,可以对计算的梯度进行限制,防止梯度消失和爆炸

#方法1:拆开为两部分
import tensorflow as tf
tf.reset_default_graph()

#创建变量
with tf.variable_scope('var'):
  weights=tf.get_variable(name='w',initializer=tf.constant(2.0))
  input=tf.get_variable(name='x',initializer=tf.constant(3.0))
  loss=weights*input*input  #定义优化器,计算梯度和应用梯度
  print(loss)
  print('weight_name:',weights.name)
  print('input_name:',input.name)


optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.4)
list_of_grad_var1=optimizer.compute_gradients(loss,[weights,input])  #返回list格式为:[(grad1,var_initial1),(grad2,var_initial2)]
list_of_grad_var2=list_of_grad_var1.copy()  #这里不能不加copy(),不加则list_of_grad_var1会跟着list_of_grad_var2变化,最终两个是一模一样的
#也可以用下面这个计算梯度,只是不会返回var_initial
#grad=tf.gradients(loss,[weights,input])

#剪切梯度,防止梯度消失和爆炸
for i,(grad,var_initial) in enumerate(list_of_grad_var1):  #enumerate可以带i
  list_of_grad_var2[i]=(tf.clip_by_norm(grad,10),var_initial)  #这里比较的是2范数,具体公式自己查

#更新变量
train_op=optimizer.apply_gradients(list_of_grad_var2)  #一定要记住,这里是x和w都要被更新的!!!

#执行
config=tf.ConfigProto()
config.gpu_options.allow_growth=True
with tf.Session(config=config) as sess:
  sess.run(tf.global_variables_initializer())
  print(sess.run(list_of_grad_var1))  #原始的梯度(9,12)
  print(sess.run(list_of_grad_var2))  #剪切后的梯度(9,10)
  sess.run(train_op)  #更新loss
  print(sess.run(loss))  #降低的loss:从原来的18降低为了
  #输出
  Tensor("var/mul_1:0", shape=(), dtype=float32)
weight_name: var/w:0
input_name: var/x:0
[(9.0, 2.0), (12.0, 3.0)]
[(9.0, 2.0), (10.0, 3.0)]
-1.6

本人现在的研究方向是:
图像的语义分割,如果有志同道合的朋友,可以组队学习
[email protected] qq:1355365561

你可能感兴趣的:(deep,learning)