利用tensorflow的优化器(本文使用梯度下降算法)(关于tensorflow的优化器详见:https://www.jianshu.com/writer#/notebooks/29416844/notes/50316224)
方式一:一次性喂入数据(推荐)
%%time
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib auto
# 待输入的原始数据
X_true = tf.placeholder("float")
Y_true = tf.placeholder("float")
# 一次函数系数(待确定的系数)
w = tf.Variable(0.0, name="weight")
b = tf.Variable(0.0, name="bias")
# 一次函数模型
Y_pre = X_true*w + b
# 定义损失函数
loss = tf.square(Y_true - Y_pre)
# 定义优化算子
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
# # Create session to run
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
# 准备数据
X_input = np.array([1,2,3])
Y_input = np.array([1.5,2.,2.5])
#定义epoch次数
all_epoch = 10
epoch = 1
#############################################################################################
for i in range(all_epoch): #epoch循环
#调用优化算子(核心步骤)
_, w_value, b_value = sess.run([train_op, w, b],feed_dict={X_true:X_input,Y_true:Y_input})
#draw
plt.plot(X_input,Y_input,"+")
plt.plot(X_input,X_input.dot(w_value)+b_value)
plt.show()
plt.pause(0.1)
print("Epoch: {}, w: {}, b: {}".format(epoch, w_value, b_value))
epoch += 1
#draw
plt.figure(2)
plt.plot(X_input,Y_input,"+")
plt.plot(X_input,X_input.dot(w_value)+b_value)
plt.show()
输出结果:
Epoch: 1, w: 0.25999999046325684, b: 0.11999999731779099
Epoch: 2, w: 0.4327999949455261, b: 0.20159998536109924
Epoch: 3, w: 0.5474240183830261, b: 0.25756800174713135
Epoch: 4, w: 0.623237133026123, b: 0.2964230477809906
Epoch: 5, w: 0.6731599569320679, b: 0.3238492012023926
Epoch: 6, w: 0.7058132886886597, b: 0.3436390459537506
Epoch: 7, w: 0.7269488573074341, b: 0.3583230972290039
Epoch: 8, w: 0.7404044270515442, b: 0.36958983540534973
Epoch: 9, w: 0.7487404346466064, b: 0.3785659074783325
Epoch: 10, w: 0.7536652088165283, b: 0.3860031068325043
Wall time: 2.15 s
方式二:用户逐个喂入数据(不推荐)
%%time
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib auto
# 待输入的原始数据
X_true = tf.placeholder("float")
Y_true = tf.placeholder("float")
# 一次函数系数(待确定的系数)
w = tf.Variable(0.0, name="weight")
b = tf.Variable(0.0, name="bias")
# 一次函数模型
Y_pre = X_true*w + b
# 定义损失函数
loss = tf.square(Y_true - Y_pre)
# 定义优化算子
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
# # Create session to run
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
# 准备数据
X_input = np.array([1,2,3])
Y_input = np.array([1.5,2.,2.5])
#定义epoch次数
all_epoch = 10
epoch = 1
############################################################################################
for i in range(all_epoch): #epoch循环
for (x, y) in zip(X_input, Y_input): #逐点输入优化器更in参数
# print("x={},y={}".format(x,y))
_, w_value, b_value = sess.run([train_op, w, b],feed_dict={X_true: x,Y_true: y})
#draw
plt.plot(X_input,Y_input,"+")
plt.plot(X_input,X_input.dot(w_value)+b_value)
plt.show()
plt.pause(0.1)
print("Epoch: {}, w: {}, b: {}".format(epoch, w_value, b_value))
epoch += 1
#draw
plt.figure(2)
plt.plot(X_input,Y_input,"+")
plt.plot(X_input,X_input.dot(w_value)+b_value)
plt.show()
输出结果:
Epoch: 1, w: 0.029999999329447746, b: 0.029999999329447746
Epoch: 1, w: 0.10639999806880951, b: 0.0681999996304512
Epoch: 1, w: 0.2331559956073761, b: 0.11045199632644653
Epoch: 2, w: 0.25628381967544556, b: 0.13357983529567719
Epoch: 2, w: 0.3104379177093506, b: 0.1606568843126297
Epoch: 2, w: 0.39491966366767883, b: 0.18881747126579285
Epoch: 3, w: 0.41324493288993835, b: 0.20714272558689117
……………………
Wall time: 5.48 s
总结:
比较两种方法的“最终结果”实际上完全相同的,更新过程本质上也是相同的,只是第一种方法优化算子会对一次性输入的每个数据点进行相关的计算,然后再求和,最终一次性更新变量,因此更新过程中只有10条直线输出(一个epoch一条);而逐点输入时,优化算子会对每一个数据点进行一次计算,同时更新参数,因此可以把每个点的更新数据输出绘图,所以有3(数据点)×10(epoch总数)=30条直线。在程序上,主要的区别是,逐点输入时,用户必须多增加一个for循环将数据驻点输入,一次性输入时,这个for循环相当于交给了优化算子自动去执行,而不必用户自己处理。这两个过程本质上是完全一样的。但更推荐第一种方法,让tensorflow的优化算子自动去处理多个数据,时间更快,效率更高。
相关链接:
非常详细的线性拟合:https://blog.csdn.net/weixin_42008209/article/details/82715202