TF中的一元线性回归

整体认识

  1. 线性回归,是利用已有数据拟合,实现对于未知数据的预测。
  2. 输入的数据即为样本,分为有标签样本与无标签样本;所谓标签就是对于样本属性的描述,如在图像分类中,有标签的图像就是带有类别信息的图像,这个类别就是标签。
  3. 此文中使用的是有标签的一维数据集,每个样本可以用(x,y)这样的表示方式;而拟合就是要得到一个映射关系,记作h,x经h映射得到预测结果y'(即h(x)=y'),这就构建了一个模型,而h又称为假设函数。
  4. 训练模型就是要找到一个合适的假设函数,使得预测结果足够接近标签;用loss即损失值表示这种接近程度,理想情况下,loss越接近0越好。
  5. loss有多种表示方法,如L1,即差的绝对值和;L2,即均方差其公式为:loss = \frac{1}{N}\sum(y-h(x))^{2},L2使用更广泛。

训练

  1. 训练以减小loss为目的,不断优化假设函数的参数;优化的方法包括但不限于梯度下降算法。
  2. 所谓梯度下降算法,就是迭代时总是向梯度下降的方向更新参数,总体的loss将在不断迭代时变小,当loss不变或者变化极小时认为此时模型收敛,即可停止训练。
  3. 梯度下降时的步长是一个超参,即学习率;若学习率为0.01,求得的梯度值为2.5,则下次迭代下降的距离与当前0.025的位置。
  4. 除了学习率是超参,网络层数,各层的神经元数,filters尺寸都是超参。

一元线性回归实例

  1. 整体步骤: 准备数据--->构建模型--->训练模型--->进行预测
  2. import tensorflow as tf
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 数据准备
    np.random.seed(5)
    x_data = np.linspace(-1, 1, 100)
    y_data = x_data*2+np.random.rand(*x_data.shape)*0.4
    plt.figure()
    plt.scatter(x_data, y_data)
    
    
    
    # 构建模型 x*w+b
    x = tf.placeholder('float', name='x')
    y = tf.placeholder('float', name='y')
    w = tf.Variable(1.0, name='w0')
    b = tf.Variable(0.0, name='b0')
    
    
    def model(x, w, b):
        return(tf.multiply(x, w)+b)
    
    # 建立模型操作
    preb = model(x, w, b)
    
    # 超参设定
    train_epochs = 10  # 训练轮数
    learning_rate = 0.05  # 学习率
    loss_function = tf.reduce_mean(tf.square(y-preb))  # 利用均方差做loss
    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
    step = 0  # 步数计数
    disply_step = 10  # 显示loss的粒度
    loss_list = []  # loss集合
    # 运行与训练
    sess = tf.Session()
    init = tf.global_variables_initializer()
    sess.run(init)
    
    # 逐次执行超参设定的轮数
    for epoch in range(train_epochs):
        for xs, ys in zip(x_data, y_data):  # zip将x,y表示为(x,y)格式
            _, loss = sess.run([optimizer, loss_function], feed_dict={x: xs, y: ys})
            loss_list.append(loss)
            step = step + 1
            if step % disply_step == 0:  # 对应粒度下显示loss值
                print(loss)
        b0temp = b.eval(session=sess)  # 在session会话下求值
        w0temp = w.eval(session=sess)
        plt.plot(x_data, x_data*w0temp+b0temp)  # 每次训练一轮将得到的结果绘制
    
    
    plt.figure()
    plt.plot(loss_list, 'r+')  #绘制总的loss
    plt.show()
    
    
    
    具体代码如上。
发布了5 篇原创文章 · 获赞 0 · 访问量 65

猜你喜欢

转载自blog.csdn.net/weixin_41707744/article/details/104668257