深度学习--神经网络基础

神经网络

人工神经网络( Artificial Neural Network , 简写为 ANN )也简称为神经网络( NN ),是一种模仿生物神经网络结构和 功能的计算模型 。人脑可以看做是一个生物神经网络,由众多的 神经元 连接而成。各个神经元传递复杂的电信号,树突 接收到输入信号 ,然后对信号进行处理,通过轴突 输出信号。下图是生物神经元示意图:那怎么构建人工神经网络中的神经元呢?

 那怎么构建人工神经网络中的神经元呢? 

这个过程就像,来源不同树突 ( 树突都会有不同的权重 ) 的信息 , 进行的加权计算 , 输入到细胞中做加和,再通过激活函数输出细胞值。
接下来,我们使用多个神经元来构建神经网络,相邻层之间的神经元相互连接,并给每一个连接分配一个强度,如下图 所示:

神经网络中信息只向一个方向移动,即从输入节点向前移动,通过隐藏节点,再向输出节点移动。其中的基本部分是 :
1. 输入层 : 即输入 x 的那一层
2. 输出层 : 即输出 y 的那一层
3. 隐藏层 : 输入层和输出层之间都是隐藏层
特点是:
同一层的神经元之间没有连接。
N 层的每个神经元和第 N-1 层 的所有神经元相连(这就是 full connected 的含义 ) ,这就是全连接神经网络。
N-1 层神经元的输出就是第 N 层神经元的输入。
每个连接都有一个权重值( w 系数和 b 系数)。

激活函数

激活函数 用于对每层的 输出数据进行变换 , 进而为整个网络注入了 非线性因素 。此时, 神经网络就
可以拟合各种曲线。
1. 没有引入非线性因素的网络等价于使用一个线性模型来拟合
2. 通过给网络输出增加激活函数, 实现引入非线性因素, 使得网络模型可以逼近任意函数, 提升网
络对复杂问题的拟合能力.
如果不使用激活函数,整个网络虽然看起来复杂,其本质还相当于一种 线性模型

1.sigmoid激活函数

sigmoid 函数可以将 任意的输入 映射到 (0, 1) 之间,当输入的值大致在 <-6 或者 >6 时,意味着输入任何值得到的激 活值都是差不多的,这样会丢失部分的信息。比如:输入 100 和输出 10000 经过 sigmoid 的激活值几乎都是等于 1 的,但是输入的数据之间相差 100 倍的信息就丢失了。
对于 sigmoid 函数而言,输入值在 [-6, 6] 之间输出值才会 有明显差异 ,输入值在 [-3, 3] 之间才会 有比较好的效果
通过上述导数图像,我们发现导数数值范围是 (0, 0.25) ,当输入 <-6 或者 >6 时, sigmoid 激活函数图像的 导数接近 0 ,此时 网络参数将更新极其缓慢,或者无法更新。
一般来说, sigmoid 网络在 5 层之内 就会产生 梯度消失 现象。而且,该激活函数并不是以 0 为中心的,所以在实践 中这种激活函数使用的很少。sigmoid 函数一般只用于二分类的输出层

tanh激活函数

Tanh 函数将输入映射到 (-1, 1) 之间 ,图像以 0 为中心,在 0 点对称,当输入 大概<-3 或者
>3 时将被映射为 -1 或者 1。 其导数值范围 (0, 1) ,当输入的值大概 <-3 或者 > 3 时,其导数
近似 0。
与 Sigmoid 相比,它是以 0 为中心的 ,且梯度相对于sigmoid大,使得其收敛速度要比
Sigmoid 快,减少迭代次数。然而,从图中可以看出,Tanh 两侧的导数也为 0,同样会造成
梯度消失。
若使用时可在隐藏层使用tanh函数 ,在 输出层使用sigmoid函数

3.relu激活函数

ReLU 激活函数将小于 0 的值映射为 0,而大于 0 的值则保持不变,它更加重视正信号,而忽
略负信号,这种激活函数运算更为简单,能够提高模型的训练效率。
当x<0时,ReLU导数为0,而当x>0时,则不存在饱和问题。所以,ReLU 能够在x>0时保持梯
度不衰减,从而缓解梯度消失问题。然而,随着训练的推进,部分输入会落入小于0区域,导
致对应权重无法更新。这种现象被称为“神经元死亡” 。
ReLU是目前最常用的激活函数。与sigmoid相比,RELU的优势是:
采用sigmoid函数,计算量大(指数运算),反向传播求误差梯度时,计算量相对大,而采用
Relu激活函数,整个过程的计算量节省很多。 sigmoid函数反向传播时,很容易就会出现梯度
消失的情况,从而无法完成深层网络的训练。 Relu会使一部分神经元的输出为0,这样就造成了
网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

4.SoftMax激活函数

softmax 用于 多分类 过程中,它是二分类函数 sigmoid 在多分类上的推广,目的是 将多分类的结果以概率的形式展现出来
。计算方法如下图所示:

Softmax 就是将网络输出的 logits 通过 softmax 函数,就映射成为(0,1)的值,而 这些值的累和
为1 (满足概率的性质),那么我们将它理解成概率, 选取概率最大(也就是值对应最大的)节
,作为我们的 预测目标类别

其他常见的损失函数

激活函数选择的方法

对于 隐藏层 :
1. 优先选择ReLU激活函数
2. 如果ReLu效果不好,那么尝试其他激活,如Leaky ReLu等。
3. 如果你使用了ReLU, 需要注意一下Dead ReLU问题, 避免出现大的梯度从而导致过多的神经元死亡。
4. 少用使用sigmoid激活函数,可以尝试使用tanh激活函数
对于 输出层 :
1. 二分类问题选择sigmoid激活函数
2. 多分类问题选择softmax激活函数
3. 回归问题选择identity激活函数

 代码示例

import torch
import matplotlib.pyplot as plt

# 一. 函数原图像
# 函数图像
x = torch.linspace(-20,20,1000)
# 1. 输入值x通过sigmoid函数转换成激活值y
# y = torch.sigmoid(x)

# 2. 输入值x通过tanh函数转换成激活值y
# y = torch.tanh(x)

# 3. 输入值x通过relu函数转换成激活值y
y = torch.relu(x)

# 画图
# 创建画布和坐标轴
_,axes = plt.subplots(1,2)
axes[0].plot(x,y)
axes[0].grid()


# 二. 导数图像
x = torch.linspace(-20,20,1000,requires_grad=True)

# torch.sigmoid(x).sum().backward()
# torch.tanh(x).sum().backward()
torch.relu(x).sum().backward()

# x.detach()输入值x的数值    x.grad 计算梯度 求导
axes[1].plot(x.detach(),x.grad)
axes[1].grid()
plt.show()

参数初始化

均匀分布初始化


权重参数初始化从区间均匀随机取值。即在(-1//a,1/a)均匀分布中生成当前神经元的权重,其中d为每个神经元的输入数量


正态分布初始化


随机初始化从均值为0,标准差是1的高斯分布中取样,使用一些很小的值对参数W进行初始化

全0初始化


将神经网络中的所有权重参数初始化为 0

全1初始化.


将神经网络中的所有权重参数初始化为 1.


固定值初始化


将神经网络中的所有权重参数初始化为某个固定值

kaiming 初始化,也叫做 HE 初始化


HE 初始化分为正态分布的 HE 初始化、均匀分布的 HE 初始化
        -正态化的he初始化 
                stddev= sqrt(2 /fan_in)
        -均匀分布的he初始化
                它从 [-limit,limit] 中的均匀分布中抽取样本,limit是 sqrt(6/fan_in)
         fan in 输入神经元的个数

xavier 初始化,也叫做 Glorot初始化


该方法也有两种,一种是正态分布的 xavier 初始化、一种是均匀分布的 xavier 初始化
        -正态化的Xavier初始化
                stddev=sart(2 /(fan in + fan_out))
        -均匀分布的Xavier初始化
                [-limit, limit]中的均匀分布中抽取样本, limit 是 sqrt(6/(fan_in + fan_out))
         -fan_in 是输入神经元的个数,fan_out 是输出的神经元个数

代码示例

import torch
import torch.nn as nn

# 1. 模型结构
layer = nn.Linear(in_features=3,out_features=5)

# nn.init.uniform_(layer.weight)        # 1. 均匀分布
# nn.init.normal_(layer.weight)         # 2. 正态分布
# nn.init.constant_(layer.weight,5)     # 3. 固定初始化
# nn.init.zeros_(layer.weight)          # 4. 全0 (对bias初始化)(默认)
# nn.init.ones_(layer.weight)           # 5. 全1 (对bias初始化),其他对weight

# nn.init.kaiming_normal_(layer.weight)      # 6. 凯明(正态分布)
# nn.init.kaiming_uniform_(layer.weight)        # 凯明(均匀分布)

# nn.init.xavier_normal_(layer.weight)      # 7. xavier(正态分布)(默认)
nn.init.xavier_uniform_(layer.weight)          # xavier(均匀分布)

print(layer.weight.data)

神经网络搭建和参数计算

在pytorch中定义深度神经网络其实就是层堆叠的过程,继承自nn.Module,实现两个方法:
__init__方法中定义网络中的层结构,主要是全连接层,并进行初始化
 - forward方法,在实例化模型的时候,底层会自动调用该函数。该函数中可以定义学习率,
为初始化定义的layer传入数据等。

编码设计如下:
1.第1个隐藏层:权重初始化采用标准化的xavier初始化 激活函数使用sigmoid

2.第2个隐藏层:权重初始化采用标准化的He初始化激活函数采用relu3out输出层线性层 假若二分类,采用softmax做数据归一化

import torch
import torch.nn as nn
from torchsummary import summary

# 构建神经网络
# 1. 定义继承自nn.Module的模型类
class model(nn.Module):
    # 2. 在__init__方法中定义网络中的层结构
    def __init__(self):
        # 调用父类的初始化属性值
        super(model,self).__init__()
        # 创建第一个隐藏层模型, 3个输入特征,3个输出特征
        self.layer1 = nn.Linear(3,3)
        # 初始化权重
        nn.init.kaiming_normal_(self.layer1.weight)
        # 创建第二个隐藏层模型, 3个输入特征(上一层的输出特征),2个输出特征
        self.layer2 = nn.Linear(3,2)
        # 初始化权重
        nn.init.kaiming_normal_(self.linear2.weight)
        # 创建输出层模型
        self.out = nn.Linear(2,2)

    # 3. 在forward方法中定义数据传输方式
    def forward(self,x):
        # 数据经过第一个线性层
        h1 = self.layer1(x)
        # 使用relu激活函数
        h1 = torch.relu(h1)
        # 数据经过第二个线性层
        h2 = self.layer2(h1)
        # 使用relu激活函数
        h2 = torch.relu(h2)
        # 数据经过输出层
        out = self.out(h2)
        # 使用softmax激活函数
        out = torch.softmax(out,dim=-1)
        return out

if __name__ == '__main__':
    # 创建model对象
    net = model()
    # summary(net,input_size=(3,),batch_size=5)
    # 随机产生数据
    x = torch.randn(5,3)
    y = net(x)
    print(y.shape)
    # 查看模型参数
    for name,params in net.named_parameters():
        print(name)
        print(params)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国际黄金价格是什么?和黄金价格有何区别?

黄金是世界上最珍贵的贵金属之一&#xff0c;其价值被无数人所垂涎。而国际黄金价格作为市场上的参考指标&#xff0c;直接影响着黄金交易的买卖。那么国际黄金价格到底是什么&#xff0c;与黄金价格又有何区别呢&#xff1f;本文将为您详细解答。 国际黄金价格是指以美元计量的…

部署PhotoMaker通过堆叠 ID 嵌入自定义逼真的人物照片

PhotoMaker只需要一张人脸照片就可以生成不同风格的人物照片&#xff0c;可以快速出图&#xff0c;无需额外的LoRA培训。 安装环境 python 3.10gitVisual Studio 2022 安装依赖库 git clone https://github.com/bmaltais/PhotoMaker.git cd PhotoMaker python -m venv venv…

idea如何建立一个springboot项目

1.打开File -New-Project 2.填写相关信息&#xff0c;Name:### Type:Maven Croup、Artifact、java 版本 注&#xff1a;此时&#xff0c;第一次打开可能会报错&#xff0c;说版本不匹配。注意下方的两个红框&#xff0c;将Server URL的地址改为“https://start.aliyun.com ”…

C#理论 —— 基础语法、数据类型、变量、常量、运算符、三大结构

文章目录 1. 基础语法1.1 标识符命名规则1.2 C# 关键字1.3 C#注释 2. 数据类型2.1 值类型&#xff08;Value types&#xff09;2.2 引用类型&#xff08;Reference types&#xff09;2.2.1 对象&#xff08;Object&#xff09;类型3.2.2 动态&#xff08;Dynamic&#xff09;类…

Vue 环境安装以及项目创建

环境安装 nodejs 安装 下载地址&#xff1a;https://nodejs.org/dist/v18.16.1/ 根据系统类型选择对应安装包&#xff0c;选择安装路径那个后一直下一步即可安装完成。 配置npm 代理镜像,设置为淘宝的镜像地址&#xff08;后面按照依赖可以加速下载安装包&#xff09; npm c…

Java介绍

计算机语言历史 1、软件的分类 软件从架构上分类&#xff1a; C/S(Client/Server)&#xff1a;基于客户端和服务器 B/S(Browser/Server)&#xff1a;基于浏览器和服务器 如何区分&#xff1a;如果使用时要安装则为C/S架构的&#xff0c;如果使用时用浏览器打开则为B/S架构 由于…

RDMA技术在Apache Spark中的应用

背景介绍 在当今数据驱动的时代&#xff0c;Apache Spark已经成为了处理大规模数据集的首选框架。作为一个开源的分布式计算系统&#xff0c;Spark因其高效的大数据处理能力而在各行各业中广受欢迎。无论是金融服务、电信、零售、医疗保健还是物联网&#xff0c;Spark的应用几…

共同学习|Spring Cloud Alibaba一一sentinel介绍

Sentinel介绍 介绍 alibaba/Sentinel Wiki GitHub 1、Sentinel是什么 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征&a…

集合详解-迭代器遍历-增强for-List集合-List五种遍历方式-Set集合-排序规则Comparable-双列集合

Collection集合 数组和集合的区别 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类 Collection 集合概述和使用 Collection…

安全评估与安全评价:区分核心概念

在当今信息化社会中&#xff0c;保护数据和网络安全变得尤为重要。为了确保系统和组织的安全&#xff0c;我们需要了解并正确运用安全评估和安全评价这两个核心概念。虽然它们听起来相似&#xff0c;但其实它们有着不同的定义和目的。 首先&#xff0c;安全评估是一种系统性的…

【Github】如何在Github上找到zotero插件的下载位置

最近博主在使用zotero时需要从github上下载一个插件&#xff0c;通过链接跳转到Github对应的用户下&#xff0c;可是还是花了一些时间才找到插件的具体位置&#xff0c;这里将我的经历分享给大家。 1、跳转到Github对应的用户下。 博主需要下载zotero中的中文文献识别插件Jas…

Adobe Acrobat DC中如何合并pdf并生成目录

一、利用 Acrobat 合成pdf目录 &#xff08;一&#xff09;新建标签&#xff08;更改标签等级等&#xff09; 1&#xff0c;用Adobe acrobat 软件打开待添加书签的pdf文档。 2&#xff0c;打开之后点击软件左边栏的书签&#xff08;有时被隐藏了&#xff0c;点击一下界面左边…

通过elementUI学习vue

<template><el-radio v-model"radio" label"1">备选项</el-radio><el-radio v-model"radio" label"2">备选项</el-radio> </template><script>export default {data () {return {radio: 1}…

Phoncent博客:探索AI写作与编程的无限可能

Phoncent博客&#xff0c;一个名为Phoncent的创新AIGC博客网站&#xff0c;于2023年诞生。它的创始人是庄泽峰&#xff0c;一个自媒体人和个人站长&#xff0c;他在网络营销推广领域有着丰富的经验。庄泽峰深知人工智能技术在内容创作和编程领域的潜力和创造力&#xff0c;因此…

【全志D1-H 哪吒开发板】Debian系统安装调教和点灯指南

全志D1-H开发板【哪吒】使用Deabian系统入门 特别说明&#xff1a; 因为涉及到操作较多&#xff0c;博文可能会导致格式丢失 其中内容&#xff0c;会根据后续使用做优化调整 目录&#xff1a; 参考资料固件烧录启动调教点灯问题 〇、参考资料 官方资料 开发板-D1开发板【…

面试笔记系列六之redis+kafka+zookeeper基础知识点整理及常见面试题

Redis redis持久化机制&#xff1a;RDB和AOF Redis 持久化 Redis 提供了不同级别的持久化方式: RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储. AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redi…

如何在aws服务器上部署mysql

在AWS服务器上部署 MySQL 数据库可以通过以下步骤完成&#xff1a; 启动 EC2 实例&#xff1a; 在 AWS 控制台中启动一个 EC2 实例&#xff0c;选择适合你需求的实例类型和配置。 安全组配置&#xff1a; 确保你的 EC2 实例的安全组配置允许来自你的 IP 地址的 MySQL 连接。默…

iOS中卡顿产生的主要原因及优化思路

卡顿本质上是一个UI体验上的问题&#xff0c;而UI的渲染及显示&#xff0c;主要涉及CPU和GPU两个层面。若 CPUGPU渲染耗时超过16.7ms&#xff0c;就会在屏幕vsync信号到来时无法更新屏幕内容&#xff0c;进而导致卡顿。 iOS中UI渲染主要包含Layout->Draw->Prepare->Co…

动态住宅IP vs 静态住宅IP,如何选择适合你的海外住宅IP?

随着数字时代的发展&#xff0c;网络已经成为了我们日常生活中不可或缺的一部分。在海外留学、旅游、工作或者进行电子商务等活动时&#xff0c;一个合适的住宅IP可以帮助我们保护个人隐私、确保网络连接的稳定性、提高在线服务的可靠性等。因此&#xff0c;选择适合自己的住宅…

“集世界精华·展中国风采”2024北京智能科技展会(世亚智博会)

在科技的浪潮中&#xff0c;中国犹如一艘乘风破浪的巨轮&#xff0c;稳健地航行在广阔的海洋上。随着科技的飞速发展&#xff0c;中国正逐渐成为全球科技领域的一面旗帜&#xff0c;引领着世界科技潮流。在这个伟大的时代&#xff0c;中国以卓越的科技创新能力和前瞻的战略视野…