程序地带

Tensorflow2.0入门-简单线性回归模型


Tensorflow深度学习 2.3 线性模型实战

这里采用w=1.477,b=0.089的线性模型,即y=1.477x + 0.089,来进行数据采样。给模型添加随机噪声eps,服从均值为0,标准差为0.1的高斯分布(正太分布):


y=1.477x + 0.089 + eps.


数据采样代码:
import numpy as np
# 创建列表,用于保存采集得到的样本
data = []
for i in range(100):
x = np.random.uniform(-10., 10.) # 随机采样输入x
#采样高四噪声
eps = np.random.normal(0.,0.01)
y = 1.477 * x + 0.089 + eps
data.append([x, y])
data = np.array(data) #转为2D Numpy数组
data
计算误差代码:

计算在每个点(x_{_{i}}y_{i})处的预测值与真实值之间的差的平方在累加,从而获得训练集上的均方误差损失值。


def mse(b, w, points):
# 根据当前的w, b参数计算均方差损失
totalLoss = 0
for i in range(0, len(points)): # 循环迭代所有点
x = points[i, 0] #points中 每个元素都是一个数组(x,y), i表示points中的第几个元素,0代表该元素的第一个值,即x值
y = points[i, 1] # 同理,1代表第i个元素的第二个值,即y
# 计算差的平方和
totalLoss += (y - (w * x + b)) ** 2
# 将累加的误差求平均,得到均方差
return totalLoss/ len(points)

 


计算梯度代码:

如图 所示, 𝑓(𝑥, 𝑦) = −(cos2 𝑥 + cos2 𝑦)2,图中𝑥𝑦平面的红色箭头的长度表示梯度向量的模,箭头的方向表示梯度向量的方向。可以看到,箭头的方向总是指向当前位置函数值增速最大的方向,函数曲面越陡峭,箭头的长度也就越长,梯度的模也越大。  



通过上面的例子,我们能直观地感受到,函数在各处的梯度方向∇𝑓总是指向函数值增大的方向, 那么梯度的反方向−∇𝑓应指向函数值减少的方向。 利用这一性质,我们只需要按照


𝒙′ = 𝒙 − 𝜂 ∙ ∇𝑓 (2.1)


来迭代更新𝒙′,就能获得越来越小的函数值,其中𝜂用来缩放梯度向量,一般设置为某较小的值,如 0.01、 0.001 等。特别地,对于一维函数, 上述向量形式可以退化成标量形式:


𝑥′ = 𝑥 − 𝜂 ∙ frac{d_{y}}{d_{x}}


通过上式迭代更新𝑥′若干次,这样得到的𝑥′处的函数值𝑦′,总是更有可能比在𝑥处的函数值𝑦小。通过式(2.1)方式优化参数的方法称为梯度下降算法, 它通过循环计算函数的梯度∇𝑓并更新待优化参数𝜃, 从而得到函数𝑓获得极小值时参数𝜃的最优数值解。需要注意的是,在深度学习中,一般𝒙表示模型输入,模型的待优化参数一般用𝜃、 𝑤、 𝑏等符号表示。现在我们将利用速学的梯度下降算法来求解𝑤∗和𝑏∗参数。这里要最小化的是均方差误差函数totalLoss:


# 计算梯度代码
def step_gradient(b_current, w_current, points, lr):
# 计算误差函数在所有点上的导出, 并更新w, b
b_gradient = 0 # b的导数
w_gradient = 0 # w的偏导数
M = float(len(points)) # 总样本数
for i in range(0, len(points)):
x = points[i, 0]
y = points[i, 1]
# 误差函数对b的导数: grad_b = 2(wx+b-y)
b_gradient += (2/M) * ((w_current * x + b_current) - y)
w_gradient += (2/M) * x * ((w_current * x + b_current) - y)
# 根据梯度下降算法更行 w',b',其中 lr 为学习率
new_b = b_current - (lr * b_gradient)
new_w = w_current - (lr * w_gradient)
return [new_b, new_w]

根据课本公式可知new_b = b_current - (lr * b_gradient)更新权重


梯度更新:

 


# 梯度更新
def gradient_descent(points, starting_b, starting_w, lr, num_iterations):
#循环更新w, b多次
b = starting_b # b的初始值
w = starting_w # w的初始值
# 根据梯度下降算法更新迭代 多次
for step in range(num_iterations):
# 计算梯度 并更新一次
b, w = step_gradient(b, w, np.array(points), lr)
loss = mse(b, w, points) #计算当前的误差, 用于监控训练进度
if step%50 == 0:
print(f"iteration:{step}, loss:{loss}, w:{w}, b:{b}")
return [b, w]

 


主函数:
def main():
# 加载训练集数据,这些数据是通过真实模型添加观测误差采样得到
lr = 0.001
initial_b = 0 # 初始化b为0
initial_w = 0 # 初始化w为0
num_iterations = 2000
# 训练优化1000次,返回最优w*,b* 和训练Loss的下降过程
[b, w] = gradient_descent(data, initial_b, initial_w, lr, num_iterations)
loss = mse(b, w, data) # 计算最优解w, b上的loss
print(f'Final Loss:{loss}, w:{w}, b:{b}')

 


运行

main()


iteration:0, loss:71.75162183120385, w:0.11384621486973374, b:0.003594673140103406
iteration:50, loss:0.02527506460471114, w:1.453241544359238, b:0.048862508065027586
iteration:100, loss:0.0013091942343906463, w:1.4774844226505137, b:0.05320001174757485
iteration:150, loss:0.0010891230983887006, w:1.4778267458745626, b:0.056469992713535984
iteration:200, loss:0.0009141454619310445, w:1.477743594694311, b:0.05942694343652956
iteration:250, loss:0.0007698886810274127, w:1.4776609316189726, b:0.0621115979586297
iteration:300, loss:0.0006509573302407714, w:1.4775857443215457, b:0.06454922775018702
iteration:350, loss:0.0005529053274494093, w:1.4775174727980136, b:0.0667625660204837
iteration:400, loss:0.0004720671364441332, w:1.477455483038025, b:0.06877225037621751
iteration:450, loss:0.00040542073515725336, w:1.4773991970855567, b:0.070597019444054
iteration:500, loss:0.0003504746416184207, w:1.4773480901220408, b:0.07225388766889533
iteration:550, loss:0.0003051747734051968, w:1.4773016856178154, b:0.07375830396073024
iteration:600, loss:0.0002678276586611062, w:1.477259550889703, b:0.07512429574281963
iteration:650, loss:0.00023703712803212285, w:1.4772212930666166, b:0.07636459974568295
iteration:700, loss:0.00021165212083915647, w:1.4771865554263632, b:0.0774907807664544
iteration:750, loss:0.0001907236542936909, w:1.4771550140695113, b:0.07851333950094042
iteration:800, loss:0.00017346934711088172, w:1.477126374899296, b:0.07944181045382274
iteration:850, loss:0.00015924417128579057, w:1.4771003708794166, b:0.08028485083993755
iteration:900, loss:0.00014751633862867189, w:1.4770767595441439, b:0.08105032130556096
iteration:950, loss:0.00013784742061144595, w:1.4770553207375305, b:0.08174535922235883
iteration:1000, loss:0.00012987595833386585, w:1.4770358545606412, b:0.08237644523740618
iteration:1050, loss:0.00012330394989097925, w:1.4770181795076631, b:0.08294946369979916
iteration:1100, loss:0.00011788570999102192, w:1.4770021307735148, b:0.08346975752728739
iteration:1150, loss:0.00011341868535638441, w:1.4769875587171768, b:0.08394217802451147
iteration:1200, loss:0.00010973588255418096, w:1.4769743274664169, b:0.08437113011736044
iteration:1250, loss:0.00010669962518173947, w:1.47696231365089, b:0.08476061342522008
iteration:1300, loss:0.00010419640702781575, w:1.476951405251819, b:0.08511425955407732
iteration:1350, loss:0.0001021326488026469, w:1.476941500557508, b:0.085435365958208
iteration:1400, loss:0.00010043119980777178, w:1.476932507214969, b:0.08572692668617905
iteration:1450, loss:9.902845376569265e-05, w:1.4769243413688082, b:0.08599166029784619
iteration:1500, loss:9.78719709886603e-05, w:1.4769169268793412, b:0.08623203521265059
iteration:1550, loss:9.691851799471775e-05, w:1.4769101946126575, b:0.08645029272556469
iteration:1600, loss:9.613245128475462e-05, w:1.4769040817960022, b:0.08664846790529253
iteration:1650, loss:9.548438486047222e-05, w:1.4768985314324747, b:0.08682840856958308
iteration:1700, loss:9.49500916701327e-05, w:1.4768934917695786, b:0.08699179251458462
iteration:1750, loss:9.450959791433001e-05, w:1.4768889158166738, b:0.08714014315889017
iteration:1800, loss:9.41464363535874e-05, w:1.476884760906828, b:0.08727484374814115
iteration:1850, loss:9.384703070374857e-05, w:1.476880988298983, b:0.08739715025263604
iteration:1900, loss:9.360018810573476e-05, w:1.4768775628167274, b:0.08750820307820226
iteration:1950, loss:9.339668069621332e-05, w:1.4768744525203044, b:0.08760903769952653
Final Loss:9.323194863643854e-05, w:1.4768716822608905, b:0.08769884845096919

 


简单记录TensorFlow深度学习这本书第二章的内容,书中讲解了梯度下降算法的数学公式,较为详细,通俗易懂,这里不做记录。


 


初学深度学习,如有错误,请指正,希望大家互相交流,vx:XingXingAISuSu


 


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sdskrxs/article/details/111246280

随机推荐

python queue_Python queue (队列)

queue(队列)主要作用解耦,使程序实现松耦合(一个模块修改不会影响其他模块)提高效率队列与列表的关系队列中数据只有一份,取出就没有了,区别于列表ÿ...

weixin_39675289 阅读(137)

python queue_Python Queue(队列)

三、queue对象提供下面描述的公共方法:Queue.qsize()返回队列的大致大小(非准确值)。Queue.empty()如果队列为空则返回True,否则返回False...

weixin_39632471 阅读(616)

Tesseract-OCR

Tesseract-OCR

软硬兼环境windows1064bitanacondawithpython3.7nivdiagtx1066opencv4.4.0tesseract5.0.0alpha简介tesseract的OCR(O...

xugaoxiang.com 阅读(994)

如何系统地自学python100天_如何系统地自学 Python?

更新:补充了图片(昨天居然没图了orz囧)想要系统自学,首先当然是要搭建Python体系了。大部分自学者没有知识体系可言,这是无法避免的困局。知识体系并不是你...

weixin_39749501 阅读(374)