1.导入模块
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
from matplotlib import pyplot as plt
%matplotlib inline
#导入tensorflow模块
import tensorflow as tf
2.生成训练数据
X_train = np.linspace(0,10,num=20)+np.random.randn(20)
Y_train = np.linspace(1,4,num=20)+np.random.randn(20)
n_samples = 20
3.模拟构造线性方程
由于是线性回归,因此表达式可以表示为:f(x)=Wx+b —-> y = Wx+b
tensorflow的办法是,使用X,Y作为占位符,并使用随机的W,b
#创建X,Y占位符
X = tf.placeholder('float')
Y = tf.placeholder('float')
#随机生成一个W,b,作为斜率和截距
W = tf.Variable(np.random.randn())
b = tf.Variable(np.random.randn())
#根据模拟线性方程得出预测值
y_pre = W*X+b
4.构造成本函数
#成本函数cost:是实际输出和预测输出之间的方差,这也称为最小二乘法。
cost = tf.reduce_sum(tf.pow(y_pre-Y,2))/n_samples
5.梯度下降
#learning_rate:学习率,是进行训练时在最陡的梯度方向上所采取的「步」长;
learning_rate = 0.01
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
6.TensorFlow初始化,并进行训练
#tensorflow初始化
init = tf.global_variables_initializer()
#开始训练
with tf.Session() as sess:
#初始化
sess.run(init)
#训练所有数据,50次循环
for epoch in range(50):
for (x,y) in zip(X_train,Y_train):
#用真实值x,y代替占位符X,Y,每次循环都执行梯度下降算法
sess.run(optimizer,feed_dict={X:x,Y:y})
#每执行50次显示运算结果
if True:
#用训练数据替换占位符,计算出cost最小二乘法偏差和
c = sess.run(cost,feed_dict={X:X_train,Y:Y_train})
print('Epoch:','%04d'%(epoch+1),'cost=','{:.9f}'.format(c),
'W=',sess.run(W),'b=',sess.run(b))
print('Optimization Finished!')
#数据可视化
plt.plot(X_train, Y_train, 'ro', label='Original data')
#f(x) = w*x + b
plt.plot(X_train, sess.run(W) * X_train + sess.run(b), label='Fitted line')
plt.legend()