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

显示损失值

#开始训练,轮数为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中的杂乱样本数量,但仍然比全批量更高效



01-25 21:27