TF中的一元线性回归
其他
2020-03-11 11:06:17
阅读次数: 0
整体认识
- 线性回归,是利用已有数据拟合,实现对于未知数据的预测。
- 输入的数据即为样本,分为有标签样本与无标签样本;所谓标签就是对于样本属性的描述,如在图像分类中,有标签的图像就是带有类别信息的图像,这个类别就是标签。
- 此文中使用的是有标签的一维数据集,每个样本可以用(x,y)这样的表示方式;而拟合就是要得到一个映射关系,记作h,x经h映射得到预测结果y'(即h(x)=y'),这就构建了一个模型,而h又称为假设函数。
- 训练模型就是要找到一个合适的假设函数,使得预测结果足够接近标签;用loss即损失值表示这种接近程度,理想情况下,loss越接近0越好。
- loss有多种表示方法,如L1,即差的绝对值和;L2,即均方差其公式为:,L2使用更广泛。
训练
- 训练以减小loss为目的,不断优化假设函数的参数;优化的方法包括但不限于梯度下降算法。
- 所谓梯度下降算法,就是迭代时总是向梯度下降的方向更新参数,总体的loss将在不断迭代时变小,当loss不变或者变化极小时认为此时模型收敛,即可停止训练。
- 梯度下降时的步长是一个超参,即学习率;若学习率为0.01,求得的梯度值为2.5,则下次迭代下降的距离与当前0.025的位置。
- 除了学习率是超参,网络层数,各层的神经元数,filters尺寸都是超参。
一元线性回归实例
- 整体步骤: 准备数据--->构建模型--->训练模型--->进行预测
-
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