神经网络参数初始化

embedded/2024/9/23 7:19:58/

一、引入 

在深度学习和机器学习的世界中,神经网络是构建智能系统的重要基石,参数初始化是神经网络训练过程中的一个重要步骤。在构建神经网络时,我们需要为权重和偏置等参数赋予初始值。对于偏置,通常可以将其初始化为0或者较小的随机数。然而,对于权重w的初始化,我们通常会采用更加复杂的方法,以确保网络能够更好地学习数据的特征。

二、神经网络的结构

我们先给机器一个架构,如下图的两个隐藏层,还有这些神经元,还有给定激活函数,让机器去找w 的取值!就是找出一组参数使得输出效果好,这就是机器学习的意义。

d1496ff8e4084f938a6901ad8f05a19e.png

 常见的网络参数初始化方法:

  1. 均匀分布初始化:这种方法通过在特定区间内均匀随机地选择权重参数的初始值。通常,这个区间是(-1/√d, 1/√d),其中d是每个神经元的输入数量。这种初始化方式有助于打破神经元之间的对称性,促进网络的多样性和学习能力。
  2. 正态分布初始化:在这种初始化方法中,权重参数从均值为0,标准差为1的高斯分布中随机取样。这种方法可以确保权重参数有较小的初始值,有助于模型的稳定训练。
  3. 全零初始化:将所有权重和偏置参数初始化为零。虽然这种方法简单直接,但它可能导致所有神经元在学习过程中更新相同,从而引发梯度消失问题。
  4. 全一初始化:将所有权重和偏置参数初始化为一。与全零初始化类似,这种方法也可能导致对称性问题,因为所有神经元学到的东西会相同。
  5. 固定值初始化:使用某个固定的小数值来初始化所有的权重和偏置参数。
  6. Kaiming初始化(也称为He初始化):这是一种特别针对使用ReLU激活函数的神经网络设计的初始化方法。它根据前一层的神经元数量来设置权重的初始范围。
  7. Xavier初始化(也称为Glorot初始化):这种初始化方法根据前一层和后一层的神经元数量来计算权重的初始范围。这种方法旨在保持信号的方差不变,从而有效地初始化神经网络中的权重。

三、参数初始化代码

import torch
import torch.nn as nn
import torch.nn.init as init# 均匀分布初始化
def uniform_init(m):if isinstance(m, nn.Linear):init.uniform_(m.weight, -1/(m.in_features**0.5), 1/(m.in_features**0.5))if m.bias is not None:init.constant_(m.bias, 0)# 正态分布初始化
def normal_init(m):if isinstance(m, nn.Linear):init.normal_(m.weight, mean=0, std=1)if m.bias is not None:init.constant_(m.bias, 0)# 全零初始化
def zero_init(m):if isinstance(m, nn.Linear):init.constant_(m.weight, 0)if m.bias is not None:init.constant_(m.bias, 0)# 全一初始化
def one_init(m):if isinstance(m, nn.Linear):init.constant_(m.weight, 1)if m.bias is not None:init.constant_(m.bias, 0)# 固定值初始化
def fixed_value_init(m, value):if isinstance(m, nn.Linear):init.constant_(m.weight, value)if m.bias is not None:init.constant_(m.bias, 0)# Kaiming初始化(He初始化)
def kaiming_init(m):if isinstance(m, nn.Linear):init.kaiming_normal_(m.weight, mode='fan_in', nonlinearity='relu')if m.bias is not None:init.constant_(m.bias, 0)# Xavier初始化(Glorot初始化)
def xavier_init(m):if isinstance(m, nn.Linear):init.xavier_uniform_(m.weight)if m.bias is not None:init.constant_(m.bias, 0)

在PyTorch中,一般我们在构建网络模型时,每个网络层的参数都有默认的初始化方法,如果需要自定义参数的初始化,可以使用torch.nn.init模块中提供的各种初始化方法。例如,使用torch.nn.init.xavier_uniform_torch.nn.init.kaiming_normal_来实现Xavier和Kaiming初始化。 

         ↓ ↓ ↓ ↓ ↓ ↓ ↓ 

简化写法:

def func01():linear = nn.Linear(5, 3)  # 输入和输出维度# 均匀分布nn.init.uniform_(linear.weight)print(linear.weight.data)def func02():# 固定值赋值linear = nn.Linear(5, 3)nn.init.constant_(linear.weight, 5)print(linear.weight.data)

❄️torch.nn.init 是 PyTorch 中用于初始化神经网络(如线性层、卷积层等)权重和偏置的模块。这个模块提供了多种预定义的初始化方法,用户可以根据需要选择合适的方法来初始化网络参数。

❄️torch.nn是PyTorch中用于定义神经网络的模块,它包含了构建神经网络所需的各种层和损失函数。 

  1. 网络层torch.nn提供了多种类型的网络层,包括线性层(Linear)、卷积层(Conv2d)、池化层(MaxPool2d)、循环层(如RNN)等,这些层是构建神经网络的基本单元。
  2. 损失函数:为了训练网络,需要计算损失函数,torch.nn提供了多种损失函数,如交叉熵损失(CrossEntropyLoss)、均方误差损失(MSELoss)等。
  3. 激活函数:激活函数用于引入非线性,torch.nn包含了常见的激活函数,如ReLU、Sigmoid、Tanh等。
  4. 优化器接口:虽然优化器本身不直接包含在torch.nn模块中,但PyTorch提供了torch.optim模块,与torch.nn紧密集成,用于网络参数的优化。
  5. 容器类torch.nn还提供了一些容器类,如SequentialModuleList,它们帮助用户组织和管理网络中的各层。
  6. 功能性操作:除了网络层和损失函数,torch.nn还提供了一些功能性操作,如functional子模块中的函数,它们对张量进行逐元素操作,如relusoftmax等。

http://www.ppmy.cn/embedded/33506.html

相关文章

Vue的项目启动指令分析

通过Vue CLI脚手架创建的项目,默认的启动项目方式是 npm run serve 这里的serve是可以修改的。 在创建的项目目录中,找到package.json 双击打开,找到scripts部分 在scripts部分,有一个"serve"键值对,这里的…

Linux专栏09:Linux基本指令之时间日期指令及关机重启指令

博客主页:Duck Bro 博客主页系列专栏:Linux专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 文章题目 编号:09 文章目录 文章题目六、时间相关指令1…

通义灵码实战系列:一个新项目如何快速启动,如何维护遗留系统代码库?

作者:别象 进入 2024 年,AI 热度持续上升,翻阅科技区的文章,AI 可谓是军书十二卷,卷卷有爷名。而麦肯锡最近的研究报告显示,软件工程是 AI 影响最大的领域之一,AI 已经成为了软件工程的必选项&…

探索AI工具的巅峰:个人体验与深度剖析

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

第11章 软件工程

这里写目录标题 1.软件过程1.1能力成熟度模型(CMM)1.2能力成熟度模型集成(CMMI)1.3瀑布模型(线性顺序)1.4增量模型1.5演化模型1.5.1原型模型1.5.2螺旋模型 1.6喷泉模型1.7统一过程(UP)模型 2.敏捷方法3.系统设计4.系统测试4.1单元测试(模块测试)4.2集成测试4.3黑盒测试(功能测试…

用LangChain打造一个可以管理日程的智能助手

众所周知,GPT可以认为是一个离线的软件的,对于一些实时性有要求的功能是完全不行,比如实时信息检索,再比如我们今天要实现个一个日程管理的功能,这个功能你纯依赖于ChatGPT或者其他大语言模型(后文简称llm&…

软考网络工程师 第六章 第三部分 第一节 TCP/UDP报文格式

传输层TCP vs UDP TCP报文格式 TCP伪首部 TCP伪首部本质是IP头的一部分,包含源目IP地址,协议号、TCP报头和用户数据,主要用于TCP校验和计算 UDP报文格式 与TCP相比,做了很大精简,省略诸多控制字段 例题: …

详解SDRAM基本原理以及FPGA实现读写控制(一)

文章目录 一、SDRAM简介二、SDRAM存取结构以及原理2.1 BANK以及存储单元结构2.2 功能框图2.3 SDRAM速度等级以及容量计算 三、SDRAM操作命令3.1 禁止命令: 4b1xxx3.2 空操作命令:4b01113.3 激活命令:4b00113.4 读命令:4b01013.5 写…