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
本人现在的研究方向是:
图像的语义分割,如果有志同道合的朋友,可以组队学习
haiyangpengai@gmail.com qq:1355365561