roger.svg

Hello there!

To earn a life is to lose it.

TensorFlow-2学习笔记-3-线性回归

谷歌机器学习速成课程:https://developers.google.cn/machine-learning/crash-course/

监督式机器学习 通过学习如何组合输入信息,来对未见过的数据,做出有用的预测

简单的线性回归案例比如 y=w*x+b 标签是要预测的东西,即上面简单案例中的 y 特征是描述数据的输入变量,{x1,x2,x3...xn} 样本数据的特定实例,即 x 有标签样本{特征,标签}:{x,y}用于训练模型 无标签样本{特征,?}:{x,?}用于预测数据

在监督式学习中,训练模型的过程就是不断尝试尽可能减小损失的过程,通过有标签样本来学习(确定)所有权重和偏差的理想值 L1 损失:yi 与实际值 y 的差的绝对值 L2 损失(平方损失) 均方误差 (MSE): 每个样本的平均平方损失

对于 y=w*x+b,首先对 w 和 b 进行初始猜测,然后不断调整直至收敛

对于凸形问题存在一个斜率正好为 0 的位置, 这个最小值就是损失函数收敛之处

梯度:一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大

简而言之,梯度越大意味着导数的绝对值越大,变化率越大 梯度是矢量,具有方向和大小

学习率梯度下降算法的 步长 ,低学习率会花费较长的时间,而学习率过高可能导致永远无法收敛或模型训练结果不准确

超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据 超参数是编程人员在机器学习算法中用于调整的旋钮 典型超参数:学习率、神经网络的隐含层数量……

实战练习

由于没有现有的样本,所以自己用一个线性方程来产生样本,并加入一些噪声,让样本看起来随机一些,不那么有规律。 方程:y=2*x+1 噪声 0.4

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#在网页中使用matplotlib显示图像需要设置inline模式
%matplotlib inline
x_data=np.linspace(-1,1,100)  # 等差数列生成100个在-1与1之间的点
np.random.seed(5)
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,1.0+2*x_data,'r',linewidth=3)

image.png

def model(x,w,b):
    return tf.multiply(x,w)+b
def loss(x,y,w,b):
    err = model(x,w,b)-y  # 求差
    squared_err = tf.square(err)  # 求平方得出方差
    return tf.reduce_mean(squared_err)  # 求均方差
w = tf.Variable(np.random.randn(),tf.float32)
b = tf.Variable(0.0,tf.float32)

training_epochs = 10 # 训练轮数
learning_rate = 0.01 # 学习率
#计算梯度函数
def grad(x,y,w,b):
    with tf.GradientTape() as tape:
        loss_ = loss(x,y,w,b)
    return tape.gradient(loss_,[w,b])
# 执行训练
step = 0
loss_list = []
display_step = 10
for epoch in range(training_epochs):
    for xs,ys in zip(x_data,y_data):
        loss_=loss(xs,ys,w,b)
        loss_list.append(loss_)

        delta_w,delta_b = grad(xs,ys,w,b)
        change_w = delta_w*learning_rate
        change_b = delta_b*learning_rate
        w.assign_sub(change_w)
        b.assign_sub(change_b)

        step=step+1
        if step % display_step == 0:
            print("Training Eporch:",'%02d' % (epoch+1),"step:%03d" % (step),
                 "loss=%.6f" % (loss_))
    plt.plot(x_data,w.numpy()*x_data+b.numpy())

image.png

print("w:",w.numpy(),"b:",b.numpy()) 打印:w: 1.9897072 b: 1.0370641,看起来还是比较接近的

图形化查看损失变化情况

plt.plot(losslist) plt.plot(losslist,'r+')

x_test=3.21

predict=model(x_test,w.numpy(),b.numpy())
print("预测值:%f" % predict)

target = 2*x_test + 1.0
print("实际目标值:%f" % target)

执行结果

预测值:7.426406
实际目标值:7.420000

随机梯度下降法 (SGD)

每次迭代只使用一个样本(批量大小为 1),各个批量的一个样本都是随机选择的

批量梯度下降优化(BGD)

每一次迭代时使用所有样本来进行梯度的更新

总结步骤

生成人工数据集及其可视化 构建线性模型 定义损失函数 (梯度下降)优化过程 训练结果的可视化 利用学习到的模型进行预测