当前位置:   article > 正文

Pytorch深度学习入门(笔记)_pytorch学习笔记

pytorch学习笔记

1.线性模型

 1.方差与平均方差

loss=(\hat{y}-y)^{2}这是方差(损失)

cost=\frac{1}{N}\sum_{n=1}^{N}(\hat{y}-y)^{2}这是平均损失(MSE)这个值越小,拟合性越好

2.代码实现

算法:穷举法 求线性模型的权重,从0试到4.0,步长0.1,要使用np.arange( ,  , )函数

代码实现:一般训练过程中,横轴是一个训练轮数而不是权重。

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. x_data=[1,2,3]
  4. y_data=[2,4,6]
  5. def predict(x): #预测y值
  6. return x*w
  7. def loss(x,y):
  8. y_predict=predict(x) #计算损失
  9. return (y_predict-y)*(y_predict-y)
  10. w_list=[] #权重列表
  11. mse_list=[] #平均损失列表
  12. for w in np.arange(0.0,4.1,0.1):
  13. print("w=",w)
  14. loss_sum=0
  15. for x_val,y_val in zip(x_data,y_data):
  16. y_pre=predict(x_val)
  17. loss_val=loss(x_val,y_val)
  18. loss_sum+=loss_val
  19. print('\t',x_val,y_val,y_pre,loss_val)
  20. MSE=loss_sum/3
  21. print("MSE=",MSE)
  22. w_list.append(w)
  23. mse_list.append(MSE)
  24. plt.plot(w_list,mse_list) #绘制图像
  25. plt.xlabel("MSE")
  26. plt.ylabel("loss")
  27. plt.show() #展示图象

结果:

作业:利用y=a*w+b模型,画出三维图像

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. from matplotlib import cm
  4. x_data=[1,2,3]
  5. y_data=[3,5,7]
  6. def predict(x):
  7. return (x*w)+b
  8. def loss(x,y):
  9. y_predict=predict(x)
  10. return (y_predict-y)*(y_predict-y)
  11. w_list=[]
  12. mse_list=[]
  13. b_list=[]
  14. for w in np.arange(0.0,4.1,0.1):
  15. print("w=",w)
  16. for b in np.arange(-2.0,2.1,0.1):
  17. print("b=",b)
  18. loss_sum=0 #这里loss_sum要先归零,后归零会影响初次循环的数据
  19. for x_val,y_val in zip(x_data,y_data):
  20. y_pre=predict(x_val)
  21. loss_val=loss(x_val,y_val)
  22. loss_sum+=loss_val
  23. print('\t',x_val,y_val,y_pre,loss_val)
  24. MSE=loss_sum/3
  25. print("MSE=",MSE)
  26. b_list.append(b)
  27. mse_list.append(MSE)
  28. w_list.append(w)
  29. #loss_sum=0
  30. #X,Y=np.meshgrid(w_list,b_list)
  31. fig = plt.figure (figsize= (12,6))
  32. ax1 = plt.axes(projection="3d")
  33. ax1.plot_trisurf(w_list,b_list,mse_list,cmap='rainbow')
  34. plt.show()

2.梯度下降算法

 1.优化问题

优化问题就是要求1个函数的最小值问题。当参数数量较小的时候还可以用分支方法解决(只访问某些在最小值附近的点,在一步步逼近最小值。)但由于目标函数不一定是凸函数以及参数可能非常多,因此分支的方法也不一定可行。

2.梯度下降算法-核心公式

梯度 gradiant=\frac{\partial cost}{\partial x}(cost即为y轴坐标,在这里是loss的均值)指向函数上升的方向(导数为正时,x轴正向为上升,导数为负时,x轴反向为上升)

核心公式:w=w-\alpha *\frac{\partial cost}{\partial x}(对倒数取相反数,指向函数下降的方向,以期得到最小值)

其中a为学习率,不能太高,否则导致不收敛。不收敛时loss-epoch函数存在极小值点,此时训练失败了。

这一算法是一种贪心算法,不一定能得到真正的最小值(如果函数不是凸函数的话)只能找到局部最优点(也可能是鞍点,鞍点使模型几乎无法继续迭代,导数接近零)。

3.随机梯度下降算法

由于梯度下降算法的w值是由整个数据集得出,容易导致在鞍点时无法继续迭代,因此大多数时间改用随机梯度下降算法,以期望在鞍点时,用数据集中单个数据所含的随机噪声推动w去迭代。也就是直接用loss去对w求导。使用该算法时,随着梯度减小,w所移动的步长随之减小。

在这里w=w-\alpha *\frac{\partial loss}{\partial x},其中\frac{\partial loss }{\partial x}=((\hat{y}-y)^{2}){}'

随机梯度下降算法比梯度下降具有更好的性能,更有机会是目标收敛,但时间复杂度较梯度下降更大。 

4.代码实现

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. x_data=[1.0,2.0,3.0]
  4. y_data=[2.2,4.1,5.9]
  5. w=1.0
  6. def forward(x):
  7. return x*w
  8. def loss(x,y): #损失函数
  9. y_pre=forward(x)
  10. return (y_pre-y)**2
  11. def gradient(x,y): #计算梯度,即对损失函数求导
  12. return 2*x*(x*w-y)
  13. epoch_list=[]
  14. loss_list=[]
  15. print("Trainning Start\n")
  16. for epoch in range(100):
  17. for x_val,y_val in zip(x_data,y_data):
  18. grad=gradient(x_val,y_val)
  19. w-=0.01*grad #对权重进行迭代,其中训练率为0.01
  20. print("\tX=",x_val,"Y=",y_val,"grad=",grad)
  21. loss_val=loss(x_val,y_val)
  22. epoch_list.append(epoch)
  23. loss_list.append(loss_val) #去第三次的loss作为代表
  24. print("epoch=",epoch,"w=",w,"loss=",loss)
  25. print("Trainning Finish\n")
  26. plt.plot(epoch_list,loss_list) #绘制图像
  27. plt.xlabel("epoch")
  28. plt.ylabel("loss")
  29. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/671088
推荐阅读
相关标签
  

闽ICP备14008679号