神经网络基础-从零开始搭建一个神经网络
一、什么是神经网络
人工神经网络(Articial Neural Network,简写为ANN)也称为神经网络(NN),是一种模仿生物神经网络和功能的计算模型,人脑可以看做是一个生物神经网络,由众多的神经元连接而成,各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。人工神经网络也是类似,通过模仿人脑的“学习机器”,通过不断“看”数据(比如图片,数字),自己总结规律,最终学会预测(比如分类图片)
1.1、如何构建人工神经网络中的神经元
神经元=输入X权重+偏置->激活函数
权重:调节每个输入的重要性(类似音量旋钮)
偏置:调整输出的基准线(比如天生爱吃甜食)
激活函数:决定是否触发输出(比如及格线60分)
权重和偏置怎么来的?
一开始随机初始化,训练时通过数据自动调整到最优值
1.1、神经网络
使用多个神经元来构建神经网络,相邻之间的神经元相互连接,并给每一个连接分配一个强度,如下图:
神经网络中信息只向一个方向移动,即从输入节点向前移动,通过隐藏节点,再向输出节点移动,神经元的三层结构:
输入层:
- 像眼睛一样接受数据,比如输入一张3个数字的表格(比如身高,体重,年龄)
- 代码层面对应的是:my_data = torch.randn(5,3)生成一个5行3列的随机数据(5个人,每人3个特征)
隐藏层
- 像大脑一样处理数据,图中有两层“脑细胞”(Hidder Layer1和Hidden Layer2)
输出层:
- 像“嘴巴”一样给出答案,比如输出两个结果,y1,y2
1.2、神经网络的特点:
- 同一层的神经元之间没有连接。
- 第N层的每个神经元和第N-1层的所有神经元相连(full conneted的含义),这就是全连接神经网络
- 第N-1层神经元的输出就是第N层神经元的输入
- 每个连接都有一个权重值(w系数和b系数)
深度学习与机器学习的关系
深度学习是机器学习的一个分支,深度学习用多层神经网络(尤其是深层的网络)来学习数据,自动从数据中提取复杂特征,不用人工设计规则。
二、激活函数
激活函数用于对每层的输出数据进行变换,进而为整个网络注入非线性因素,此时,神经网络就可以拟合各种曲线,没有引入非线性因素的网络等价于使用一个线性模型来拟合
通过给网格输出增加激活函数,实现引入非线性因素,使得网络模型可以逼近任意函数,提升网络对复杂问题的拟合能力
2.1、常见的激活函数
1、sigmoid激活函数
- 可以将任意的输入映射到(0,1)之间,当输入的值大致在<-6或者>6时,意味着输入任何值得到的激活值都是差不多的,这样会丢失部分信息
- 对于sigmoid函数而言,输入值在[-6,6]之间输出值才有明显差异,输入值在[3,-3]之间才会有比较好的效果
- sigmoid网络在5层之内就会产生梯度消失现象,该激活函数并不是以0为中心的,在实践中这种激活函数使用的很少,一般只用于二分类的输出层
2、tanh激活函数
- Tanh 函数将输入映射到 (-1, 1) 之间,图像以 0 为中心,在 0 点对称,当输入 大概<-3 或者>3 时将被映射为 -1 或者 1。其导数值范围 (0, 1),当输入的值大概 <-3 或者 > 3 时,其导数近似 0
- 与 Sigmoid 相比,它是以 0 为中心的,且梯度相对于sigmoid大,使得其收敛速度要比Sigmoid 快,减少迭代次数。然而,从图中可以看出,Tanh 两侧的导数也为 0,同样会造成梯度消失
- 若使用时可在隐藏层使用tanh函数,在输出层使用sigmoid函数
3、softMax激活函数
softMax用于多分类过程中,是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展示出来,将网络输出的logits通过softMax函数,映射成为(0,1)的值,这些值的累加和为1,选取概率最大的节点,作为我们的预测目标类别
4、ReLU激活函数
ReLU 激活函数将小于 0 的值映射为 0,而大于 0 的值则保持不变,它更加重视正信号,而忽略负信号,这种激活函数运算更为简单,能够提高模型的训练效率。
当x<0时,ReLU导数为0,而当x>0时,则不存在饱和问题。所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。然而,随着训练的推进,部分输入会落入小于0区域,导致对应权重无法更新。这种现象被称为“神经元死亡”。
ReLU是目前最常用的激活函数。与sigmoid相比,RELU的优势是:
采用sigmoid函数,计算量大(指数运算),反向传播求误差梯度时,计算量相对大,而采用
Relu激活函数,整个过程的计算量节省很多。 sigmoid函数反向传播时,很容易就会出现梯度
消失的情况,从而无法完成深层网络的训练。 Relu会使一部分神经元的输出为0,这样就造成了
网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生
2.2、激活函数的选择方法
对于隐藏层:
- 优先选择ReLU激活函数
- 如果ReLu效果,可以尝试选择其他激活,如Leakly ReLu等
- 如果你使用了ReLU, 需要注意一下Dead ReLU问题, 避免出现大的梯度从而导致过多的神经元死亡。
- 少用使用sigmoid激活函数,可以尝试使用tanh激活函数
对于输出层:
- 二分类问题选择sigmoid激活函数
- 多分类问题选择softmax激活函数
- 回归问题选择identity激活函数
2.3、参数初始化
- 均匀分布初始化
权重参数初始化从区间均匀随机取值。即在(-1/√d,1/√d)均匀分布中生成当前神经元的权重,其中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 = sqrt(2 / (fan_in + fan_out))
均匀分布的Xavier初始化
[-limit,limit] 中的均匀分布中抽取样本, limit 是 sqrt(6 / (fan_in + fan_out))
fan_in是输入神经元的个数,fan_out是输出的神经元个数
初始化代码:
import torch
import torch.nn.functional as F
import torch.nn as nn#1. 均匀分布随机初始化
def test01():print(f"均匀分布随机初始化{'='*30}均匀分布随机初始化")linear = nn.Linear(5,3)nn.init.uniform_(linear.weight)print(linear.weight.data)# 2、固定初始化
def test02():print(f"固定初始化{'='*30}固定初始化")linear = nn.Linear(5,3)nn.init.constant_(linear.weight,5)print(linear.weight.data)#3、全0初始化
def test03():print(f"全0初始化{'='*30}全0初始化")linear = nn.Linear(5,3)nn.init.zeros_(linear.weight)print(linear.weight.data)def test04():print(f"全1初始化{'='*30}全1初始化")linear = nn.Linear(5,3)nn.init.ones_(linear.weight)print(linear.weight.data)
#适合从正态分布 N(mean,std^2) 采样权重。
#需手动调整方差,适合浅层网络或特定分布假设
def test05():print(f"正态分布随机初始化{'='*30}正态分布随机初始化")linear = nn.Linear(5,3)# mean:均值,默认0#std 标准差,默认1nn.init.normal_(linear.weight,mean=0,std=1)print(linear.weight.data)#6、kaiming 初始化
#针对ReLU族激活函数设计,根据输入/输出维度调整方差
#适合深层网络(如CNN)、ReLU/Leaky ReLU激活函数
def test06():print(f"kaiming正态分布初始化{'='*30}kaiming正态分布初始化")#kaiming正态分布初始化linear = nn.Linear(5,3)nn.init.kaiming_normal_(linear.weight)print(linear.weight.data)print(f"kaiming均匀分布初始化{'='*30}kaiming均匀分布初始化")#kaiming均匀分布初始化linear = nn.Linear(5,3)#nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')#mode:fan_in(前向传播,默认)或 fan_out(反向传播)#nonlinearity:激活函数类型(如 relu, leaky_relu)nn.init.kaiming_normal_(linear.weight)print(linear.weight.data)#kaiming均匀分布初始化linear = nn.Linear(5,3)nn.init.kaiming_uniform_(linear.weight)print(linear.weight.data)#7xavier初始化
#正态分布:nn.init.xavier_normal_(tensor, gain=1.0)
#均匀分布:nn.init.xavier_uniform_(tensor, gain=1.0)
#保持输入输出方差一致,适用于对称激活函数(如tanh、sigmoid)
#gain:根据激活函数调整的缩放因子(如tanh的gain=5/3)
def test07():print(f"xavier正态分布初始化{'='*30}xavier正态分布初始化")#xavier正态分布初始化linear = nn.Linear(5,3)nn.init.xavier_uniform_(linear.weight)print(linear.weight.data)print(f"xavier均匀分布初始化{'='*30}xavier均匀分布初始化")liner = nn.Linear(5,3)nn.init.xavier_uniform_(linear.weight)print(linear.weight.data)if __name__ =="__main__":test01()test02()test03()test04()test05()test06()test07()
输出结果:
均匀分布随机初始化==============================均匀分布随机初始化
tensor([[0.6716, 0.1197, 0.7008, 0.0801, 0.8953],[0.0483, 0.4593, 0.5607, 0.2824, 0.1307],[0.5942, 0.7758, 0.1852, 0.8597, 0.5166]])
固定初始化==============================固定初始化
tensor([[5., 5., 5.,
相关文章:

神经网络基础-从零开始搭建一个神经网络
一、什么是神经网络 人工神经网络(Articial Neural Network,简写为ANN)也称为神经网络(NN),是一种模仿生物神经网络和功能的计算模型,人脑可以看做是一个生物神经网络,由众多的神经元连接而成,各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通…...
【Go】优化文件下载处理:从多级复制到零拷贝流式处理
在开发音频处理服务过程中,我们面临一个常见需求:从网络下载音频文件并保存到本地。这个看似简单的操作,实际上有很多优化空间。本文将分享一个逐步优化的过程,展示如何从一个基础实现逐步改进到高效的流式下载方案。 初始实现&a…...
Java 显式锁与 Condition 的使用详解
Java 显式锁与 Condition 的使用详解 在多线程编程中,线程间的协作与同步是核心问题。Java 提供了多种机制来实现线程同步,除了传统的 synchronized 关键字外,ReentrantLock 和 Condition 是更灵活且功能强大的替代方案。本文将详细介绍显式…...
android ViewModel liveData无法监听之多线程下activityViewModels不安全
我们一般的,会遇到liveData无法监听到结果,可能存在主要2种可能: liveData没有正确注册;liveData连续多次设置值,中间的值,会被丢弃,但最后一次是能监听到的。 但是我们容易忽略一种case&…...

#Redis黑马点评#(五)Redisson原理详解
目录 一 基于Redis的分布式锁优化 二 Redisson 1 实现步骤 2 Redisson可重入锁机制 3 Redisson可重试机制 4 Redisson超时释放机制 5 RedissonMultiLock解决主从一致性 三 trylock与lock两者有何区别 四 Redis优化秒杀 一 基于Redis的分布式锁优化 二 Redisson Redis…...

23.(vue3.x+vite)引入组件并动态切换(component)
让多个组件使用同一个挂载点,并动态切换,这就是动态组件 效果截图 A组件代码: <template><div><div>{{message }}</</...

VBA会被Python代替吗
VBA不会完全被Python取代、但Python在自动化、数据分析与跨平台开发等方面的优势使其越来越受欢迎、两者将长期并存且各具优势。 Python以其易于学习的语法、强大的开源生态系统和跨平台支持,逐渐成为自动化和数据分析领域的主流工具。然而,VBA依旧在Exc…...
2025 年福建省职业院校技能大赛网络建设与运维赛项Linux赛题解析
准备环境:系统安装及网络配置 [!TIP] 接下来将完全按照国赛评分标准进行,过程中需要掌握基础的Linux命令以及理解Linux系统,建议大家在做题前将Linux基础命令熟练运用 网络建设与运维赛项详细教程请联系主页一、X86架构计算机操作系统安装…...

SEMI E40-0200 STANDARD FOR PROCESSING MANAGEMENT(加工管理标准)-(三)完结
10 消息服务详情 10.1 本章定义实现加工管理概念所需的消息服务。这些消息已在第8.1节中初步介绍。 协议无关性:这些服务独立于所使用的消息协议,可映射至SECS-II(SEMI E5)或其他类似协议。 10.1.1 消息服务定义内容包括&#…...

MySQL数据库创建、删除、修改
一:建库建表 我们以学校体系进行建表。将数据库命名为school。 以下代码中的大写均可小写不影响。如CREATE DATABASE与create database相同 四个关键的实体分别是学院、老师、学生和课程,其中,学生跟学院是从属关系,这个关系从…...
招行数字金融挑战赛数据赛道赛题一
赛题描述:根据提供的用户行为数据,选手需要分析用户行为特征与广告内容的匹配关系,准确预测用户对测试集广告的点击情况,通过AUC计算得分。 得分0.6120,排名60。 尝试了很多模型都没有能够提升效果,好奇大…...

【氮化镓】GaN在不同电子能量损失的SHI辐射下的损伤
该文的主要发现和结论如下: GaN的再结晶特性 :GaN在离子撞击区域具有较高的再结晶倾向,这导致其形成永久损伤的阈值较高。在所有研究的电子能量损失 regime 下,GaN都表现出这种倾向,但在电子能量损失增加时,其效率会降低,尤其是在材料发生解离并形成N₂气泡时。 能量损失…...
容器化-Docker-私有仓库Harbor
一、Harbor 的含义与作用 Harbor 是一个开源的企业级 Docker 镜像仓库,它为用户提供了安全、高效的 Docker 镜像管理方案。其核心功能是集中管理 Docker 中所有的镜像,涵盖了镜像的存储、分发、版本控制等全生命周期管理。通过使用 Harbor,企业和团队能够显著提升 Docker…...
【Leetcode 每日一题】1550. 存在连续三个奇数的数组
问题背景 给你一个整数数组 a r r arr arr,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回 t r u e true true;否则,返回 f a l s e false false。 数据约束 1 ≤ a r r . l e n g t h ≤ 10…...
C#中SetProperty方法使用
SetProperty 是 MVVM(Model-View-ViewModel) 模式中用于实现 属性变更通知(INotifyPropertyChanged) 的核心方法,主要用于在属性值变化时自动更新 UI 绑定。 1. SetProperty 的基本作用 更新字段值:修改属性…...

防火墙来回路径不一致导致的业务异常
案例拓扑: 拓扑描述: 服务器有2块网卡,内网网卡2.2.2.1/24 网关2.2.254 提供内网用户访问; 外网网卡1.1.1.1/24,外网网关1.1.1.254 80端口映射到公网 这个时候服务器有2条默认路由,分布是0.0.0.0 0.0.0.0 1…...

WTK6900C-48L:离线语音芯片重构玩具DNA,从“按键操控”到“声控陪伴”的交互跃迁
一:开发背景 随着消费升级和AI技术进步,传统玩具的机械式互动已难以满足市场需求。语音控制芯片的引入使玩具实现了从被动玩耍到智能交互的跨越式发展。通过集成高性价比的语音识别芯片,现代智能玩具不仅能精准响应儿童指令,还能实…...
[Java实战]Spring Boot 中Starter机制与自定义Starter实战(九)
[Java实战]Spring Boot 中Starter机制与自定义Starter实战(九) 引言 Spring Boot 的 Starter 是其“约定优于配置”理念的核心体现,通过简化依赖管理和自动配置,极大提升了开发效率。本文将深入剖析 Starter 的设计思想、实现原…...
电商双十一美妆数据分析
1. 数据读取与基础查看 库导入:使用 import numpy as np 和 import pandas as pd 导入常用数据分析库。数据读取: df pd.read_csv(双十一_淘宝美妆数据.csv) 读取数据文件。数据查看:通过 df.head() 查看数据前几行; df.info() 了…...

Python 数据分析与可视化:开启数据洞察之旅(5/10)
一、Python 数据分析与可视化简介 在当今数字化时代,数据就像一座蕴藏无限价值的宝藏,等待着我们去挖掘和探索。而 Python,作为数据科学领域的明星语言,凭借其丰富的库和强大的功能,成为了开启这座宝藏的关键钥匙&…...

gitkraken 使用教程
一、安装教程 安装6.5.3,之后是收费的,Windows版免安装 二、使用教程 0. 软件说明 gitkraken是一个git本地仓库管理软件,可以管理多个仓库,并且仓库可以属于多个网站多个账户。 1. 克隆仓库 选择要克隆到什么位置࿰…...
如何避免 JavaScript 中常见的闭包陷阱?
文章目录 1. 引言2. 什么是闭包?3. 常见的闭包陷阱及解决方案3.1 循环中的闭包陷阱3.2 内存泄漏3.3 意外的全局变量3.4 React 中的闭包陷阱 4. 总结 1. 引言 闭包(Closure)是 JavaScript 中一个强大而常用的特性,它允许函数访问其…...

【LeetCode 热题 100】二叉树 系列
📁 104. 二叉树的最大深度 深度就是树的高度,即只要左右子树其中有一个不为空,就继续往下递归,知道节点为空,向上返回。 int maxDepth(TreeNode* root) {if(root nullptr)return 0;return max(maxDepth(root->lef…...

用drawdb.app可视化创建mysql关系表
平时自己建表,没有可视化图形参考 为了便于理解,用drwadb画mysql关系表 drawDB | Online database diagram editor and SQL generator...

火绒互联网安全软件:自主引擎,精准防御
在数字时代,网络安全是每一个用户都必须重视的问题。无论是个人用户还是企业用户,都需要一款高效、可靠的反病毒软件来保护设备免受恶意软件的侵害。今天,我们要介绍的 火绒互联网安全软件,就是这样一款由资深工程师主导研发并拥有…...
Golang 应用的 CI/CD 与 K8S 自动化部署全流程指南
一、CI/CD 流程设计与工具选择 1. 技术栈选择 版本控制:Git(推荐 GitHub/GitLab)CI 工具:Jenkins/GitLab CI/GitHub Actions(本文以 GitHub Actions 为例)容器化:Docker Docker Compose制品库…...

【前端基础】8、CSS的选择器
一、什么是选择器? 根据一定的规则选出符合条件的HTML元素,从而为他们添加各种特定的样式。 二、选择器分类 通用选择器元素选择器类选择器id选择器属性选择器后代选择器兄弟选择器选择器组伪类 三、通用选择器(*) 作用&…...

Gitee Team:关键领域行业DevSecOps落地的项目管理引擎
在全球数字化转型浪潮下,关键领域行业的软件研发正面临前所未有的挑战与机遇。国产化进程的加速推进与国防装备的智能化转型,对软件研发效能和质量提出了更高要求。在这样的背景下,Gitee Team作为国内领先的研发协作平台,正在为关…...
【Redis】键值对数据库实现
目录 1、背景2、五种基本数据类型对应底层实现3、redis数据结构 1、背景 redis是一个(key-value)键值对数据库,其中value可以是五大基本数据类型:string、list、hash、set、zset,这五大基本数据类型对应着不同的底层结…...
什么是 NoSQL 数据库?它与关系型数据库 (RDBMS) 的主要区别是什么?
我们来详细分析一下 NoSQL 数据库与关系型数据库 (RDBMS) 的主要区别。 什么是 NoSQL 数据库? NoSQL (通常指 “Not Only SQL” 而不仅仅是 “No SQL”) 是一类数据库管理系统的总称。它们的设计目标是解决传统关系型数据库 (RDBMS) 在某些场景下的局限性…...