本文针对单变量线性回归(一)中的案例进行拓展延伸
显示损失值
#开始训练,轮数为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)
补充知识:随机梯度下降
在梯度下降法中,批量指的是用于在单次迭代中计算梯度的样本总数。假定批量是指整个数据集,数据集通常包含很大样本(数万甚至数千亿),此外,数据集通常包含多个特征。因此,一个批量可能相当巨大。如果是超大批量,则单次迭代就可能要花费很长时间进行计算。
随机梯度下降法(SGD)每次迭代只使用一个样本(批量大小为1),如果进行足够的迭代,SGD也可以发挥作用。“随机”这一术语表示构成各个批量的一个样本都是随机选择的
小批量随机梯度下降法(小批量SGD)是介于全批量迭代与SGD之间的折衷方案。小批量通常包含10-1000个随机选择的样本。小批量SGD可以减少GD中的杂乱样本数量,但仍然比全批量更高效