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

news2025/1/19 17:13:05

前言:

     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 plt




def 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_data


def draw(x_data,y_data,b_history, w_history):
    #plot the figure
    #x = np.arange(-200, -100, 1.0) #bias
    
    x = np.arange(-5, 5, 0.1) #bias
    y = np.arange(-10, 10, 0.1) #weight
    Z = np.zeros((len(y),len(x))) #ndarray
    X, Y = np.meshgrid(x,y)
    print("\n-----z ---",Z.shape)

    for i in range(len(x)):#100
        for j in range(len(y)):#40
            w = x[i]
            b = y[j]
            #print(j,i)
            Z[j,i]=0
            for n in range(len(x_data)):
                Z[j,i]=Z[j,i]+(y_data[n] -b-w*x_data[n])**2
                
            Z[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.0
            b_grad = 0.0
            
            for 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.0
                
               
            self.b = self.b -self.lr*b_grad
            self.w = self.w- self.lr*w_grad
            
            b_history.append(self.b)
            w_history.append(self.w)
        print("\n 偏置: ",round(self.b,1), "\n 权重系数 ",round(self.w,1))
        return w_history,b_history
            
        
        
        
    
    
    def initPara(self):
        
        self.b = -120 #initial b
        self.w = -4.0 #initial w
        self.lr = 1e-3 #learning rate
        self.iteration = 10000 #iteration Number
        
    
    
    def __init__(self):
        
        
        self.b = 0 
        self.w = 0
        self.lr = 0
        self.iteration = 0
        
        

if __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.coloradmin.cn/o/1280407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端页面转pdf

首先,需要安装两个库 html2canvasjspdf 先引入这个公用的html转pdf的方法 /**path:src/utils/htmlToPdf.jsname:导出页面为pdf格式 **/ import html2Canvas from "html2canvas1.4.1"; import JsPDF from "jspdf2.5.1";const htmlToPdf {get…

[linux进程控制]进程替换

文章目录 1.进程替换的概念和原理2.如何完成进程替换2.1exec系列函数加载器的底层系统调用接口基于execve的封装--库函数 2.2 int execl(const char *path, const char *arg, ...);1.在当前进程进行替换2.在子进程进行替换 2.3 int execv(const char *path, char *const argv[]…

业务数据治理体系化实施流程学习总结

目录 一、业务数据治理实施流程 步骤 1:发现问题和制定目标 步骤 2:针对问题进行拆解,设计可衡量的指标 步骤 3:制定解决SOP和检查研发标准规范 步骤 4:推广运营,以拿结果为核心目标 步骤 5&#xff…

SmartSoftHelp8,代码版权保护

1.Html网页前端添加作者开发信息 2. Html网页添加版权信息 3. Css添加作者开发信息 4. JavaScript添加作者开发信息 5. C井后端代码添加作者开发信息 6. Dll内裤添加作者开发信息 7.应用程序添加开发作者信息,著作权,应用版权信息 下载地址&#…

使用Java语言实现字母之间的大小写转换

这个类的作用为实现字母之间的大小写转换,通过加减32来完成。 输入的代码 import java.util.Scanner; public class WordChangeDemo {public static void main(String[] args){try (Scanner in new Scanner(System.in)) {System.out.println("请输入您要进…

tomcat运行项目时,前端页面中文乱码

如图&#xff1a; 解决办法&#xff1a; 在前端页面添加下面代码 <%page language"java" pageEncoding"utf-8"%>再次运行

C++ Easyx 三子棋

目录 思路 框架​编辑 读取操作 数据操作 绘制画面 游戏的数据结构 用二维数组来模拟棋盘格 赢的情况 平局情况 Code 代码细节部分 &#xff08;1&#xff09;初始化棋盘格 &#xff08;2&#xff09; 初始化棋子类型​编辑 事件处理部分 落子 框架内代码的完善 数据处…

如何调用 API | 学习笔记

开发者学堂课程【阿里云 API 网关使用教程:如何调用 API】学习笔记&#xff0c;与课程紧密联系&#xff0c;让用户快速学习知识。 课程地址&#xff1a;阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 如何调用 API 调用 API 的三要素 要调用 API 需要三…

Nginx 具体应用

1 Nginx 1.1 介绍 一款轻量级的 Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。它占有的内存少&#xff0c;并发能力强&#xff0c;中国大陆使用 nginx 的网站有&#xff1a;百度、京东、新浪、网易、腾讯、淘宝等。第一个公开版本发布于…

1.1卷积的作用

上图解释了1∗1卷积如何适用于尺寸为H∗W∗D的输入层&#xff0c;滤波器大小为1∗1∗D&#xff0c;输出通道的尺寸为H∗W∗1。如果应用n个这样的滤波器&#xff0c;然后组合在一起&#xff0c;得到的输出层大小为H∗W∗n。 1.1∗1卷积的作用 调节通道数 由于 11 卷积并不会改…

【vue】vue-slick-carousel插件,实现横向滚动列表手动左右滚动(也可设置为自动滚动)

需求&#xff1a;图片列表横向滚动的时候&#xff0c;隐藏原始滚动条&#xff0c;通过左右箭头控制滚动条往左右按一定的步长移动。 el-carousel走马灯一滚动就是一屏&#xff0c;不适合我的需求 在npm官网搜vue-slick-carousel&#xff0c;查看更详细的配置 vue-slick-caro…

matlab 路面裂缝检测识别系统设计GUI

1、内容简介 略 23-可以交流、咨询、答疑 2、内容说明 路面裂缝检测识别系统设计GUI 基于matlab的GUI设计路面裂缝检测识别系统 matlab、GUI、直方图、裂缝检测、二值化 3、仿真分析 4、参考论文 略 链接&#xff1a;https://pan.baidu.com/s/1AAJ_SlHseYpa5HAwMJlk…

十五届海峡两岸电视主持新秀大会竞赛流程

海峡两岸电视主持新秀会是两岸电视媒体共同举办的一项活动&#xff0c;旨在为两岸年轻的电视主持人提供一个展示才华的舞台&#xff0c;促进两岸文化交流和青年交流。本届新秀会是第十二届海峡两岸电视艺术节的重要活动之一。本次竞赛赛制流程如下&#xff1a; &#xff08;1&…

遥感方向期刊总结

开眼看期刊~ 期刊分区信息搜索网址中国科学院文献情报中心期刊分区表升级版科研通期刊查询&#xff1a; 遥感领域常见期刊Nature CommunicationsRemote Sensing of EnvironmentProceedings of the National Academy of Sciences &#xff08;PNAS&#xff09;ISPRS Journal of …

SHAP(六):使用 XGBoost 和 HyperOpt 进行信用卡欺诈检测

SHAP&#xff08;六&#xff09;&#xff1a;使用 XGBoost 和 HyperOpt 进行信用卡欺诈检测 本笔记本介绍了 XGBoost Classifier 在金融行业中的实现&#xff0c;特别是在信用卡欺诈检测方面。 构建 XGBoost 分类器后&#xff0c;它将使用 HyperOpt 库&#xff08;sklearn 的 …

Mybatis 的操作(要结合上个博客一起)续集

Mybatis 是一款优秀的 持久性 框架,用于简化 JDBC 的开发 持久层 : 指的就是持久化操作的层,通常指数据访问层(dao),是用来操作数据库的 简单来说 Mybatis 是更简单完成程序和数据库交互的框架 Mybatis 的写法有两种 : 1.xml 2.注解 这两者各有利弊,后面进行总结 Mybati…

使用Java语言实现变量互换

一、 java运算 通过异或运算符实现两个变量的互换 import java.util.Scanner;public class ExchangeValueDemo {public static void main(String[] args){try (Scanner scan new Scanner(System.in)) {System.out.println("请输入A的值&#xff1a;");long A sca…

Kafka 的特点和优势

Apache Kafka 作为一款分布式流处理平台&#xff0c;以其独特的特点和卓越的优势成为实时数据处理领域的瑰宝。本文将深入研究 Kafka 的各项特点和优势&#xff0c;并通过详实的示例代码展示其在不同场景下的强大应用。 高吞吐量和水平扩展 Kafka 的设计注重高吞吐量和水平扩…

9-4 函数输入信息,函数输出信息

#include<stdio.h>struct student{char name[10];int num;char score[3]; }stu[5]; //结构体输入信息int main(){void input(struct student stu[]);void print(struct student stu[]);input(stu);print(stu);return 0; }void input(struct student stu[5]) { int i,j;fo…

JVM虚拟机:JVM参数之标配参数

本文重点 本文我们将学习JVM中的标配参数 标配参数 从jdk刚开始就有的参数&#xff0c;比如&#xff1a; -version -help -showversion