核心步骤
1.准备数据
2.构建数据
3.训练模型
4.进行预测
线性方程
单变量的线性方程可以表示为:
y=w*x+b
本例通过生成人工数据集。随机生成一个近似采样随机分布,使得
w=2.0, b=1, 并加入一个噪声,噪声的最大振幅为0.4
人工数据集生成
import tensorflow as tf#载入tensorflow import numpy as np#载入numpy import matplotlib.pyplot as plt#载入matplotlib #设置随机数种子 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(*x_data.shape)*0.4
利用matplotlib画出生成结果
##利用matplotlib画出生成结果 #画出随机生成数据的散点图 plt.scatter(x_data,y_data) #画出我们想要学习到的线性函数y=2x+1 plt.plot(x_data,2*x_data+1.0,color='red',linewidth=3) plt.show()
构建模型
##构建模型 #定义训练数据的占位符,x是特征值,y是标签值 x=tf.placeholder("float",name="x") y=tf.placeholder("float",name="y") #定义模型函数 def model(x,w,b): return tf.multiply(x,w)+b
定义模型结构
创建变量
TensorFlow变量的声明函数是tf.Variable
tf.Variable的作用是保存和更新参数
变量的初始值可以是随机数、常数、或是通过其他变量的初始值计算得到
##定义模型结构 #创建变量 #构建线性函数的斜率,变量w w=tf.Variable(1.0,name="w0") #构建线性函数的截距,变量b b=tf.Variable(0.0,name="b0") #pred是预测值,前向计算 pre=model(x,w,b)
训练模型
设置训练参数
##训练模型 #迭代次数(训练轮数) train_epochs=10 #学习率 learning_rate=0.5
定义损失函数
损失函数用于描述预测值与真实值之间的误差,从而指导模型收敛方向。常见损失函数:均方差(Mean Square Error, MSE)和交叉熵(cross-entropy)
L2 损失函数
##定义损失函数 #采用均方差作为损失函数 loss_function=tf.reduce_mean(tf.square(y-pred))
定义优化器
定义优化器Optimizer,初始化一个GradientDescentOptimizer
设置学习率和优化目标:最小化损失
##定义优化器 #梯度下降优化器 optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
创建会话
##创建会话 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_function],feed_dict={x:xs,y:ys}) b0temp=b.eval(session=sess) w0temp=w.eval(session=sess) #画图 plt.plot(x_data,w0temp*x_data+b0temp)
迭代训练结果
从上图可以看出,本案例所拟合的模型较简单,训练3次之后已经接近收敛对于复杂模型,需要更多次训练才能收敛
结果查看
结果
当训练完成后,打印查看参数 print("w",sess.run(w))#w的值应该在2附近 print("b",sess.run(b))#b的值应该在1附近
w 2.1227033
b 1.046243
结果可视化
plt.scatter(x_data,y_data,label='Original data') plt.plot(x_data,x_data*sess.run(w)+sess.run(b),\ lable='Fitted line',color='r',linewidth=3) plt.legend(loc=2)#通过参数loc指定图例位置
利用模型 进行预测
#利用模型预测 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)
预测值:7.860121
目标值:7.420000
小结
(1)生成人工数据集及其可视化
(2)构建线性模型
(3)定义损失函数
(4)定义优化器、最小化损失函数
(5)训练结果的可视化
(6)利用学习到的模型进行预测
显示损失值
##迭代训练 #开始训练,轮数为epoch,采用SGD随机梯度下降优化方法 step=0#记录训练次数 loss_list=[]#用于保存loss值的列表 for epoch in range(train_epochs): for xs,ys in zip(x_data,y_data): _,loss=sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys}) #显示损失值loss #display_step:控制报告粒度 #例如如果display_step设为2,则将每训练2个样本输出一次损失值 #与超参数不同,修改display_step不会更改模型所学习的规律 display_step=10 loss_list.append(loss) step=step+1 if step % display_step==0: print("Train Epoch:",'%02d' % (epoch+1),"Step:%03d" % (step),"loss=",\ "{:.9f}".format(loss)) b0temp=b.eval(session=sess) w0temp=w.eval(session=sess)
Train Epoch: 01 Step:010 loss= 0.142807513
Train Epoch: 01 Step:020 loss= 2.077342749
Train Epoch: 01 Step:030 loss= 0.002882579
Train Epoch: 01 Step:040 loss= 0.515065134
Train Epoch: 01 Step:050 loss= 0.015309114
Train Epoch: 01 Step:060 loss= 0.027440201
Train Epoch: 01 Step:070 loss= 2.683870554
Train Epoch: 01 Step:080 loss= 0.020359127
Train Epoch: 01 Step:090 loss= 0.137483820
Train Epoch: 01 Step:100 loss= 0.000411486
Train Epoch: 02 Step:110 loss= 0.000086412
Train Epoch: 02 Step:120 loss= 2.024667263
Train Epoch: 02 Step:130 loss= 0.006071734
Train Epoch: 02 Step:140 loss= 0.474449933
Train Epoch: 02 Step:150 loss= 0.008577253
Train Epoch: 02 Step:160 loss= 0.038185447
Train Epoch: 02 Step:170 loss= 2.601174593
Train Epoch: 02 Step:180 loss= 0.015048586
Train Epoch: 02 Step:190 loss= 0.126568303
Train Epoch: 02 Step:200 loss= 0.000983429
Train Epoch: 03 Step:210 loss= 0.170813769
Train Epoch: 03 Step:220 loss= 2.023455858
Train Epoch: 03 Step:230 loss= 0.006033598
Train Epoch: 03 Step:240 loss= 0.474852115
Train Epoch: 03 Step:250 loss= 0.008635622
Train Epoch: 03 Step:260 loss= 0.038067851
Train Epoch: 03 Step:270 loss= 2.602004528
Train Epoch: 03 Step:280 loss= 0.015098289
Train Epoch: 03 Step:290 loss= 0.126676723
Train Epoch: 03 Step:300 loss= 0.000976413
Train Epoch: 04 Step:310 loss= 0.167299852
Train Epoch: 04 Step:320 loss= 2.023467541
Train Epoch: 04 Step:330 loss= 0.006033977
Train Epoch: 04 Step:340 loss= 0.474848181
Train Epoch: 04 Step:350 loss= 0.008635025
Train Epoch: 04 Step:360 loss= 0.038069107
Train Epoch: 04 Step:370 loss= 2.601995945
Train Epoch: 04 Step:380 loss= 0.015097762
Train Epoch: 04 Step:390 loss= 0.126675367
Train Epoch: 04 Step:400 loss= 0.000976473
Train Epoch: 05 Step:410 loss= 0.167335451
Train Epoch: 05 Step:420 loss= 2.023467302
Train Epoch: 05 Step:430 loss= 0.006033987
Train Epoch: 05 Step:440 loss= 0.474848181
Train Epoch: 05 Step:450 loss= 0.008635025
Train Epoch: 05 Step:460 loss= 0.038069062
Train Epoch: 05 Step:470 loss= 2.601996422
Train Epoch: 05 Step:480 loss= 0.015097790
Train Epoch: 05 Step:490 loss= 0.126675367
Train Epoch: 05 Step:500 loss= 0.000976473
Train Epoch: 06 Step:510 loss= 0.167335063
Train Epoch: 06 Step:520 loss= 2.023467541
Train Epoch: 06 Step:530 loss= 0.006033987
Train Epoch: 06 Step:540 loss= 0.474848181
Train Epoch: 06 Step:550 loss= 0.008635025
Train Epoch: 06 Step:560 loss= 0.038069062
Train Epoch: 06 Step:570 loss= 2.601996422
Train Epoch: 06 Step:580 loss= 0.015097790
Train Epoch: 06 Step:590 loss= 0.126675367
Train Epoch: 06 Step:600 loss= 0.000976473
Train Epoch: 07 Step:610 loss= 0.167335063
Train Epoch: 07 Step:620 loss= 2.023467541
Train Epoch: 07 Step:630 loss= 0.006033987
Train Epoch: 07 Step:640 loss= 0.474848181
Train Epoch: 07 Step:650 loss= 0.008635025
Train Epoch: 07 Step:660 loss= 0.038069062
Train Epoch: 07 Step:670 loss= 2.601996422
Train Epoch: 07 Step:680 loss= 0.015097790
Train Epoch: 07 Step:690 loss= 0.126675367
Train Epoch: 07 Step:700 loss= 0.000976473
Train Epoch: 08 Step:710 loss= 0.167335063
Train Epoch: 08 Step:720 loss= 2.023467541
Train Epoch: 08 Step:730 loss= 0.006033987
Train Epoch: 08 Step:740 loss= 0.474848181
Train Epoch: 08 Step:750 loss= 0.008635025
Train Epoch: 08 Step:760 loss= 0.038069062
Train Epoch: 08 Step:770 loss= 2.601996422
Train Epoch: 08 Step:780 loss= 0.015097790
Train Epoch: 08 Step:790 loss= 0.126675367
Train Epoch: 08 Step:800 loss= 0.000976473
Train Epoch: 09 Step:810 loss= 0.167335063
Train Epoch: 09 Step:820 loss= 2.023467541
Train Epoch: 09 Step:830 loss= 0.006033987
Train Epoch: 09 Step:840 loss= 0.474848181
Train Epoch: 09 Step:850 loss= 0.008635025
Train Epoch: 09 Step:860 loss= 0.038069062
Train Epoch: 09 Step:870 loss= 2.601996422
Train Epoch: 09 Step:880 loss= 0.015097790
Train Epoch: 09 Step:890 loss= 0.126675367
Train Epoch: 09 Step:900 loss= 0.000976473
Train Epoch: 10 Step:910 loss= 0.167335063
Train Epoch: 10 Step:920 loss= 2.023467541
Train Epoch: 10 Step:930 loss= 0.006033987
Train Epoch: 10 Step:940 loss= 0.474848181
Train Epoch: 10 Step:950 loss= 0.008635025
Train Epoch: 10 Step:960 loss= 0.038069062
Train Epoch: 10 Step:970 loss= 2.601996422
Train Epoch: 10 Step:980 loss= 0.015097790
Train Epoch: 10 Step:990 loss= 0.126675367
Train Epoch: 10 Step:1000 loss= 0.000976473
图形化显示损失值
plt.plot(loss_list) plt.plot(loss_list,'r+')
随机梯度下降
在梯度下降法中,批量指的是用于在单次迭代中计算梯度的样本总数 假定批量是指整个数据集,数据集通常包含很大样本(数万甚至数千亿), 此外, 数据集通常包含多个特征。因此,一个批量可能相当巨大。如果是超大批量,则单次迭代就可能要花费很长时间进行计算
随机梯度下降法 (SGD) 每次迭代只使用一个样本(批量大小为 1),如果进行足够的迭代,SGD 也可以发挥作用。“随机”这一术语表示构成各个批量的一个样本都是随机选择的
小批量随机梯下降法(小批量 SGD)是介于全批量迭代与 SGD 之间的折衷方案。小批量通常包含 10-1000 个随机选择的样本。小批量SGD可以减少 SGD 中的杂乱样本数量,但仍然比全批量更高效