《Tensorflow深度学习》 这本书的学习
手动实现线性回归
加了一点自己的思路。
import numpy as np
import tensorflow as tf
## 手动实现线性回归模型,没有用到框架
# 直接从模型随机采样得到数据,然后用这个数据再进行训练,训练后得到的模型和原有模型对比
# 产生100个随机样本
# x采样自[-10,10]的均匀分布
# 根据线性模型对样本标签y添加高斯噪声
# 循环产生样本
# 先保存在list中,再转换成ndarray
data = []
for i in range(100):
x = np.random.uniform(-10., 10.)
eps = np.random.normal(0, 0.01)
y = 1.477 * x + 0.089 + eps
data.append([x, y])
num_data = np.array(data)
# print(num_data) # 数据较少,可以直接打印观察。
## 模型训练
# 1.定义损失函数【用于训练过程监控】
# 2.优化/训练:定义一步迭代函数【输入:当前迭代点+梯度计算(当前点+样本数据)+步长 输出:新迭代点】、
# 定义整个梯度下降函数【最大迭代次数,初始点】、
# 定义主训练函数【封装前面的函数】
# 损失函数mse
def mse(w, b, data):
n = data.shape[0]
return ((w * data[:, 0] + b - data[:, 1]) ** 2).sum() / n
def grad_comput(w, b, data):
n = data.shape[0]
res = (w * data[:, 0] + b - data[:, 1])
grad_w = (2 / n) * (res * data[:, 0]).sum()
grad_b = (2 / n) * res.sum()
return grad_w, grad_b
# 一步迭代函数
def step_gradient(cur_w, cur_b, data, lr):
"""计算梯度,完成迭代步,返回新迭代点"""
grad_w, grad_b = grad_comput(cur_w, cur_b, data)
new_w = cur_w - lr * grad_w
new_b = cur_b - lr * grad_b
return new_w, new_b
# 梯度下降函数
# 书上只通过最大迭代次数控制是否停机,这里再添加一个梯度判断
def grad_descent(init_w, init_b, lr, data, max_iter, precision):
loss_list = []
w, b = init_w, init_b
for i in range(max_iter):
grad_w, grad_b = grad_comput(w, b, data)
if grad_w ** 2 + grad_b ** 2 < precision:
print("Ideal precision attained.")
break
w, b = step_gradient(w, b, data, lr)
if i % 50 == 0:
loss = mse(w, b, data)
loss_list.append(loss)
print("==iteration %d== loss:%e w:%e b:%e" % (i, loss, w, b))
print("Max iteration.")
return [w, b]
# 训主练函数
def mian_train():
lr = 0.01
init_w, init_b = 0, 0
max_iter = 1000
precision = 1e-10
w, b = grad_descent(init_w, init_b, lr, num_data, max_iter, precision)
loss = mse(w, b, num_data) # 计算最后的损失
print("Final loss:%e w:%e b:%e" % (loss, w, b))
# 训练
mian_train()