神经网络介绍及其在Python中的应用(一)

news2024/9/27 7:31:07

在这里插入图片描述

作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~
个人主页:小高要坚强的博客
当前专栏:Python之机器学习
本文内容:神经网络介绍及其在Python中的线性回归应用
作者“三要”格言:要坚强、要努力、要学习

目录

  • 一、神经网络原理详解
    • 1. 神经网络的基本结构
    • 2.神经元模型
    • 3. 激活函数
    • 4.前向传播
    • 5.反向传播
    • 6. 损失函数
    • 7.优化算法
    • 8.训练过程
  • 二、Python中的神经网络实现
    • 代码详解
      • 1.数据构造
      • 2.定义神经网络
      • 3.CUDA支持
      • 4.损失函数与优化器
      • 5.绘图函数
      • 6.训练过程
  • 三、总结

一、神经网络原理详解

1. 神经网络的基本结构

神经网络由输入层、隐藏层和输出层组成。每层由多个神经元(节点)构成。以下是各层的功能:

  • 输入层:接收外部数据,每个输入对应一个神经元。
  • 隐藏层:进行特征提取和模式识别。可以有多个隐藏层,层数越多,模型越复杂,能够学习到更复杂的特征。
  • 输出层:生成最终的预测结果,节点数量根据具体任务而定(如分类任务的类别数)。

2.神经元模型

每个神经元的计算过程可以表示为:
y=f(w⋅x+b)

  • x:输入向量。
  • w:权重向量,决定输入对输出的影响。
  • b:偏置项,调整输出值。
  • f:激活函数,用于引入非线性。

3. 激活函数

激活函数在神经元的输出中引入非线性,常用的激活函数包括:

Sigmoid:输出范围在(0, 1)之间,适合二分类任务。
在这里插入图片描述
ReLU(Rectified Linear Unit):输出为输入值的正部分,避免了梯度消失问题。
在这里插入图片描述

Tanh:输出范围在(-1, 1)之间,常用于隐藏层。

4.前向传播

前向传播是指输入数据通过网络传播,直到输出结果的过程。每个神经元接收输入,应用权重和激活函数,最终生成输出。

具体过程如下:

  • 输入数据通过输入层进入。
  • 加权求和:每个神经元将输入值与权重相乘后相加,并加上偏置。
  • 应用激活函数:输出结果通过激活函数生成。
  • 结果传递:输出结果传递给下一层神经元,直到输出层。

5.反向传播

反向传播是神经网络学习的核心算法,通过最小化损失函数来更新权重和偏置。其步骤如下:

  • 计算损失:使用损失函数(如均方误差)计算输出和真实标签之间的误差。
  • 计算梯度:通过链式法则,计算损失函数关于每个权重的梯度。
  • 更新权重:使用优化器(如SGD或Adam)根据计算得到的梯度调整权重和偏置。

6. 损失函数

损失函数衡量模型预测与真实值之间的差异。常用的损失函数包括:

  • 均方误差(MSE):适合回归问题,公式为:
    在这里插入图片描述
  • 交叉熵损失:适合分类问题,公式为:
    在这里插入图片描述

7.优化算法

优化算法用于更新神经网络的权重,以减少损失。常用的优化算法有:

  • 随机梯度下降(SGD):每次仅使用一个样本更新权重,计算效率高,但可能在局部极小值处震荡。
  • Adam优化器:结合了Momentum和RMSProp的优点,能够自适应调整学习率,效果通常较好。

8.训练过程

整个训练过程可以分为以下几个步骤:

  • 数据准备:加载并预处理数据,划分为训练集和测试集。
  • 模型初始化:定义神经网络模型,选择损失函数和优化器。
  • 训练循环:在每个epoch中,进行前向传播、计算损失、反向传播和权重更新。
  • 评估性能:在验证集上评估模型性能,监控过拟合情况。

二、Python中的神经网络实现

我们将通过以下代码实现一个简单的线性回归模型,并逐步解释每个部分。

import torch
import matplotlib.pyplot as plt
import os
from torch import nn, optim
from time import perf_counter

# 为了防止有些版本的jupyter kernel崩溃,设置这个属性
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'

# 源数据构造
X = torch.unsqueeze(torch.linspace(-3, 3, 100000), dim=1)  # 扩维
Y = X + 1.2 * torch.rand(X.size())  # 添加噪声

# 神经网络实现线性回归
class LR(nn.Module):  # 网络模型必须继承nn.Module类
    def __init__(self):
        super(LR, self).__init__() # 调用父类构造方法
        self.linear = nn.Linear(in_features=1, out_features=1)

    def forward(self, x):  # 前向传播方法,x参数接收输入数据
        out = self.linear(x)  # 线性加权操作
        return out

# 判断CUDA加速
CUDA = torch.cuda.is_available()
if CUDA:
    LR_module = LR().cuda()  # 将模型移动到GPU
    inputs = X.cuda()
    targets = Y.cuda()
else:
    LR_module = LR()
    inputs = X
targets = Y

# 损失函数和优化器
criterion = nn.MSELoss()  # 均方误差损失
optimizer = optim.SGD(LR_module.parameters(), lr=1e-4)  # 随机梯度下降优化器

# 绘图函数
def draw(output, loss):
    if CUDA:
        output = output.cpu()  # 将数据移回CPU以进行绘图
    plt.cla()
    plt.scatter(X.numpy(), Y.numpy())  # 原始数据散点图
    plt.plot(X.numpy(), output.data.numpy(), 'r-', lw=5)  # 绘制拟合直线
    plt.text(0.5, 0, 'Loss=%s' % (loss.item()), fontdict={'size': 20, 'color': 'red'})
    plt.pause(0.005)

# 训练函数
def train(model, criterion, optimizer, epochs):
    for epoch in range(epochs):
        output = model(inputs)  # 调用神经网络对象进行前向传播
        loss = criterion(output, targets)  # 损失函数的值
        optimizer.zero_grad()  #清空上一轮的梯度值
        loss.backward()  # 反向传播,计算梯度
        optimizer.step()  #  更新权重值
        if epoch % 80 == 0:  # 每80轮绘制图,观察训练效果,epoch为整个训练集通过网络进行一次前向和一次反向传播的过程
            draw(output, loss)
    return model, loss

# 调用测试
start = perf_counter()
model, loss = train(LR_module, criterion, optimizer, epochs=5000)
finish = perf_counter()
time_total = finish - start
print("训练耗费时间:%s" % time_total)
print("final loss:", loss.item())
print("weights:", list(model.parameters()))

代码详解

1.数据构造

  • X为输入特征,从-3到3的100,000个均匀分布的点。
  • Y是目标值,加入了随机噪声,使得模型更具挑战性。

2.定义神经网络

  • LR类继承自nn.Module,其中self.linear定义了一个线性层,输入和输出特征均为1。

3.CUDA支持

  • 检查是否可以使用CUDA加速,如果可以,则将模型和数据移动到GPU。

4.损失函数与优化器

  • 使用均方误差损失函数(MSELoss)和随机梯度下降(SGD)作为优化器。

5.绘图函数

  • draw函数用于实时显示训练过程中的数据点和模型拟合结果。

6.训练过程

  • train函数中,进行前向传播、计算损失、反向传播和权重更新。每80个epoch绘制一次图以观察训练进展。

通过上述代码,我们实现了一个简单的线性回归模型,演示了神经网络的基本构建和训练过程。

三、总结

神经网络通过层叠多个非线性变换,能够学习到复杂的模式和特征。在实际应用中,通过选择合适的架构、激活函数和优化算法,可以实现高效的模型训练和预测。随着深度学习技术的不断发展,神经网络将在更广泛的领域发挥作用。

在这里插入图片描述

码字艰辛,本篇内容就分享至此,如果渴望深入了解更多Python机器学习方面的应用,别忘了点击关注博主,引导你从零开始探索Python在统计分析上的奥秘。同时,对于在数据分析与机器学习旅程中感到迷茫的朋友们,欢迎浏览我的专题系列:《Python之机器学习》,让我们一起努力坚强学习,共同进步吧~

请添加图片描述

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

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

相关文章

使用python爬取豆瓣网站?如何简单的爬取豆瓣网站?

1.对python爬虫的看法 首先说说我对python的看法,我的专业是大数据,我从事的工作是java开发,但是在工作之余,我对python又很感兴趣,因为我觉得python是一门很好的语言,第一:它可以用来爬取数据…

fmql之字符驱动设备(2)

例行的点灯来喽。 之前是寄存器读写&#xff0c;现在要学习通过设备树点灯。 dtsled.c 寄存器写在reg 把用到的寄存器写在设备树的led节点的reg属性。 其实还是对寄存器的读写。 &#xff08;不推荐&#xff09; 头文件 #include <linux/kernel.h> #include <li…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-26

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-26 1. LLMs Still Can’t Plan; Can LRMs? A Preliminary Evaluation of OpenAI’s o1 on PlanBench Authors: Karthik Valmeekam, Kaya Stechly, Subbarao Kambhampati LLMs仍然无法规划&#xff1b;LRMs可以…

【通俗易懂】FFT求解全过程,各参数详细解释

在进行FFT全过程讲解之前&#xff0c;小编先给大家解释一下&#xff0c;在FFT中出现的一些参数名词解释。 &#xff08;1&#xff09;采样频率 Fs Fs 1 / 采样间隔 根据奈奎斯特定理&#xff1a;Fs ≥ 最高频率分量的两倍&#xff0c;这样才能避免混叠 &#xff08;2&…

解决macOS安装redis以后不支持远程链接的问题

参考文档:https://blog.csdn.net/qq_37703224/article/details/142542179?spm1001.2014.3001.5501 安装的时候有个提示, 使用指定配置启动: /opt/homebrew/opt/redis/bin/redis-server /opt/homebrew/etc/redis.conf那么我们可以尝试修改这个配置文件: code /opt/homebrew/…

傅里叶级数在机器人中的应用(动力学参数辨识)

B站首发&#xff01;草履虫都能看懂的【傅里叶变换】讲解&#xff0c;清华大学李永乐老师教你如何理解傅里叶变换&#xff0c;辨清美颜和变声原理&#xff0c;&#xff01;&#xff01;_哔哩哔哩_bilibiliB站首发&#xff01;草履虫都能看懂的【傅里叶变换】讲解&#xff0c;清…

AI 智能体 | 手捏素材选题库 Coze Bot,帮你实现无限输出

做自媒体的同学经常遇到的一个痛点就是无限输出&#xff0c;那怎么才能有源源不断的选题呢&#xff1f;那就是搭建一个选题素材库。 下面就为大家介绍一下基于 Coze Bot 快速搭建素材选题库&#xff0c;希望能让大家才思泉涌。 一、流程拆解 日常素材库积累的过程可以描述为…

eslint-plugin-react的使用中,所出现的react版本警告

记一次使用eslint-plugin-react的警告 Warning: React version not specified in eslint-plugin-react settings. See https://github.com/jsx-eslint/eslint-plugin-react#configuration . 背景 我们在工程化项目中&#xff0c;常常会通过eslint来约束我们代码的一些统一格…

汽车总线之----J1939总线

instruction SAE J1939 是由美国汽车工程协会制定的一种总线通信协议标准&#xff0c;广泛应用于商用车&#xff0c;船舶&#xff0c;农林机械领域中&#xff0c;J1939协议是基于CAN的高层协议&#xff0c;我们来看一下两者之间的关系。在J1939 中&#xff0c;物理层和数据链路…

第13讲 实践:设计SLAM系统

设计一个视觉里程计&#xff0c;理解SLAM软件框架如何搭建&#xff0c;理解视觉里程计设计容易出现的问题以及解决方法。 目录 1、工程目标 2、工程框架 3、实现 附录 1、工程目标 实现一个精简版的双目视觉里程计。由一个光流追踪的前端和一个局部BA的后端组成。 2、工程…

asp.net mvc core 路由约束,数据标记DataTokens

》从0自己搭建MVC 》用 asp.net Core web 应用 空web 应用程序 需要配置 mvc服务 、mvc路由 新建 Controller 、Models、Views 》》》core 6 之前版本 vs2022 asp.net Core Web 应用&#xff08;模型-视图-控制器&#xff09; 不需要配置 就是mvc框架 asp.net Core web 应…

从Elasticsearch到RedisSearch:探索更快的搜索引擎解决方案

文章目录 RedisSearch 的关键功能与 ElasticSearch 对比性能对比产品对比 如何使用 Docker 安装 RedisSearch1. 获取 RedisSearch Docker 镜像2. 启动 RedisSearch 容器3. 验证安装 RedisSearch 使用示例1. 连接到 RedisSearch2. 创建索引3. 添加文档4. 执行搜索搜索所有包含 &…

【Geoserver使用】2.26.0版本发布主要内容

文章目录 前言一、GeoServer 2.26.0 版本二、主要内容1.Java17支持2.Docker更新3.搜索改进4.广泛的 MapML 改进4.重写演示请求页面5.栅格属性表扩展6.GeoCSS 改进7.地球静止卫星 AUTO 代码8.labelPoint 功能改进9.改进的矢量图块生成10.GeoPackage QGIS 兼容性改进11.新的图像马…

深度学习—神经网络基本概念

一&#xff0c;神经元 1.生物神经元与人工神经元 1.1神经元是人脑的基本结构和功能单位之一。人脑中有数1000亿个神经元&#xff0c;其功能是接受&#xff08;树突&#xff09;&#xff0c;整合&#xff08;细胞体&#xff09;&#xff0c;传导&#xff08;轴突&#xff09;和…

MySQL --用户管理

文章目录 1.用户1.1用户信息1.2创建用户1.3删除用户1.4修改用户密码 2.数据库的权限2.1给用户授权2.2回收权限 如果我们只能使用root用户&#xff0c;这样存在安全隐患。这时&#xff0c;就需要使用MySQL的用户管理。 1.用户 1.1用户信息 MySQL中的用户&#xff0c;都存储在系…

Spring Cloud 教程(二) | 搭建SpringCloudAlibaba

Spring Cloud 教程&#xff08;二&#xff09; | 搭建SpringCloudAlibaba 前言一、SpringBoot 与 SpringCloud 版本对应关系&#xff1a;二、SpringCloud 与 SpringCloudAlibaba版本对应关系&#xff1a;三、SpringCloudAlibaba版本 与 组件版本 对应关系&#xff1a;四、搭建S…

Django项目配置日志

需求 在Django项目中实现控制台输出到日志文件&#xff0c;并且设置固定的大小以及当超过指定大小后覆盖最早的信息。 系统日志 使用Django自带的配置&#xff0c;可以自动记录Django的系统日志。 可以使用logging模块来配置。下面是一个完整的示例代码&#xff0c;展示了如…

Java | Leetcode Java题解之第438题找到字符串中所有字母异位词

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> findAnagrams(String s, String p) {int sLen s.length(), pLen p.length();if (sLen < pLen) {return new ArrayList<Integer>();}List<Integer> ans new ArrayList<Int…

163页制造业变革转型:营销/服务/研发/供应链/制造/质量/财务

制造业企业要实现变革转型&#xff0c;可以从营销、服务、研发、供应链、制造、质量、劳务以及人力资源等多个方面着手&#xff1a; 一、营销 市场调研与定位 深入了解目标市场的需求、趋势和竞争态势。通过大数据分析、消费者调研等手段&#xff0c;精准把握市场动态&#…

管家婆分销费用分摊功能使用说明!

在入库和销售业务中&#xff0c;往往会产生一些费用需要和入库单和销售单关联&#xff0c;这时候就可以使用费用分摊的功能。下面我们一起来学习在分销A\V系列软件中费用分摊的操作步骤 一、入库费用分摊 1、只有移动加权平均成本算法才有入库费用分摊单&#xff1b;入库费用分…