1 机器学习核心步骤
- 准备数据
- 构建模型
- 训练模型
- 进行预测
上述步骤是使用TensorFlow进行算法设计与训练的核心步骤。
2 线性回归问题举例
下面通过线性回归问题的简单例子,介绍实现机器学习的思路,重点讲解了下述步骤:
- 生成人工数据集及其可视化
- 构建线性模型
- 定义损失函数
- 定义优化器、最小损失函数
- 训练结果的可视化
- 利用学习到的模型进行预测
2.1 生成人工数据集及其可视化
#在jupyter中,使用matplotlib显示图像需要设置为inline模式,否则不会显示图像
%matplotlib inline
import matplotlib.pyplot as plt #载入matplotlib
import numpy as np #载入numpy
import tensorflow as tf #载入TensorFlow
#设置随机数种子
np.random.seed(5)
#直接采用np生成等差数列的方法,生成100个点,每个点的取值在-1~1之间
x_data = np.linspace(-1,1,100)
# y = 2x + 1 + 噪声,其中噪声的维度与x_data一致
y_data = 2 * x_data + 1.0 + np.random.randn(*x_data.shape) * 0.4
#画出随机生成数据的散点图
plt.scatter(x_data,y_data)
#画出我们想要学习到的线性函数y = 2x + 1
plt.plot(x_data,2 * x_data + 1.0,color="red",linewidth=3)
2.2 构建线性模型
#构建模型
x = tf.placeholder("float",name="x")
y = tf.placeholder("float",name="y")
def model(x,w,b):
return tf.multiply(x,w)+b
#定义模型结构
#构建线性函数的斜率,变量“w0”
w = tf.Variable(1.0,name="w0")
#构建线性函数的截距,变量“b0”
b = tf.Variable(0.0,name="b0")
#pred 是预测值,前向计算
pred = model(x,w,b)
2.3 定义损失函数
#定义损失函数
#采用均方差作为损失函数
loss_funtion = tf.reduce_mean(tf.square(y-pred))
2.4 定义优化器、最小化损失函数
#训练模型
#迭代次数(训练轮数)
train_epochs = 10
#学习率
learning_rate = 0.05
#定义优化器
#梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_funtion)
2.5 训练结果及其可视化
训练结果:
#创建会话
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
#迭代训练
#开始训练,轮数为epoch,采用SGD随机梯度下降优化方法
for epoch in range(train_epochs):
for xs,ys in zip(x_data,y_data):
_,loss = sess.run([optimizer,loss_funtion],feed_dict={x:xs,y:ys})
b0temp = b.eval(session=sess)
w0temp = w.eval(session=sess)
plt.plot(x_data,w0temp * x_data + b0temp) #画图
结果可视化:
print("w:",sess.run(w))
print("b:",sess.run(b))
plt.scatter(x_data,y_data,label="original data")
plt.plot(x_data,x_data * sess.run(w) + sess.run(b),\
label="Filted line",color="r",linewidth=3)
plt.legend(loc=2)#通过参数loc指定图例位置
2.6 利用学习到的模型进行预测
#利用模型,进行预测
x_test = 3.21
predict = sess.run(pred,feed_dict={x:x_test})
print("预测值:%f" % predict)
target = 2*x_test + 1.0
print('目标值:%f' % target)
3 线性回归问题的显示损失函数
#在jupyter中,使用matplotlib显示图像需要设置为inline模式,否则不会显示图像
%matplotlib inline
import matplotlib.pyplot as plt #载入matplotlib
import numpy as np #载入numpy
import tensorflow as tf #载入TensorFlow
#设置随机数种子
np.random.seed(5)
#直接采用np生成等差数列的方法,生成100个点,每个点的取值在-1~1之间
x_data = np.linspace(-1,1,100)
# y = 2x + 1 + 噪声,其中噪声的维度与x_data一致
y_data = 2 * x_data + 1.0 + np.random.randn(*x_data.shape) * 0.4
#画出随机生成数据的散点图
plt.scatter(x_data,y_data)
#画出我们想要学习到的线性函数y = 2x + 1
#plt.plot(x_data,2 * x_data + 1.0,color="red",linewidth=3)
#构建模型
x = tf.placeholder("float",name="x")
y = tf.placeholder("float",name="y")
def model(x,w,b):
return tf.multiply(x,w)+b
#定义模型结构
#构建线性函数的斜率,变量“w0”
w = tf.Variable(1.0,name="w0")
#构建线性函数的截距,变量“b0”
b = tf.Variable(0.0,name="b0")
#pred 是预测值,前向计算
pred = model(x,w,b)
如下添加了
#控制显示loss值的粒度
display_step = 10
#训练模型
#迭代次数(训练轮数)
train_epochs = 10
#学习率
learning_rate = 0.05
#控制显示loss值的粒度
display_step = 10
#定义损失函数
#采用均方差作为损失函数
loss_funtion = tf.reduce_mean(tf.square(y-pred))
#定义优化器
#梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_funtion)
如下添加了:
#显示损失值loss
#控制报告的粒度
#例如,如果display_step设为2,则将每训练2个样本输出一个损失值
#与超参数不同,修改display_step 不会更改模型所学习的规律
loss_list.append(loss)
step += 1
if step % display_step == 0:
print(“Train step:”,"%02d" % (epoch+1),“step:%03d” % (step),“loss=”,
“{:.9f}”.format(loss))
for epoch in range(train_epochs):
for xs,ys in zip(x_data,y_data):
_,loss = sess.run([optimizer,loss_funtion],feed_dict={x:xs,y:ys})
#显示损失值loss
#控制报告的粒度
#例如,如果display_step设为2,则将每训练2个样本输出一个损失值
#与超参数不同,修改display_step 不会更改模型所学习的规律
loss_list.append(loss)
step += 1
if step % display_step == 0:
print("Train step:","%02d" % (epoch+1),"step:%03d" % (step),"loss=",\
"{:.9f}".format(loss))
b0temp = b.eval(session=sess)
w0temp = w.eval(session=sess)
plt.plot(x_data,w0temp * x_data + b0temp) #画图
plt.plot(loss_list)
plt.plot(loss_list,"r.")