本文针对单变量线性回归(一)中的案例进行拓展延伸
显示损失值
#开始训练,轮数为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 tfimport numpy as npimport matplotlib.pyplot as pltnp.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) + bw = 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中的杂乱样本数量,但仍然比全批量更高效