zoukankan      html  css  js  c++  java
  • 单变量线性回归(二)

    本文针对单变量线性回归(一)中的案例进行拓展延伸

    显示损失值

    #开始训练,轮数为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})
    # 显示损失值1oss
    # display_step:控制报告的粒度
    # 例如,如果display_step 设为2,则将每诚练2个样本输出一次损失值
    # 与超多数不同,修改display_step 不会更改模型所学习的规律
    loss_list.append(loss)
    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)
    输出结果:

    图形化显示损失值:
    plt.plot(loss_list, 'r+')

     筛选损失结果

    print([x for x in loss_list if x>1]) #筛选出损失列表中大于1的结果

    完整代码为:

    #相比于LR5.1.py 增加了显示损失值等内容
    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 = 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)
    # plt.show()
    x = tf.placeholder('float', name = 'x')
    y = tf.placeholder('float', name = 'y')
    
    def model(x, w, b):
        return  tf.multiply(x, w) + b
    
    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  #学习率,设置为经验值。
    display_step = 10    #控制显示loss值的粒度
    
    loss_function = tf.reduce_mean(tf.square(y - pred))  #采用均方差作为损失函数
    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)  #梯度下降优化器
    
    sess = tf.Session()
    init = tf.global_variables_initializer()
    sess.run(init)
    
    
    #开始训练,轮数为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})
            #显示损失值1oss
            # display_step:控制报告的粒度
            # 例如,如果display_step 设为2,则将每诚练2个样本输出一次损失值
            # 与超多数不同,修改display_step 不会更改模型所学习的规律
            loss_list.append(loss)
            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)
        # plt.plot(x_data, w0temp * x_data + b0temp)
    
    # plt.show()
    print('w:', sess.run(w))   #w的值应在2附近
    print('b:', sess.run(b))   #b的值应在1附近
    print([x for x in loss_list if x>1])  #筛选出损失列表中大于1的结果
    # plt.plot(loss_list, 'r+')
    # plt.show()
    
    # plt.scatter(x_data, y_data, label='Original data')
    # plt.plot(x_data, x_data * sess.run(w) + sess.run(b), label='Fitted line', color='r', linewidth=3)
    # plt.legend(loc=2)  #通过参数loc指定图例位置
    # plt.show()
    
    #进行预测
    # x_test = 3.21
    # # predict = sess.run(pred, feed_dict={x:x_test})
    # predict = sess.run(w) * x_test + sess.run(b)
    # print("预测值:%f" % predict)
    #
    # target =2 * x_test +1.0
    # print("目标值:%f" % target)
    LR5.2 Code

    补充知识:随机梯度下降

    在梯度下降法中,批量指的是用于在单次迭代中计算梯度的样本总数。假定批量是指整个数据集,数据集通常包含很大样本(数万甚至数千亿),此外,数据集通常包含多个特征。因此,一个批量可能相当巨大。如果是超大批量,则单次迭代就可能要花费很长时间进行计算。
    随机梯度下降法(SGD)每次迭代只使用一个样本(批量大小为1),如果进行足够的迭代,SGD也可以发挥作用。“随机”这一术语表示构成各个批量的一个样本都是随机选择的
    小批量随机梯度下降法(小批量SGD)是介于全批量迭代与SGD之间的折衷方案。小批量通常包含10-1000个随机选择的样本。小批量SGD可以减少GD中的杂乱样本数量,但仍然比全批量更高效



  • 相关阅读:
    fibonacci封闭公式及矩阵连乘
    fibonacci封闭公式
    fibonacci高精度加法
    fibonacci数列的和取余(1)
    fibonacci数列的和取余(2)
    [html][javascript]父子窗体传值
    [转]父子页面之间跨域通信的方法
    [转]批处理遍历文件夹生成 html 文件
    [原]DataGridView 回车不换行代码 AND 编辑时的字符控制
    [转]身份证从 15 >> 18
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/11629599.html
Copyright © 2011-2022 走看看