当前位置: 首页 > article >正文

PyTorch 线性回归模型构建与神经网络基础要点解析

笔记

1 PyTorch构建线性回归模型

1.1 创建数据集

import torch
from torch.utils.data import TensorDataset  # 创建x和y张量数据集对象
from torch.utils.data import DataLoader  # 创建数据集加载器
import torch.nn as nn  # 损失函数和回归函数
from torch.optim import SGD  # 随机梯度下降函数, 取一个训练样本算梯度值
from sklearn.datasets import make_regression  # 创建随机样本, 工作中不使用
import matplotlib.pyplot as plt
​
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
​
​
# todo: 1-创建线性回归样本 x y coef(w) b
def create_datasets():x, y, coef = make_regression(n_samples=100,  # 样本数n_features=1,  # 特征数noise=10,  # 标准差, 噪声, 样本离散程度coef=True,  # 返回系数, wbias=14.5,  # 截距 brandom_state=0)
​# 将数组转换成张量x = torch.tensor(data=x)y = torch.tensor(data=y)# print('x->', x)# print('y->', y)# print('coef->', coef)return x, y, coef
​
if __name__ == '__main__':x, y, coef = create_datasets()

1.2 训练模型

# todo: 2-模型训练
def train(x, y, coef):# 创建张量数据集对象datasets = TensorDataset(x, y)print('datasets->', datasets)# 创建数据加载器对象# dataset: 张量数据集对象# batch_size: 每个batch的样本数# shuffle: 是否打乱样本dataloader = DataLoader(dataset=datasets, batch_size=16, shuffle=True)print('dataloader->', dataloader)# for batch in dataloader:  # 每次遍历取每个batch样本#   print('batch->', batch)  # [x张量对象, y张量对象]#   break# 创建初始回归模型对象, 随机生成w和b, 元素类型为float32# in_features: 输入特征数 1个# out_features: 输出特征数 1个model = nn.Linear(in_features=1, out_features=1)print('model->', model)# 获取模型对象的w和b参数print('model.weight->', model.weight)print('model.bias->', model.bias)print('model.parameters()->', list(model.parameters()))# 创建损失函数对象, 计算损失值criterion = nn.MSELoss()# 创建SGD优化器对象, 更新w和boptimizer = SGD(params=model.parameters(), lr=0.01)# 定义变量, 接收训练次数, 损失值, 训练样本数epochs = 100loss_list = []  # 存储每次训练的平均损失值total_loss = 0.0train_samples = 0for epoch in range(epochs):  # 训练100次# 借助循环实现 mini-batch SGD 模型训练for train_x, train_y in dataloader:# 模型预测# train_x->float64# w->float32y_pred = model(train_x.type(dtype=torch.float32))  # y=w*x+bprint('y_pred->', y_pred)# 计算损失值, 调用损失函数对象# print('train_y->', train_y)# y_pred: 二维张量# train_y: 一维张量, 修改成二维张量, n行1列# 可能发生报错, 修改形状# 修改train_y元素类型, 和y_pred类型一致, 否则发生报错loss = criterion(y_pred, train_y.reshape(shape=(-1, 1)).type(dtype=torch.float32))print('loss->', loss)# 获取loss标量张量的数值 item()# 统计n次batch的总MSE值total_loss += loss.item()# 统计batch次数train_samples += 1# 梯度清零optimizer.zero_grad()# 计算梯度值loss.backward()# 梯度更新 w和b更新# step()等同 w=w-lr*gradoptimizer.step()# 每次训练的平均损失值保存到loss列表中loss_list.append(total_loss / train_samples)print('每次训练的平均损失值->', total_loss / train_samples)print('loss_list->', loss_list)print('w->', model.weight)print('b->', model.bias)# 绘制每次训练损失值曲线变化图plt.plot(range(epochs), loss_list)plt.title('损失值曲线变化图')plt.grid()plt.show()
​# 绘制预测值和真实值对比图# 绘制样本点分布plt.scatter(x, y)# 获取1000个样本点# x = torch.linspace(start=x.min(), end=x.max(), steps=1000)# 计算训练模型的预测值y1 = torch.tensor(data=[v * model.weight + model.bias for v in x])# 计算真实值y2 = torch.tensor(data=[v * coef + 14.5 for v in x])plt.plot(x, y1, label='训练')plt.plot(x, y2, label='真实')plt.legend()plt.grid()plt.show()
​
​
if __name__ == '__main__':x, y, coef = create_datasets()train(x, y, coef)

2 人工神经网络介绍

2.1 什么是人工神经网络

  • 仿生生物学神经网络的计算模型

  • ANN(人工神经网络)->NN(神经网络)

2.2 如何构建人工神经网络

神经网络是由三个层, 每层由多个神经元构成

  • 输入层: 输入样本的特征值, 一层

  • 隐藏层: 提取复杂特征, 可以有多层

  • 输出层: 输出y值, y预测值

2.3 人工神经网络内部状态值和激活值

神经元如何工作

  • 内部状态值(加权求和值)

    • z=w1*x1+w2*x2+...+b

  • 激活值

    • a=f(z)

3 激活函数介绍

3.1 激活函数作用

  • 给神经网络模型中引入非线性因素

  • 生产环境中,问题存在线性不可分情况

3.2 常见激活函数

  • sigmoid激活函数

    • sigmoid激活值范围是[0, 1], 只有正信号, 没有负信号, 模型只能学习到正信号

    • 加权求和值在[-6,6]范围, 计算激活值时分布到[0, 1], 否则激活值只能是0或1

    • sigmoid激活函数导数值范围是[0,0.25], 加权求和值在[-6,6]范围, 激活值梯度才分布到[0, 0.25], 否则梯度为0

    • 神经网络中梯度连乘, sigmoid激活函数梯度值很小, 接近0, 梯度消失 0.25*0.25*0.25*...

    • sigmoid一般在二分类输出层使用, 如果神经网络隐藏层在5层之内也可以考虑使用sigmoid

    # sigmoid激活值: torch.sigmoid(x)
    ​
    import torch
    import matplotlib.pyplot as plt
    ​
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    ​
    ​
    def dm01():# 创建x值, 线性模型输出值作为激活函数的输入值x = torch.linspace(-20, 20, 1000)# 计算激活值y = torch.sigmoid(input=x)# 创建画布对象和坐标轴对象_, axes = plt.subplots(1, 2)  # 一行两列, 绘制两个子图axes[0].plot(x, y)axes[0].grid()axes[0].set_title('sigmoid激活函数')
    ​# 创建x值,可以自动微分, 线性模型输出值作为激活函数的输入值x = torch.linspace(-20, 20, 1000, requires_grad=True)torch.sigmoid(input=x).sum().backward()axes[1].plot(x.detach().numpy(), x.grad)axes[1].grid()axes[1].set_title('sigmoid激活函数')plt.show()
    ​
    ​
    if __name__ == '__main__':dm01()

  • tanh激活函数

    • tanh激活值范围是[-1, 1], 既有正信号, 又有负信号, 激活值是以0对称, 模型可以学习到正负信号

    • 加权求和值在[-3,3]范围, 计算激活值时分布到[-1, 1], 否则激活值只能是-1或1

    • tanh激活函数导数值范围是[0,1], 加权求和值在[-3,3]范围, 相比sigmoid激活导数更大, 模型收敛程度更快, 但是如果加权求和值大于3或小于-3, 也是会导致梯度消失, 最好分布在0附近(梯度值最大)

    • tanh激活函数可以在隐藏层使用, 不是优先选择, 浅层神经网络可以使用

    # tanh激活值: torch.tanh(x)
    ​
    import torch
    import matplotlib.pyplot as plt
    from torch.nn import functional as F
    # F.sigmoid()
    # F.tanh()
    ​
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    ​
    ​
    def dm01():# 创建x值, 线性模型输出值作为激活函数的输入值x = torch.linspace(-20, 20, 1000)# 计算激活值y = torch.tanh(input=x)# 创建画布对象和坐标轴对象_, axes = plt.subplots(1, 2)  # 一行两列, 绘制两个子图axes[0].plot(x, y)axes[0].grid()axes[0].set_title('tanh激活函数')
    ​# 创建x值,可以自动微分, 线性模型输出值作为激活函数的输入值x = torch.linspace(-20, 20, 1000, requires_grad=True)torch.tanh(input=x).sum().backward()axes[1].plot(x.detach().numpy(), x.grad)axes[1].grid()axes[1].set_title('tanh激活函数')plt.show()
    ​
    ​
    if __name__ == '__main__':dm01()

  • relu激活函数

    • relu激活值范围是[0, x], x是线性输出的正值, 只有正信号

    • 加权求和值大于0, 也可以一部分小于0(神经元死亡, 防止过拟合)

    • relu激活函数导数值0或1, 如果线性输出大于0, 导数为1, 不会出现梯度消失情况, 模型收敛程度更快; 如果线性输出小于0, 神经元死亡, 防止过拟合(选择leaky relu或prelu)

    • relu激活函数优先选择, 计算复杂度最小, 大于0不存在梯度消失情况

    # relu激活值: torch.relu(x)
    ​
    import torch
    import matplotlib.pyplot as plt
    from torch.nn import functional as F
    # F.sigmoid()
    # F.tanh()
    ​
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    ​
    ​
    def dm01():# 创建x值, 线性模型输出值作为激活函数的输入值x = torch.linspace(-20, 20, 1000)# 计算激活值y = torch.relu(input=x)# torch.leaky_relu()# torch.prelu()# 创建画布对象和坐标轴对象_, axes = plt.subplots(1, 2)  # 一行两列, 绘制两个子图axes[0].plot(x, y)axes[0].grid()axes[0].set_title('relu激活函数')
    ​# 创建x值,可以自动微分, 线性模型输出值作为激活函数的输入值x = torch.linspace(-20, 20, 1000, requires_grad=True)torch.relu(input=x).sum().backward()axes[1].plot(x.detach().numpy(), x.grad)axes[1].grid()axes[1].set_title('relu激活函数')plt.show()
    ​
    ​
    if __name__ == '__main__':dm01()

  • softmax激活函数

    • 多分类任务的输出层使用, 将输出层加权求和值转换成概率

    import torch
    import pandas as pd
    ​
    ​
    def dm01():# 创建输出层加权求和值y = torch.tensor(data=[[0.2, 0.02, 0.15, 0.15, 1.3, 0.5, 0.06, 1.1, 0.05, 3.75],[0.2, 0.02, 0.15, 3.75, 1.3, 0.5, 0.06, 1.1, 0.05, 0.15]])# softmax激活函数转换成概率值# 1轴按列计算# y_softmax = torch.softmax(input=y, dim=-1)y_softmax = torch.softmax(input=y, dim=1)print('y_softmax->', y_softmax)
    ​
    ​
    if __name__ == '__main__':dm01()

3.6 如何选择激活函数

  • 隐藏层

    • 优选relu激活函数, 其次选leaky relu/prelu

    • 尽量少使用sigmoid激活函数, 可以使用tanh激活函数代替sigmoid激活函数 浅层神经网络

  • 输出层

    • 二分类问题 sigmoid激活函数

    • 多分类问题 softmax激活函数

    • 回归问题 identity激活函数

4 参数初始化

4.1 参数初始化作用

  • 参数->w和b, 创建初版模型时指定w和b的值

  • 选择合适的参数, 计算得到的加权求和的值会落到激活函数合理的区间, 加快模型收敛速度以及增加不同学习特征值

4.2 常见参数初始化方法

  • 随机初始化

  • 全0、1初始化

  • 固定值初始化

  • kaiming初始化

  • xavier初始化

    import torch
    import torch.nn as nn
    ​
    ​
    # 随机参数初始化
    def dm01():# 创建线性层对象, 对线性层的权重进行初始化# in_features: 输入神经元个数# out_features: 输出神经元个数linear1 = nn.Linear(in_features=5, out_features=8)linear2 = nn.Linear(in_features=8, out_features=10)# 均匀分布初始化,默认在(0,1)区间均匀分布, 可以通过a和b参数调整区间nn.init.uniform_(linear1.weight)nn.init.uniform_(linear1.weight, a=-1/torch.sqrt(torch.tensor(5.0)), b=1/torch.sqrt(torch.tensor(5.0)))nn.init.uniform_(linear1.bias)print(linear1.weight)print(linear1.bias)
    ​
    ​
    # 正态分布参数初始化
    def dm02():# 创建线性层对象, 对线性层的权重进行初始化# in_features: 输入神经元个数# out_features: 输出神经元个数linear1 = nn.Linear(in_features=5, out_features=8)linear2 = nn.Linear(in_features=8, out_features=10)# 均匀分布初始化nn.init.normal_(linear1.weight)nn.init.normal_(linear1.bias)print(linear1.weight)print(linear1.bias)
    ​
    ​
    # nn.init.zeros_()  # 全0初始化
    # nn.init.ones_()  # 全1初始化
    # nn.init.constant_(val=0.1)  # 全固定值初始化
    # nn.init.kaiming_uniform_()  # 凯明均匀分布初始化
    # nn.init.kaiming_normal_()  # 凯明正态分布初始化
    # nn.init.xavier_uniform_()  # xavier均匀分布初始化
    # nn.init.xavier_normal_()  # xavier正态分布初始化
    ​
    ​
    if __name__ == '__main__':dm01()dm02()

4.3 如何选择参数初始化方法

  • 浅层神经网络可以选择随机初始化

  • 深层神经网络结合激活函数选择

    • tanh激活函数 -> xavier初始化

    • relu激活函数 -> kaiming初始化

相关文章:

PyTorch 线性回归模型构建与神经网络基础要点解析

笔记 1 PyTorch构建线性回归模型 1.1 创建数据集 import torch from torch.utils.data import TensorDataset # 创建x和y张量数据集对象 from torch.utils.data import DataLoader # 创建数据集加载器 import torch.nn as nn # 损失函数和回归函数 from torch.optim impo…...

Android平台FFmpeg音视频开发深度指南

一、FFmpeg在Android开发中的核心价值 FFmpeg作为业界领先的多媒体处理框架,在Android音视频开发中扮演着至关重要的角色。它提供了: 跨平台支持:统一的API处理各种音视频格式完整功能链:从解码、编码到滤镜处理的全套解决方案灵…...

深入解析路由策略:从流量控制到策略实施

一、网络流量双平面解析 在路由策略的设计中,必须明确区分两个关键平面: 1. 控制层面(Control Plane) ​​定义​​:路由协议传递路由信息形成的逻辑平面(如OSPF的LSA、RIP的Response报文)​…...

FHE 之 面向小白的引导(Bootstrapping)

1. 引言 FHE初学者和工程师常会讨论的一个问题是; “什么是引导(bootstrapping)?” 从理论角度看,这个问题的答案很简单: 引导就是套用 Gentry 提出的思想——在加密状态下同态地执行解密操作&#xff…...

51单片机入门教程——AT24C02数据存储

前言 本教程基于B站江协科技课程进行个人学习整理,专为拥有C语言基础的零基础入门51单片机新手设计。既帮助解决因时间差导致的设备迭代调试难题,也助力新手快速掌握51单片机核心知识,实现从C语言理论到单片机实践应用的高效过渡 。 目录 …...

M0的基础篇之PWM学习

一、困惑 上一节课就是单纯的之配置了一个基础的定时器进行计数,计到一定的数值也就是到了一定的时间就进入中断,执行中断里面的任务,也就是一个最基础的定时的功能 这一节课的定时器产生了一个pwm波。也就是我们可以改变里面高电平的持续时间…...

Python----神经网络(基于AlexNet的猫狗分类项目)

一、基于AlexNet的猫狗分类 1.1、项目背景 猫和狗是我们生活中最常见的宠物,它们的图像数据大量存在于互联网上。对此进行分类不仅可以帮助开发自动化宠物识别应用,也可以应用于更广泛的计算机视觉领域。例如,训练良好的模型可以支持流浪动物…...

excel表数据导入数据库

前两天,有个两DB之间的数据导出导入的需求。对方提供的是excel表,我这边是mysql数据库,excel表第一行是字段名,之后的行是记录的值。 其实没有多复杂,我先将exel转成csv,结果mysql导入csv,第一行…...

SMT贴片钢网精密设计与制造要点解析

内容概要 SMT贴片钢网作为电子组装工艺的核心载体,其设计与制造质量直接影响焊膏印刷精度及产品良率。本文系统梳理了钢网全生命周期中的15项关键技术指标,从材料选择、结构设计到工艺控制构建完整技术框架。核心要点涵盖激光切割精度的微米级调控、开口…...

第三节:条件语句与循环:控制程序流程

📌 第三节:条件语句与循环:控制程序流程 目标:熟练运用条件判断、循环结构,实现动态逻辑与重复操作,掌握常见算法的底层实现。 一、条件语句:让程序“聪明”起来 1. if-else 基础语法 作用&am…...

荣耀A8互动娱乐组件部署实录(第1部分:服务端环境搭建)

作者:一位被“只支持安卓”的前端劝退过三次的技术人 前言 这一套组件我拆包已经不止一遍了,老实讲,不支持 iOS 是遗憾,但对于研究 UI 动态加载、资源分离结构和整体架构来说,A8 的这套服务还算完整,服务器…...

流式渲染 Streaming SSR

以下是关于流式渲染(Streaming SSR)的基本知识点总结: 一、流式渲染核心概念 1. 与传统SSR对比 维度传统SSR流式SSR响应方式完整HTML生成后一次性返回分块逐步返回HTML内容首字节时间较慢(需等待所有数据处理完成)极快(立即发送初始HTML结构)内存压力高(需缓存完整页面…...

基于Python Flask的深度学习电影评论情感分析可视化系统(2.0升级版,附源码)

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…...

如何减少极狐GitLab 容器镜像库存储?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 减少容器镜像库存储 (BASIC ALL) 未清理的容器镜像库会随着时间的推移而变大。添加大量镜像或标签时: 获取可用标…...

计算机学习路线与编程语言选择(信息差)

——授人以鱼不如授人以渔 计算机学习公式:1/3科班思维 1/3路线选择 1/3工程能力 好工作随便找(来自B站小毛毛熊) 本文主要是路线选择!!!下面开始吧。 面向岗位学习!到招聘网站看看有哪些…...

【redis】redis 手动切换主从

场景一: 测试需要,需要手动切换主从 在redis节点: $ redis-cli -h xx.xx.xx.xx -p XX -a XX shutdown 不要直接关闭redis进程,使用 shutdown ,能在进程关闭前持久化内存中的数据 待主从切换完毕后&#xff1…...

基于设备指纹识别的反爬虫技术:给设备办 “身份证”

传统的封禁 IP、验证码等反爬虫手段已逐渐失效,基于设备指纹识别的反爬虫技术应运而生,成为守护数据安全的新防线。它如同给每个设备办一张独一无二的 “身份证”,精准区分正常用户与爬虫工具。 一、基础参数采集:构建设备指纹的…...

SpringAI框架中的RAG知识库检索与增强生成模型详解

SpringAI框架中的RAG知识库检索与增强生成模型详解 一、RAG简介 RAG(Retrieval-Augmented Generation)可以通过检索知识库,克服大模型训练完成后参数冻结的局限性,携带知识让大模型根据知识进行回答。 二、SpringAI框架支持的R…...

【造包工具】【Xcap】精讲Xcap构造分片包(IPv4、ipv6、4G\5G等pcap均可),图解超赞超详细!!!

目录 前言 1. XCap工具概念介绍 2. Xcap环境说明 2.1 新建报文组 2.2 导入数据包 2.3 查看报文组 2.4 复制删除报文组 3. 构造分片包 3.1 造普通/外层分片步骤: 3.2 造内层分片步骤 3.2.1 建立一个新报文 3.2.2 将组装的新报文分片 3.2.3 替换原始包内层部分 3.2…...

第三节:Vben Admin 最新 v5.0 对接后端登录接口(下)

文章目录 前言一、处理请求头Authorization二、/auth/user/info 接口前端接口后端接口三、/auth/codes 接口1.前端2.后端四、测试接口前言 上一节内容,实现了登录的/auth/login 接口,但是登陆没有完成,还需要完成下面两个接口。才能完成登录。 一、处理请求头Authorizatio…...

爬虫学习————开始

🌿自动化的思想 任何领域的发展原因————“不断追求生产方式的改革,即使得付出与耗费精力越来愈少,而收获最大化”。由此,创造出方法和设备来提升效率。 如新闻的5W原则直接让思考过程规范化、流程化。或者前端框架/后端轮子的…...

Ubuntu18.04搭建samda服务器

一.什么是Samba服务器? Samba服务器是一种基于开源协议实现的网络共享服务软件,主要用于在不同操作系统(如Windows、Linux、Unix)之间实现文件和打印机共享功能。其核心目标是解决跨平台资源共享的兼容性问题,尤其是在…...

K8S扩缩容及滚动更新和回滚

目录: 1、滚动更新1、定义Deployment配置2、应用更新 2、版本回滚1. 使用kubectl rollout undo命令 3、更新暂停与恢复1、暂停更新2、更新镜像(例如,使用kubectl set image命令)3、恢复更新 4、弹性扩缩容1、扩容命令2、缩容命令3…...

一文掌握 LVGL 9 的源码目录结构

文章目录 📂 一文掌握 LVGL 9 的源码目录结构🧭 顶层目录概览📁 1. src/ — LVGL 的核心源码(🔥重点)📁 2. examples/ — API 示例📁 3. demos/ — 综合演示项目📁 4. do…...

2025-05-10-FFmepg库裁切有水印的视频

裁后 代码 import subprocess# 文件路径 input_video_path "bg_video.mp4" output_video_path "output_video_cropped.mp4"# 裁剪视频下方的水印 def crop_video(input_video_path, output_video_path, crop_height):# 获取视频的分辨率def get_video…...

Vue3 路由配置与跳转传参完整指南

目录 一、路由配置 1. 基本路由配置 2. 动态路由配置 3. 可选参数配置 二、路由跳转与传参 1. 声明式导航 (模板中) 2. 编程式导航 (JavaScript中) 三、参数接收 1. 接收动态路由参数 2. 接收查询参数 3. 监听参数变化 四、高级用法 1. 路由元信息 2. 路由守卫控…...

opencv+opencv_contrib+cuda和VS2022编译

本文介绍使用OpenCV和OpenCV_Contrib源码及Cuda进行编译的过程,编译过程中会用到OpenCV、OpenCV_Contrib、CUDA Toolkit、cuDNN、Cmake、VS2022等工具,最终编译OpenCV的Cuda版本。 一、OpenCV下载地址 OpenCV官网下载地址:https://opencv.org/releases…...

《深挖Java中的对象生命周期与垃圾回收机制》

大家好呀!👋 今天我们要聊一个Java中超级重要的话题——对象的生命周期和垃圾回收机制。 一、先来认识Java世界的"居民"——对象 👶 在Java世界里,一切皆对象。就像现实世界中的人一样,每个Java对象也有自…...

C++中extern关键字详解:不同情况下的使用方式

在 C 中,extern 关键字主要用于声明变量或函数是在其他文件中定义的,从而可以在当前文件中使用这些变量或函数。下面详细介绍 extern 修饰全局变量、函数等的用法区别以及注意事项。 修饰全局变量 详细介绍 当 extern 用于修饰全局变量时,…...

【QT】深入理解 Qt 中的对象树:机制、用途与最佳实践

深入理解 Qt 中的对象树:机制、用途与最佳实践 在使用 Qt 编程时,你是否注意到很多对象可以设置“父对象”?比如: QPushButton* btn new QPushButton(parentWidget);这不是简单的层级结构,而是 Qt 强大而优雅的 对象…...