首先需要讲一个东西,优化器Optimizer。我们Optimizer是一个抽象类,我们一般用其子类 GradientDescentOptimizer,一个基于梯度下降的优化器。
GradientDescentOptimizer的初始化函数如下:
__init__(
learning_rate,
use_locking=False,
name='GradientDescent'
)
其中
learning_rate为学习率,就是梯度下降算法中的步长
use_locking为是否使用锁,这个一般默认否
name为名字,默认就好
GradientDescentOptimizer还有一个重要的方法是minimize方法
minimize(
loss,
global_step=None,
var_list=None,
gate_gradients=GATE_OP,
aggregation_method=None,
colocate_gradients_with_ops=False,
name=None,
grad_loss=None
)
其中
loss为一个要最小化的张量
global_step为一个可选变量,在每次优化后自增1(好像没用呀)
var_list为要优化的变量列表,如果不定义的话,优化器会自动去loss张量的图中找变量来优化
其他的。。。一般没用到。。。
**除了优化器外,还要讲两个常用函数,其中一个是tf.reduce_mean **
tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。
reduce_mean(input_tensor,
axis=None,
keep_dims=False,
name=None,
reduction_indices=None)
第一个参数input_tensor: 输入的待降维的tensor;
第二个参数axis: 指定的轴,如果不指定,则计算所有元素的均值;
第三个参数keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
第四个参数name: 操作的名称;
第五个参数 reduction_indices:在以前版本中用来指定轴,已弃用;
类似函数还有:
tf.reduce_sum :计算tensor指定轴方向上的所有元素的累加和;
tf.reduce_max : 计算tensor指定轴方向上的各个元素的最大值;
tf.reduce_all : 计算tensor指定轴方向上的各个元素的逻辑和(and运算);
tf.reduce_any: 计算tensor指定轴方向上的各个元素的逻辑或(or运算);
**还有一个函数是tf.square **
tf.square(x)就简单了,对x内所有的元素进行平方。
好了,直接开干代码如下
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 定义好初始数据
x_data = np.random.rand(100)
# 这个就是我们要逼近的函数了
y_data = x_data * 0.1 + 0.3
# 定义两个变量作为优化目标,0.的意思表示我们需要使用一个小数
k = tf.Variable(0.5)
b = tf.Variable(0.5)
# 画个图来表示最后要输出的y
y = k * x_data + b
# 定义好误差为真实数据与模拟数据的差的平方和,注意y在前,y_data在后
loss = tf.reduce_mean(tf.square(y - y_data))
#定义一个优化器来进行优化
optimizer = tf.train.GradientDescentOptimizer(0.2)
# 调用minimize方法自动去找变量k和b,使用梯度下降法优化这两个值
train = optimizer.minimize(loss)
#因为用到了变量,需要搞个初始化的东西
init = tf.global_variables_initializer()
with tf.Session() as sess:
# 不要忘了初始化变量
sess.run(init)
# 训练两百次
for step in range(200):
sess.run(train)
if step % 20 == 0:
print(step,sess.run([k,b]))
输出如下
0 [0.38804856, 0.32861382]
20 [0.21618558, 0.22901425]
40 [0.16851577, 0.25813898]
60 [0.14040442, 0.27531412]
80 [0.12382691, 0.2854425]
100 [0.114050955, 0.2914153]
120 [0.10828598, 0.29493752]
140 [0.10488632, 0.2970146]
160 [0.102881506, 0.2982395]
180 [0.10169925, 0.29896182]
可以看到两个变量逐渐向原来的参数逼近