神经网络基础[ANN网络的搭建]

news2025/4/25 12:07:45

神经网络

人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN),是一种模仿生物神经网络结构和功能的计算模型。各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。下图是生物神经元示意图:

  1. 是一种计算模型
  2. 简称:NN

请添加图片描述

当电信号通过树突进入到细胞核时,会逐渐聚集电荷。达到一定的电位后,细胞就会被激活,通过轴突发出电信号。

NN

神经网络中信息只向一个方向移动,即从输入节点向前移动,通过隐藏节点,再向输出节点移动。其中的基本部分是:

1.输入层: 即输入 x 的那一层

2.输出层: 即输出 y 的那一层

3.隐藏层: 输入层和输出层之间都是隐藏层[作用:加权求和+激活]

特点

•同一层的神经元之间没有连接。

•第 N 层的每个神经元和第 N-1层 的所有神经元相连(这就是full connected的含义),这就是全连接神经网络。

•第N-1层神经元的输出就是第N层神经元的输入。

•每个连接都有一个权重值(w系数和b系数)。

请添加图片描述

激活函数

激活函数的作用

激活函数用于对 每层输出数据进行变换, 进而为整个网络注入了非线性因素。此时, 神经网络就可以拟合各种曲线。

在这里插入图片描述

如果不使用激活函数,无论网络搭建得再复杂也是线性模型

常用的激活函数
  • sigmoid

    常用于解决二分类问题

f ( x ) = 1 1 + e − x f(x) = \frac{1} {1 + e^{-x}} f(x)=1+ex1

导函数公式
f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) f'(x) = f(x)(1 - f(x)) f(x)=f(x)(1f(x))

图像

在这里插入图片描述

f(x):
    定义域: (-∞,+∞)
    值域:(0,1)
有效区间:[-6,6]
f'(x)
	值域:(0,0.25]
不足:计算量大

一般来说, sigmoid 网络在5 层之内就会产生梯度消失现象。而且,该激活函数并不是以 0 为中心的,所以在实践中这种激活函数使用的很少

  • tanh

    类似sigmoid

    f ( x ) = e x − e − x e x + e − x = 1 − e − 2 x 1 + e − 2 x f(x) =\frac{e^x - e^{-x}}{e^x + e^{-x}}=\frac{1 - e^{-2x}}{1 + e^{-2x}} f(x)=ex+exexex=1+e2x1e2x

    f ′ ( x ) = 1 − f 2 ( x ) f'(x) = 1 - f^2(x) f(x)=1f2(x)

    f(x):
        值域:(-1,1)
        有效区间:[-3,3]
    特点:
        - 收敛速度比sigmoid快
        - 存在梯度消失问题
    

    图像


    在这里插入图片描述

  • softmax

    softmax用于多分类过程中,它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。计算方法如下所示
    s o f t m a x ( z i ) = e z i Σ j e z j softmax(z_i) = \frac{e ^ {z_i}}{Σ_j e ^{z_j}} softmax(zi)=Σjezjezi

  • ReLu

    f ( x ) = m a x ( 0 , x ) f(x) = max(0,x) f(x)=max(0,x)

    f ′ ( x ) = { 0 , x < 0 1 , x ≥ 0 f'(x) = \begin{cases}0 & {,x < 0}\\1 & ,x \geq 0 \end{cases} f(x)={01,x<0,x0

    优点:
        - 计算量小,是最常用的一种激活函数
        - Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
    缺点:
        - 存在 '神经元死亡' 问题
    

随着训练的推进,部分输入会落入小于0区域,导致对应权重无法更新。这种现象被称为 神经元死亡。

图像

在这里插入图片描述

在这里插入图片描述

代码
def show(activation, *args):
    """
    :param activation: (激活函数:接收其内存地址) torch.sigmoid | torch.tanh | torch.relu
    :return: None
    """
    _, axes = plt.subplots(1, 2)
    x = torch.linspace(-20, 20, 1000)
    y = activation(x)

    axes[0].plot(x, y)
    axes[0].grid()
    axes[0].set_title(str(activation).split(' ')[2])

    x = torch.linspace(-20, 20, 1000, requires_grad=True)
    print(activation(x, *args).sum())
    activation(x, *args).sum().backward()

    axes[1].plot(x.detach(), x.grad)
    axes[1].grid()
    axes[1].set_title(f"{str(activation).split(' ')[2]}'s Derived")
    plt.show()


def softmax_show():
    """

    :return:
    """
    score = torch.tensor([0.2, 0.02, 0.15, 0.15, 0.15, 0.15, 1, 3.14])
    probabilities = torch.softmax(score, dim=0)
    print(probabilities)
    print(sum(probabilities))

def elu():
    elu = torch.nn.ELU(alpha=1)
    _, axes = plt.subplots(1, 2)
    x = torch.linspace(-40, 40, 1000)
    y = elu(x)

    axes[0].plot(x, y)
    axes[0].grid()
    axes[0].set_title('elu')

    x = torch.linspace(-40, 40, 1000, requires_grad=True)
    print(elu(x).sum())
    elu(x).sum().backward()

    axes[1].plot(x.detach(), x.grad)
    axes[1].grid()
    axes[1].set_title(f"elu's Derived")
    plt.show()
    
if __name__ == '__main__':
    # show(torch.sigmoid)
    # show(torch.tanh)
    # show(torch.relu)
    # show(torch.celu, 0.001)
    softmax_show()

参数的初始化

在神经网络中,参数初始化(Parameter Initialization)指的是在训练开始之前设置网络权重(weights)和偏置(biases)的初始值。合适的初始化策略对于神经网络的训练过程至关重要。好的初始化方法能够加速收敛,提高模型的性能,避免一些常见的问题,如梯度消失或梯度爆炸。

参数初始化的作用

  1. 加速收敛
    • 一个好的初始化策略能帮助模型更快地收敛。合适的初始化会避免在训练初期陷入困境,使得梯度在反向传播时不会因为初始值太小或太大而导致学习困难。
  2. 避免梯度消失和梯度爆炸
    • 如果初始化过小或过大,可能导致梯度在反向传播时变得非常小(梯度消失)或非常大(梯度爆炸),从而影响训练的稳定性。
    • 例如,深度网络中的梯度消失问题会导致模型训练速度极慢,甚至无法更新参数;而梯度爆炸则可能导致训练过程中权重更新过快,导致权重的值极大,进而造成不稳定的训练。
  3. 确保每个神经元有不同的学习路径
    • 如果所有神经元的初始权重相同,那么每个神经元将执行相同的操作,导致它们在训练过程中学习到相同的特征,这会大大降低模型的表现。
    • 通过合理的初始化方法,确保每个神经元从不同的初始值开始学习,使得它们能学习到不同的特征,提高模型的多样性和表现。
  4. 避免对称性破坏
    • 如果所有权重被初始化为相同的值,所有神经元的输出也将相同,导致网络在训练过程中无法破除对称性,使得每个神经元的更新是一样的,无法发挥出网络的深度特性。合理初始化权重能够避免这一问题。
基本初始化
示例
import torch
import torch.nn as nn


# 1.均匀分布初始化
def test01():
    linear = nn.Linear(5, 3)

    # 从 0-1的均匀分布产生参数
    nn.init.uniform_(linear.weight)
    print(linear.weight.data)


# 2.固定初始化
def test02():
    linear = nn.Linear(5, 3)
    nn.init.constant_(linear.weight, 5)
    print(linear.weight.data)


# 3. 全0初始化
def test03():
    linear = nn.Linear(5, 3)
    nn.init.zeros_(linear.weight)
    print(linear.weight.data)


# 4. 全1初始化
def test04():
    linear = nn.Linear(5, 3)
    nn.init.ones_(linear.weight)
    print(linear.weight.data)


# 5.正态分布随机初始化
def test05():
    linear = nn.Linear(5, 3)

    nn.init.normal_(linear.weight, mean=0.0, std=1.0)
    print(linear.weight.data)
常用初始化
  • kaiming 初始化,也叫做 HE 初始化
    1.正态化的he初始化
    stddev = sqrt(2 / fan_in)
    2.均匀分布的he初始化
    它从 [-limit,limit] 中的均匀分布中抽取样本, limit是 sqrt(6 / fan_in)

    fan_in 输入神经元的个数

  • xavier 初始化,也叫做 Glorot初始化
    1.正态化的Xavier初始化
    stddev = sqrt(2 / (fan_in + fan_out))
    2.均匀分布的Xavier初始化
    从[-limit,limit] 中的均匀分布中抽取样本, limit 是 sqrt(6 / (fan_in + fan_out))

    fan_in 是输入神经元的个数, fan_out 是输出的神经元个数

代码:
# 6.kaiming初始化
def test06():
    linear = nn.Linear(5, 3)
    nn.init.kaiming_normal_(linear.weight)
    print(f'kaiming标准正态初始化:{linear.weight.data}')

    nn.init.uniform_(linear.weight)
    print(f'kaiming均匀分布初始化:{linear.weight.data}')

# 7.xavier初始化
def test07():
    linear = nn.Linear(5, 3)
    nn.init.xavier_normal_(linear.weight)
    print(f'xavier标准正态初始化:{linear.weight.data}')
    nn.init.xavier_uniform_(linear.weight)
    print(f'xavier均匀分布初始化:{linear.weight.data}')

神经网络的搭建

在PyTorch中定义深度神经网络其实就是层堆叠的过程

1.自定义类,继承自nn.Module
2.实现两个方法:
    __init__方法:定义网络中的层结构,主要是全连接层,并进行初始化  
    	- 作用:[定义网络层]
    forward方法:在实例化模型的时候,底层会自动调用该函数。该函数中可以定义学习率,为初始化定义的layer传入数据等。 
    	- 作用:[串联网络层]

示例:搭建如图所示的神经网络

在这里插入图片描述

编码设计如下:

1.第1个隐藏层:权重初始化采用标准化的xavier初始化 激活函数使用sigmoid
2.第2个隐藏层:权重初始化采用标准化的He初始化 激活函数采用relu
3.out输出层线性层:假若二分类,采用softmax做数据归一化
思路说明:

在这里插入图片描述

代码实现:
import torch
import torch.nn as nn
from torchsummary import summary  # 计算参数模型

# 1.创建神经网络模块
# 1.1 一个继承
class Model(nn.Module):
    # 1.2 两个方法 __init__ forward
    def __init__(self):
        super(Model, self).__init__()  # 调用父类的初始化属性方法
        # 创建第一个隐藏层
        self.linear1 = nn.Linear(3, 3)
        nn.init.xavier_normal_(self.linear1.weight)

        # 创建第二个隐藏层
        self.linear2 = nn.Linear(3, 2)
        # kaiming初始化
        nn.init.kaiming_normal_(self.linear2.weight)
        
        # 创建输出层模型
        self.out = nn.Linear(2, 2)

    def forward(self, x):
        # 数据经过第一个线性层
        x = self.linear1(x)
        # 使用sigmoid激活
        x = torch.sigmoid(x)

        # 数据经过第二个线性层
        x = self.linear2(x)
        # 使用relu激活
        x = torch.relu(x)

        # 数据经过输出层
        x = self.out(x)
        # 使用softmax激活
        # dim = -1: 每一个维度的行数据 相加为1
        x = torch.softmax(x, dim=-1)
        return x
使用网络
model = Model()

# 随机产生一组数据
data = torch.randn(5, 3)
print(f'data.shape->{data.shape}')

# 前向传播
output = model(data)
print(f'output.shape->:{output.shape}')

# 计算模型参数
summary(model, input_size=(3,), batch_size=5)

# 查看模型参数
print('=' * 20 + '查看模型参数' + '=' * 20)
for name, parameter in model.named_parameters():
    print(name, parameter)

神经网络总结

1.优点
  • 精度高,性能优于其他的机器学习算法,甚至在某些领域超过了人类

  • 可以近似任意的非线性函数

  • 近年来在学界和业界受到了热捧,有大量的框架和库可供调

2.缺点
  • 黑箱,很难解释模型是怎么工作的

  • 训练时间长,需要大量的计算资源

  • 网络结构复杂,需要调整超参数

  • 部分数据集上表现不佳,容易发生过拟合

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

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

相关文章

五、web自动化测试01

目录 一、HTML基础1、HTML介绍2、常用标签3、基础案例3.1 前端代码3.2 自动化测试 二、CSS定位1、css介绍2、案例3、代码优化 三、表单自动化1、案例2、元素属性定位 四、后台基础数据自动化1、登录1.1 id与class定位1.2 定位一组元素 2、商品新增 一、HTML基础 可参考学习 链…

数据库监控 | MongoDB监控全解析

PART 01 MongoDB&#xff1a;灵活、可扩展的文档数据库 MongoDB作为一款开源的NoSQL数据库&#xff0c;凭借其灵活的数据模型&#xff08;基于BSON的文档存储&#xff09;、水平扩展能力&#xff08;分片集群&#xff09;和高可用性&#xff08;副本集架构&#xff09;&#x…

STM32F407使用ESP8266实现阿里云OTA(中)

文章目录 前言一、程序分析二、程序讲解1. main函数2. Get_Version()函数3. esp_Init()函数4. Check_Updata()函数结语前言 从上一章STM32F407使用ESP8266实现阿里云OTA(上)中我们已经对连接阿里云和从阿里云获取升级包的流程非常的熟悉了。所以本章我们进行STM32的程序开发…

微信小程序 tabbar底部导航栏

官方文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html#tabBar 一、常规菜单格式 在app.json 文件中配置&#xff0c;其他关键点详见官方文档&#xff0c;后续更新不规则图标的写法

Unity InputSystem触摸屏问题

最近把Unity打包后的windows软件放到windows触摸屏一体机上测试&#xff0c;发现部分屏幕触摸点击不了按钮&#xff0c;测试了其他应用程序都正常。 这个一体机是这样的&#xff0c;一个电脑机箱&#xff0c;外接一个可以触摸的显示屏&#xff0c;然后UGUI的按钮就间歇性点不了…

Linux Awk 深度解析:10个生产级自动化与云原生场景

看图猜诗&#xff0c;你有任何想法都可以在评论区留言哦~ 摘要 Awk 作为 Linux 文本处理三剑客中的“数据工程师”&#xff0c;凭借字段分割、模式匹配和数学运算三位一体的能力&#xff0c;成为处理结构化文本&#xff08;日志、CSV、配置文件&#xff09;的终极工具。本文聚…

免费版还是专业版?Dynadot 域名邮箱服务选择指南

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

旋转磁体产生的场-对导航姿态的影响

pitch、yaw、roll是描述物体在空间中旋转的术语&#xff0c;通常用于计算机图形学或航空航天领域中。这些术语描述了物体绕不同轴旋转的方式&#xff1a; Pitch&#xff08;俯仰&#xff09;&#xff1a;绕横轴旋转&#xff0c;使物体向前或向后倾斜。俯仰角度通常用来描述物体…

Day11(回溯法)——LeetCode79.单词搜索

1 前言 今天主要刷了一道热题榜中回溯法的题&#xff0c;现在的计划是先刷热题榜专题吧&#xff0c;感觉还是这样见效比较快。因此本文主要介绍LeetCode79。 2 LeetCode79.单词搜索(LeetCode79) OK题目描述及相关示例如下&#xff1a; 2.1 题目分析解决及优化 感觉回溯的方…

PostgreSQL 分区表——范围分区SQL实践

PostgreSQL 分区表——范围分区SQL实践 1、环境准备1-1、新增原始表1-2、执行脚本新增2400w行1-3、创建pg分区表-分区键为创建时间1-4、创建24年所有分区1-5、设置默认分区&#xff08;兜底用&#xff09;1-6、迁移数据1-7、创建分区表索引 2、SQL增删改查测试2-1、查询速度对比…

SpringCloud 微服务复习笔记

文章目录 微服务概述单体架构微服务架构 微服务拆分微服务拆分原则拆分实战第一步&#xff1a;创建一个新工程第二步&#xff1a;创建对应模块第三步&#xff1a;引入依赖第四步&#xff1a;被配置文件拷贝过来第五步&#xff1a;把对应的东西全部拷过来第六步&#xff1a;创建…

【Python爬虫基础篇】--4.Selenium入门详细教程

先解释&#xff1a;Selenium&#xff1a;n.硒&#xff1b;硒元素 目录 1.Selenium--简介 2.Selenium--原理 3.Selenium--环境搭建 4.Selenium--简单案例 5.Selenium--定位方式 6.Selenium--常用方法 6.1.控制操作 6.2.鼠标操作 6.3.键盘操作 6.4.获取断言信息 6.5.…

Langchain检索YouTube字幕

创建一个简单搜索引擎&#xff0c;将用户原始问题传递该搜索系统 本文重点&#xff1a;获取保存文档——保存向量数据库——加载向量数据库 专注于youtube的字幕&#xff0c;利用youtube的公开接口&#xff0c;获取元数据 pip install youtube-transscript-api pytube 初始化 …

【Linux网络】应用层自定义协议与序列化及Socket模拟封装

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

客户案例:西范优选通过日事清实现流程与项目管理的优化

近几年来&#xff0c;新零售行业返璞归真&#xff0c;从线上销售重返线下发展&#xff0c;满足消费者更加多元化的需求&#xff0c;国内家居集合店如井喷式崛起。为在激烈的市场竞争中立于不败之地&#xff0c;西范优选专注于加强管理能力、优化协作效率的“内功修炼”&#xf…

LabVIEW实现Voronoi图绘制功能

该 LabVIEW 虚拟仪器&#xff08;VI&#xff09;借助 MathScript 节点&#xff0c;实现基于手机信号塔位置计算 Voronoi 图的功能。通过操作演示&#xff0c;能直观展示 Voronoi 图在空间划分上的应用。 各部分功能详细说明 随机地形创建部分 功能&#xff1a;根据 “Maximum a…

爬虫学习——获取动态网页信息

对于静态网页可以直接研究html网页代码实现内容获取&#xff0c;对于动态网页绝大多数都是页面内容是通过JavaScript脚本动态生成(也就是json数据格式)&#xff0c;而不是静态的&#xff0c;故需要使用一些新方法对其进行内容获取。凡是通过静态方法获取不到的内容&#xff0c;…

创新项目实训开发日志4

一、开发简介 核心工作内容&#xff1a;logo实现、注册实现、登录实现、上传gitee 工作时间&#xff1a;第十周 二、logo实现 1.设计logo 2.添加logo const logoUrl new URL(/assets/images/logo.png, import.meta.url).href <div class"aside-first">…

常见接口测试常见面试题(JMeter)

JMeter 是 Apache 提供的开源性能测试工具&#xff0c;主要用于对 Web 应用、REST API、数据库、FTP 等进行性能、负载和功能测试。​它支持多种协议&#xff0c;如 HTTP、HTTPS、JDBC、SOAP、FTP 等。 在一个线程组中&#xff0c;JMeter 的执行顺序通常为&#xff1a;配置元件…

计算机组成与体系结构:缓存(Cache)

目录 为什么需要 Cache&#xff1f; &#x1f9f1; Cache 的分层设计 &#x1f539; Level 1 Cache&#xff08;L1 Cache&#xff09;一级缓存 &#x1f539; Level 2 Cache&#xff08;L2 Cache&#xff09;二级缓存 &#x1f539; Level 3 Cache&#xff08;L3 Cache&am…