Tensorflow入门(5)——线性回归

一、术语

  • 标签是我们要预测的真实事物:y;线性回归中的y变量
  • 特征是指用于描述数据的输入变量:xi;线性回归中的{x1 ,x2 ,…,xn}变量
  • 样本是指数据的特定实例:x
  • 有标签样本具有{特征,标签}{xy} 用于训练模型
  • 无标签样本具有{特征,?}{x?} 用于对新数据做出预测
  • 模型可将样本映射到预测标签:y由模型的内部参数定义,这些内部参数值是通过学习得到的
  • 训练模型表示通过有标签样本来学习(确定)所有权重和偏差的理想值。在监督式学习中,机器学习算法通过以下方式构建模型: 检查多个样本并尝试找出可最大限度地减少损失的模型,损失是对糟糕预测的惩罚
  • 损失是一个数值,表示对于单个样本而言模型预测的准确程度。如果模型的预测完全准确,则损失为零,否则损失会较大。训练模型的目标是从所有样本中找到一组平均损失“较小”的权重和偏差
  • 损失函数:创建一个数学函数(损失函数),以有意义的方式汇总各个损失。线性回归模型使用的是一种称为平方损失(又称为 L2 损失)的损失函数。单个样本的平方损失: 预测值和标签值之差的平方= (y - y')²均方误差 (MSE) 指的是每个样本的平均平方损失。要计算 MSE,请求出各个样本的所有平方损失之和,然后除以样本数量:

       虽然 MSE 常用于机器学习,但它既不是唯一实用的损失函数,也不是适用于所有情形的 最佳损失函数
 

二、训练模型与损失降低

1.训练模型的迭代方法

 首先对权重w和偏差b进行初始猜测,然后反复调整这些猜测。直到获得损失可能最低的权重和偏差为止。

2.收敛

在学习优化过程中,机器学习系统将根据所有标签去重新评估所有特征,为损失函数生成一个新值, 而该值又产生新的参数值。 通常,可以不断迭代,直到总体损失不再变化戒至少变化极其缓慢为止。这时候,我们可以说该模
型已 收敛。
 
3.梯度下降法
 
梯度:一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值, 即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大。
梯度下降法(gradient descent): 一种通过计算并且减小梯度将损失降至最低的技术,它以训练数据为条 件,来计算损失相对于模型参数的梯度。 通俗来说,梯度下降法以迭代方式调整参数,逐渐找到权重和偏差的最佳组合,从而将损失降至最低 。

梯度 是矢量:具有 方向 大小。 沿着 负梯度方向 进行下一步探索
用梯度乘以一个称为 学习速率 (有时也称为 步长 )的标量,以确定下一个点的位置

4.学习率的设置
 
每个回归问题都存在一个合适的学习速率,不损失函数的平坦程度相关。如果损失函数的梯度较小, 则可以放心地试着采用更大的学习速率,以补偿较小的梯度并获得更大的步长。

5.超参数

 

在机器学习中,超参数是在开始学习过程之前设置值的参数,而丌是通过训练得到的参数数据 通常情况下,需要对超参数进行优化,选择一组好的超参数,可以提高学习的性能和效果 超参 是编程人员在机器学习算法中用于调整的旋钮 典型超参数: 学习率、神经网络的隐含层数 量....

三、线性回归代码实现

#在Jupyter中,用matplotlib显示图像需要设置为inline模式,否则不会出现图像
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf

# 设置随机种子
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)
# 画出想要学习到的线性函数
plt.plot(x_data,2*x_data+1.0,color='red',linewidth=3)

# 定义训练数据的占位符,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

# 创建变量,斜率w,截距b,pred预测值
w=tf.Variable(1.0,name='w0')
b=tf.Variable(0.0,name='b0')
pred=model(x,w,b)

# 设置训练参数
# 迭代次数(训练轮数)
train_epochs=10
#学习率
learning_rate=0.05

# 定义损失函数
# 采用均方差作为损失函数
loss_function = tf.reduce_mean(tf.pow((y-pred),2))

# 梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)

# 创建会话和初始化
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

# 训练
step=0
loss_list=[]  #用于保存loss的列表,之后显示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})  
        # display_step:控制报告的粒度,即每训练几次输出一次损失值
        # 与超参数不同,修改display_step不会改变模型所学习的规律
        loss_list.append(loss)
        step=step+1
        display_step=10
        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)
    plt.plot (x_data, b0temp + w0temp * x_data )# 画图
    
print  ("w:", sess.run(w)) # w的值应该在2附近 
print ("b:", sess.run(b)) # b的值应该在1附近 
# 从上图可以看出,由于本案例所拟合的模型较简单,训练3次之后已经接近收敛。
# 对于复杂模型,需要更多次训练才能收敛。

# 模型可视化
plt.scatter(x_data,y_data,label='Original data')
plt.plot (x_data, x_data * sess.run(w) + sess.run(b),label='Fitted line')
plt.legend(loc=2)# 通过参数loc指定图例位置

# 预测
x_test = 12.0
output = sess.run(w)  * x_test + sess.run(b)
print("预测值:%f" % output)
target = 2 * x_test + 1.0
print("目标值:%f" % target)

# 图形化显示损失值
plt.subplot(1,2,1)
plt.plot(loss_list)
plt.subplot(1,2,2)
plt.plot(loss_list,'r+')

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值