[PyTorch][chapter 2][李宏毅深度学习-Regression]

前言:

     Regression 模型主要用于股票预测,自动驾驶,推荐系统等领域.

这个模型的输出是一个scalar。这里主要以下一个线性模型为基础

它是神经网络的基础模块,

目录:

  1.    总体流程
  2.    常见问题
  3.    Numpy 例子
  4.    PyTorch 例子

一    总体流程

       1 : 建模(model)

             y=w^Tx+b

                 =\sum_{i}w_ix_i+b 

           其中: w: weight权重系数 向量

                       b:bias 偏置系数  scalar

                       x: 输入数据 向量

       2: TrainData

             收集N个样本,其中

               \hat{y}: 标签 target

              x: [n,1]的列向量

               x^i,\hat{y}^{i}: 一组训练数据

            数据集如下:

              \begin{bmatrix} (x^1,\hat{y}^1)\\ (x^2,\hat{y}^2) \\ .... \\ (x^N,\hat{y}^N) \\ \end{bmatrix}

     

     3: 损失函数

                         用来度量Goodness of Function,一般用MSE loss

                        L(w.b)=\sum_{n=1}^{N}(\hat{y}^{n}-(w^Tx^n+b))^2

                        我们训练的目标是找到最优的参数w,b使得loss 最小

                         w^{*},b^{*}=argminL_{w,b}(w,b)

       4: 训练

                训练的时候,主要通过梯度下降方法 Gradient Descent


二  常见问题

          2.1  Gradient Discent  局部极小值问题

    当损失函数是非凸函数,可能有多个局部极小点.如下图

                 

 如上图,当梯度为0 的时候,此刻参数就无法更新了,导致

loss 陷入了局部极小值点,无法更新到全局最小值点.当多维参数的时候

在saddle point 陷入到局部极小值点.

  解决方案:

Adagrad: 自适应学习率,会根据之前的梯度信息自动调整每个参数的学习率。
RMSprop: 自适应学习率,根据历史梯度信息,采用了指数加权移动平均,
stochastic GD: 其每次都只使用一个样本进行参数更新,这样更新次数大大增加也就不容易陷入局部最优
Mini-Batch GD: 每次更新使用一小批样本进行参数更新
每次更新前加入部分上一次的梯度量,这样整个梯度方向就不容易过于随机。
一些常见情况时,如上次梯度过大,导致进入局部最小点时,下一次更新能很容易借助上次的大梯度跳出局部最小点。

    

   2.2 过拟合问题

        如上图, 五个拟合函数。函数5最复杂,在Training 数据集上的loss 最小

但是在Testing 数据集上loss 最大,这种称为过拟合.

         

      解决方案:

             在Training Data 收集更多的数据集

             L2 正规化

         


三  Numpy 代码例子

      

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 28 16:19:48 2023@author: chengxf2
"""# -*- coding: utf-8 -*-
"""
Created on Tue Nov 28 14:47:32 2023@author: chengxf2
"""import numpy as np
import matplotlib.pyplot as pltdef load_trainData():x_data =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]y_data =[3, 5, 7, 9, 11, 13, 15, 17, 19, 21]#y_data = b+w*xdata return x_data, y_datadef draw(x_data,y_data,b_history, w_history):#plot the figure#x = np.arange(-200, -100, 1.0) #biasx = np.arange(-5, 5, 0.1) #biasy = np.arange(-10, 10, 0.1) #weightZ = np.zeros((len(y),len(x))) #ndarrayX, Y = np.meshgrid(x,y)print("\n-----z ---",Z.shape)for i in range(len(x)):#100for j in range(len(y)):#40w = x[i]b = y[j]#print(j,i)Z[j,i]=0for n in range(len(x_data)):Z[j,i]=Z[j,i]+(y_data[n] -b-w*x_data[n])**2Z[j,i]== Z[j,i]/len(x_data)#绘制等高线,cmp = plt.get_cmap('jet')plt.contourf(x,y,Z, 50, alpha = 0.5, cmap='rainbow')plt.plot([1.0], [2.0], 'x', ms=10, markeredgewidth =30, color ='red')plt.plot(w_history, b_history, 'o-', ms=3, lw =5, color ='green')plt.xlim(-10, 10)plt.ylim(-10, 10)plt.xlabel(r'$b$',fontsize =16)plt.ylabel(r'$w$',fontsize =16)plt.show()class regression():def learn(self,x_data,y_data):N = len(x_data)b_history = []w_history = []for i in range(self.iteration): w_grad = 0.0b_grad = 0.0for n in range(N):w_grad = w_grad +2.0*(self.b+self.w*x_data[n]-y_data[n])*x_data[n]b_grad = b_grad +2.0*(self.b+self.w*x_data[n]-y_data[n])*1.0self.b = self.b -self.lr*b_gradself.w = self.w- self.lr*w_gradb_history.append(self.b)w_history.append(self.w)print("\n 偏置: ",round(self.b,1), "\n 权重系数 ",round(self.w,1))return w_history,b_historydef initPara(self):self.b = -120 #initial bself.w = -4.0 #initial wself.lr = 1e-3 #learning rateself.iteration = 10000 #iteration Numberdef __init__(self):self.b = 0 self.w = 0self.lr = 0self.iteration = 0if __name__ == "__main__":model = regression()x_data,y_data = load_trainData()model.initPara()w_history,b_history = model.learn(x_data, y_data)draw(x_data,y_data,b_history, w_history)

四 PyTorch API 例子

loss 情况

torch.optim.SGD是PyTorch中实现的Stochastic Gradient Descent(SGD)优化器,用于更新神经网络中的参数,以最小化损失函数,从而提高模型的精度。它的一些重要参数如下:

- lr:学习率(learning rate),控制每次参数更新的步长。默认值为0.001。
- momentum:动量(momentum),加速SGD在相关方向上前进,抑制震荡。常常取值为0.9。若设为0,则为经典的SGD算法。
- dampening:阻尼(dampening),用于防止动量的发散。默认值为0。
- weight_decay:权重衰减(weight decay),也称权重衰减(weight regularization),用于防止过拟合。默认值为0。
- nesterov:采用Nesterov加速梯度法(Nesterov accelerated gradient,NAG)。默认值为False
 

  

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 28 16:27:30 2023@author: chengxf2
"""import torch
import numpy as np
import matplotlib.pyplot as plt
from torchsummary import summary#加载PyTorch数据集
def load_data():x_data =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]y_data =[3, 5, 7, 9, 11, 13, 15, 17, 19, 21]x = torch.Tensor(x_data)   #将列表a转成tensor类型one = torch.ones_like(x)Y = torch.Tensor(y_data)  X = torch.stack([x,one],dim=1)return  X,Y.view(10,1)#建模
class NN(torch.nn.Module):def __init__(self, xDim, yDim):super(NN,self).__init__()self.predict = torch.nn.Linear(xDim, yDim,bias=False)def forward(self, x):y = self.predict(x)return y#训练
def learn(X,Y):#X 数据集 Y 标签集model = NN(2,1)optimizer = torch.optim.SGD(model.parameters(),lr=0.001)  #优化方法为随机梯度下降loss_f = torch.nn.MSELoss()lossHistory =[]for i in range(10000):predict = model(X)loss = loss_f(predict, Y)#print("\n loss ",loss.item())lossHistory.append(loss.item())optimizer.zero_grad()loss.backward()optimizer.step()#y_predict = y_predict.detach().numpy()N = len(lossHistory)x = np.arange(0, N)plt.plot(x, lossHistory)summary(model, input_size=(1,2), batch_size=-1)for param in model.parameters():print("\n 参数 ",param)if __name__ == "__main__":x,y = load_data() learn(x,y )

参考:

sam+yolov8 


1 [2023] 李宏毅机器学习完整课程 43
      https://www.bilibili.com/video/BV1NX4y1r7nP/?spm_id_from=333.337.search-card.all.click&vd_source=a624c4a1aea4b867c580cc82f03c1745

2 【2022】最新 李宏毅大佬的深度学习与机器学  P90

    https://www.bilibili.com/video/BV1J94y1f7u5/?spm_id_from=333.337.search-card.all.click&vd_source=a624c4a1aea4b867c580cc82f03c1745


3 [2020 ]李宏毅机器学习深度学习(完整版)国语  P119

     https://www.bilibili.com/video/BV1JE411g7XF/?spm_id_from=333.337.search-card.all.click&vd_source=a624c4a1aea4b867c580cc82f03c1745


4 [2017 ]李宏毅机器学习 P40

      https://www.bilibili.com/video/BV13x411v7US/?spm_id_from=333.337.search-card.all.click&vd_source=a624c4a1aea4b867c580cc82f03c1745


5 李宏毅: 强化学习 P11

     https://www.bilibili.com/video/BV1XP4y1d7Bk/?spm_id_from=333.337.search-card.all.click&vd_source=a624c4a1aea4b867c580cc82f03c1745
————————————————
版权声明:本文为CSDN博主「明朝百晓生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengxf2/article/details/134643845

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/208818.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端Long型数据传到前端js后精度丢失的问题

假设一个场景,MybatisPlus的雪花算法生成long类型主键ID,存入数据库,前端获取到数据后,要执行一个更新操作(updateById),但这时会出现无法成功更新的情况!这是因为前端在长度大于17位…

【SpringMVC】Spring Web MVC入门(一)

文章目录 前言什么是Spring Web MVC?什么是MVC什么是Spring MVC? Spring Boot 和 Spring MVC 的区别什么是Spring Boot?关系和区别 Spring MVC 学习注解介绍1. SpringBootApplication2. RestController3. RequestMapping3.1 RequestMapping 使…

视频生成的发展史及其原理解析:从Gen2、Emu Video到PixelDance、SVD、Pika 1.0

前言 考虑到文生视频开始爆发,比如11月份就是文生视频最火爆的一个月 11月3日,Runway的Gen-2发布里程碑式更新,支持4K超逼真的清晰度作品(runway是Stable Diffusion最早版本的开发商,Stability AI则开发的SD后续版本)11月16日&a…

Wireshark抓包分析RTMP协议时,出现Unknown问题

进行rtmp推流时,使用wireshark抓包,发现部分包显示Unknown 解决方法: 编辑 -> 首选项 -> Protocols -> RTMPT,这里Maximum packet size默认是32768 将该值调大,比如调成1048576,即可解决该问题。…

【内网安全】搭建网络拓扑,CS内网横向移动实验

文章目录 搭建网络拓扑 ☁环境CS搭建,木马生成上传一句话,获取WebShellCS上线reGeorg搭建代理,访问内网域控IIS提权信息收集横向移动 实验拓扑结构如下: 搭建网络拓扑 ☁ 环境 **攻击者win10地址:**192.168.8.3 dmz win7地址&…

第 374 场 LeetCode 周赛题解

A 找出峰值 枚举 class Solution { public:vector<int> findPeaks(vector<int> &mountain) {int n mountain.size();vector<int> res;for (int i 1; i < n - 1; i)if (mountain[i] > mountain[i - 1] && mountain[i] > mountain[i 1…

人工智能 - 人脸识别:发展历史、技术全解与实战

目录 一、人脸识别技术的发展历程早期探索&#xff1a;20世纪60至80年代技术价值点&#xff1a; 自动化与算法化&#xff1a;20世纪90年代技术价值点&#xff1a; 深度学习的革命&#xff1a;21世纪初至今技术价值点&#xff1a; 二、几何特征方法详解与实战几何特征方法的原理…

阅读笔记|A Survey of Large Language Models

阅读笔记 模型选择&#xff1a;是否一定要选择参数量巨大的模型&#xff1f;如果需要更好的泛化能力&#xff0c;用于处理非单一的任务&#xff0c;例如对话&#xff0c;则可用选更大的模型&#xff1b;而对于单一明确的任务&#xff0c;则不一定越大越好&#xff0c;参数小一…

C++11--右值引用

目录 基本概念 左值和右值 左值引用和右值引用 右值引用使用场景和意义 左值引用使用场景 左值引用的短板 右值引用和移动语义 右值引用引用左值 右值引用的其他使用场景 完美转发 万能引用 完美转发保持值得属性 完美转发使用得场景 基本概念 左值和右值 什么…

前端面试灵魂提问(1)

1.自我介绍 2.在实习中&#xff0c;你负责那一模块 3.any与unknow的异同 相同点&#xff1a;any和unkonwn 可以接受任何值 不同点&#xff1a;any会丢掉类型限制&#xff0c;可以用any 类型的变量随意做任何事情。unknown 变量会强制执行类型检查&#xff0c;所以在使用一个…

Linux线程安全,死锁,生产消费模型,线程池

目录 1.可重入和线程安全 2.死锁 死锁四个必要条件&#xff1a; 避免死锁 3. Linux线程同步 线程同步 生产消费模型的概念理解&#xff08;321原则&#xff09; 生产消费模型都有哪些好处。 串行、并发、并行 条件变量 4.信号量 5.线程池 人的一生为什么要坚持&#xff1…

【ArcGIS Pro微课1000例】0043:深度学习--框架库安装

ArcGIS Pro 中的所有深度学习地理处理工具都要求安装支持的深度学习框架库。 文章目录 深度学习框架库下载深度学习框架库安装注意事项深度学习框架库下载 由于是python开发,可以采用安装包与Pip两种方式安装,本文讲解采用安装包安装。 点击深度学习框架库下载,打开网站,…

大文件分片上传、分片进度以及整体进度、断点续传(一)

大文件分片上传 效果展示 前端 思路 前端的思路&#xff1a;将大文件切分成多个小文件&#xff0c;然后并发给后端。 页面构建 先在页面上写几个组件用来获取文件。 <body><input type"file" id"file" /><button id"uploadButton…

后端项目连接数据库-添加MyBatis依赖并检测是否成功

一.在pom.xml添加Mybatis相关依赖 在Spring Boot项目中&#xff0c;编译时会自动加载项目依赖&#xff0c;然后使用依赖包。 需要在根目录下pom.xml文件中添加Mybatis依赖项 <!-- Mybatis整合Spring Boot的依赖项 --> <dependency><groupId>org.mybatis.s…

解决git action发布失败报错:Error: Resource not accessible by integration

现象&#xff1a; 网上说的解决方法都是什么到github个人中心setting里面的action设置里面去找。 可这玩意根本就没有&#xff01; 正确解决办法&#xff1a; 在你的仓库页面&#xff0c;注意是仓库页面的setting里面&#xff1a; Actions> General>Workflow permisss…

每天一点python——day84

#每天一点Python——84 #异常处理机制try—except—else #异常处理机制try—except—else如果try块中没有抛出异常&#xff0c;则执行else块&#xff0c;如果try中抛出异常&#xff0c;则执行except块#示例&#xff1a; try:a int(input(请输入第一个整数&#xff1a;))b in…

PostgreSQL有意思的现象:支持不带列的表

1、前言 以前从没有试过建一张表&#xff0c;不带任何列。在PG中却支持这种语法。这是个什么鬼? 最近&#xff0c;把PG源码扒了下&#xff0c;简单浏览了下最近的一些merge。其中有一个fix&#xff1a; eeb0ebad79 ("Fix the initial sync tables with no columns.&qu…

计网Lesson3 - 计算机网络评价指标与封包解包

文章目录 计算机网络的性能指标1. 速率2. 带宽3. 吞吐量4. 时延5. 时延带宽积6. 往返时间7. 利用率8. 数据的解包和封包 计算机网络的术语实体![实体](https://img-blog.csdnimg.cn/direct/cbf4ca9ed5ab4df290b5a17b4642c6a1.png)协议服务 计算机网络的性能指标 1. 速率 数据…

c语言-结构体

文章目录 1. 结构体类型的声明2 . 结构体变量的创建和初始化(1)结构体变量的创建和初始化(2)结构的特殊声明&#xff08;3&#xff09;结构的自引用&#xff08;4&#xff09;typedef和结构体 3 . 结构成员访问操作符4. 结构体传参5. 结构体内存对齐&#xff08;1&#xff09;对…

解决ant-design-vue中Select组件v-model值为空字符串不显示placeholder的bug

方法一&#xff1a; 1.找到node_modules/ant-design-vue/es/vc-select/SingleSelector.js文件 搜索renderPlacehoder方法 将其修改为 const renderPlacehoder () > {const list props.values.filter(val > val.value ! );if (list[0]) {return null}... }2.在此文件中…