强烈推荐
一个神经网络博主:网站地址
写在前面:对于优化器,笔者学习时对于优化器的工作原理感到很疑惑,在上网查了一些资料和自己编写代码实验后终于发现了优化器的工作体现在哪!!!
笔者是纯萌新,这是学习时的学习笔记,如果理解不对还望大佬指出!!!
笔者使用的是tensorflow1.14.0和ubuntu16.04!!!
1.提出问题
优化器optimizer在代码中一般以train_op = tf.train.GradientDescentOptimizer(0.001).minimize(z)
的一句代码运行,但这句代码为何在sess的不断迭代中可以达到自己的目标(即将z最小化),它是依托什么来实现的呢?
2.笔者的尝试
第一次:笔者编写了以下代码
import tensorflow as tf
###########################################
#x = tf.constant(0, dtype=tf.float32)
#y = tf.constant(3, dtype=tf.float32)
x = tf.Variable(tf.constant(5, dtype=tf.float32))
#y = tf.Variable(tf.constant(3, dtype=tf.float32))
z = tf.square(x)
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(z)#学习率0.01 ,目标最小化z
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())#变量初始化
for i in range(200):
sess.run(train_op)
if i % 10 == 0:
z_value = sess.run(z)
x_value = sess.run(x)
#y_value = sess.run(y)
print("After %s iteration(s): x%s is %f, z is %f,learning rate is %f." %
(i + 1, i + 1, x_value,z_value, 0.05))
此代码中,笔者取了初始值为5的一个变量x,目的是通过优化器来最小化z的取值,在循环200次运行后的结果:
从图片可以看出,随着循环的次数,x的值都在改变;也就是优化器在改变程序中变量的值来达到自己的目的,笔者将这个结果作为一个猜想,对程序进行了修改
第二次:
import tensorflow as tf
###########################################
#x = tf.constant(0, dtype=tf.float32)
#y = tf.constant(3, dtype=tf.float32)
x = tf.Variable(tf.constant(5, dtype=tf.float32))
#y = tf.Variable(tf.constant(3, dtype=tf.float32))
z = tf.square(x+1)
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(z)#学习率0.01 ,目标最小化z
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())#变量初始化
for i in range(200):
sess.run(train_op)
if i % 10 == 0:
z_value = sess.run(z)
x_value = sess.run(x)
#y_value = sess.run(y)
print("After %s iteration(s): x%s is %f, z is %f,learning rate is %f." %
(i + 1, i + 1, x_value,z_value, 0.05))
笔者这里仅修改了z的值,将z = tf.square(x)
改为了z = tf.square(x+1)
,尝试后发现结果:
在循环运行后x变量的值变成了-1,从某种程度上佐证了笔者的观点:笔者再提出问题,那是不是优化器会修改用来定义的像a、b、c这样的字母的值呢,
第三次:
import tensorflow as tf
###########################################
#x = tf.constant(0, dtype=tf.float32)
y = tf.constant(3, dtype=tf.float32)
x = tf.Variable(tf.constant(5, dtype=tf.float32))
#y = tf.Variable(tf.constant(3, dtype=tf.float32))
z = tf.square(x+y)
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(z)#学习率0.01 ,目标最小化z
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())#变量初始化
for i in range(200):
sess.run(train_op)
if i % 10 == 0:
z_value = sess.run(z)
x_value = sess.run(x)
y_value = sess.run(y)
print("After %s iteration(s): x%s is %f, y is %f z is %f,learning rate is %f." %
(i + 1, i + 1, x_value,y_value,z_value, 0.05))
笔者在此段代码中定义了常量y的值为3,这样代码中x为变量,y为常量,z的值为x+y的平方,运行代码后:
在这里笔者发现y的值没有变化,只有x的值在变化;到这里笔者的猜想基本被证实了,说明优化器就是通过修改与目的相关的变量来达到自己的目的!!!那如果两个都是常量会怎么样呢?
第四次:
import tensorflow as tf
###########################################
x = tf.constant(5, dtype=tf.float32)
y = tf.constant(3, dtype=tf.float32)
#x = tf.Variable(tf.constant(5, dtype=tf.float32))
#y = tf.Variable(tf.constant(3, dtype=tf.float32))
z = tf.square(x+y)
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(z)#学习率0.01 ,目标最小化z
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())#变量初始化
for i in range(200):
sess.run(train_op)
if i % 10 == 0:
z_value = sess.run(z)
x_value = sess.run(x)
y_value = sess.run(y)
print("After %s iteration(s): x%s is %f, y is %f z is %f,learning rate is %f." %
(i + 1, i + 1, x_value,y_value,z_value, 0.05))
在这里笔者将x和y都定义成了常量,运行后发现:
直接报错!!!!没有变量可以用来优化!!!!结果也已经很明朗了,那如果两个变量,优化器会怎么办呢?
第五次:
import tensorflow as tf
###########################################
#x = tf.constant(5, dtype=tf.float32)
#y = tf.constant(3, dtype=tf.float32)
x = tf.Variable(tf.constant(50, dtype=tf.float32))
y = tf.Variable(tf.constant(3, dtype=tf.float32))
z = tf.square(x+y)
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(z)#学习率0.01 ,目标最小化z
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())#变量初始化
for i in range(200):
sess.run(train_op)
if i % 10 == 0:
z_value = sess.run(z)
x_value = sess.run(x)
y_value = sess.run(y)
print("After %s iteration(s): x%s is %f, y is %f z is %f,learning rate is %f." %
(i + 1, i + 1, x_value,y_value,z_value, 0.05))
这里笔者将x和y都设置成了变量,且为了更明显,笔者将x的初值设为50,y的初值设为3,运行结果如下:
图中可以看出,两个变量的值同时在改变,到这里,优化器在代码中的功能也能清晰了!!!