深度学习-神经网络基础-激活函数与参数初始化(weight, bias)

news2024/11/14 11:54:37

一. 神经网络介绍

神经网络概念

神经元构建

神经网络

人工神经网络是一种模仿生物神经网络结构和功能的计算模型, 由神经元构成

将神经元串联起来 -> 神经网络

输入层: 数据

输出层: 目标(加权和)

隐藏层: 加权和 + 激活

全连接

第N层的每个神经元和第N-1层的所有神经元相连(full connected的含义)

激活函数

激活函数作用: 向网络中添加非线性因素, 拟合更复杂场景, 曲线, 曲面等

激活函数用于对每层的输出数据进行变换, 进而为整个网络增加非线性因素, 所以神经网络就可以拟合各种网络, 提升网络对复杂问题的拟合能力

没有引入非线性因素的网络等价于使用一个线性模型来拟合

sigmoid

用于二分类

概念

将任意输入映射到(0, 1)区间, 但是当输入的值在< -6或者> 6时梯度消失, 输入值在[-6, 6]之间才会有效果, 在[-3, 3]之间才会有较好的效果

梯度小, 网络在5层之内会产生梯度消失现象, 函数图像并不是以0为中心, 导函数最大值为0.25

公式
代码演示
import torch
import matplotlib.pyplot as plt
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
​
​
# 绘制sigmoid函数和它的导数
# 创建画布
fig, ax = plt.subplots(1, 2)
x = torch.linspace(-20, 20, 1000)
y = torch.sigmoid(x)
ax[0].plot(x, y)
ax[0].grid()
ax[0].set_title('sigmoid')
​
x = torch.linspace(-20, 20, 1000, requires_grad=True)
torch.sigmoid(x).sum().backward()
# x.detach()    # x的数值
ax[1].plot(x.detach(), x.grad)
ax[1].grid()
ax[1].set_title('sigmoid"')
fig.show()

Tanh

可以但不是首选用于隐藏层, 当隐藏层要使用指数型激活函数时, 使用Tanh

概念

将输入映射到(-1, 1)之间, 图像以0为中心, 在0点对称, 当输入值在< -3或> 3时被映射到-1或者1.导数范围[0, 1], 当输入值在< -3或> 3时导数近似0

与sigmoid函数比, 以0为中心, 梯度较大, 收敛快, 减少迭代次数, 但是也会造成梯度消失

公式
代码演示
# 绘制Tanh函数和它的导数
fig, ax = plt.subplots(1, 2)
x = torch.linspace(-20, 20, 1000)
y = torch.tanh(x)
ax[0].plot(x, y)
ax[0].grid()
ax[0].set_title('tanh')
​
x = torch.linspace(-20, 20, 1000, requires_grad=True)
torch.tanh(x).sum().backward()
ax[1].plot(x.detach(), x.grad)
ax[1].grid()
ax[1].set_title('tanh"')
fig.show()

ReLU

使用最多

概念

将小于0的值映射为0(神经元死亡), 大于0的值保持不变(不会造成梯度衰减), 注重正信号, 忽略负信号, 运算简单提高模型训练效率, 随着训练的推进, 输入落入小于0区域, 导致对应权重无法更新, 造成神经元死亡, ReLU死区现象

与sigmoid相比的优势: 节省很多计算, sigmoid产生的梯度消失会导致无法完成深层网络的训练. ReLU会使得一部分神经元的输出为0, 导致神经元稀疏, 减少参数的相互依赖, 缓解过拟合问题的发生.

公式
代码演示
# 绘制ReLU函数和它的导数
fig, ax = plt.subplots(1, 2)
x = torch.linspace(-20, 20, 1000)
y = torch.relu(x)
ax[0].plot(x, y)
ax[0].grid()
ax[0].set_title('relu')
​
x = torch.linspace(-20, 20, 1000, requires_grad=True)
torch.relu(x).sum().backward()
ax[1].plot(x.detach(), x.grad)
ax[1].grid()
ax[1].set_title('relu"')
fig.show()

Soft MAX

多分类, sigmoid的推广, 将分类的结果以概率形式展现

概念

Soft MAX是将网络输出的logits通过softmax函数, 映射成(0, 1)的值, 这些值的累计和为1(满足概率性质), 可以将其理解为概率, 选取概率最大(输出的最大值), 作为预测目标类别

公式
代码演示
# softmax函数预测值
x = torch.tensor([0.23, 0.45, 0.67, 0.89, 0.12, 0.34, 0.56])
y_pred = torch.softmax(x, dim=0)
print(y_pred)

其他激活函数

隐藏层选择
  1. 优先选择ReLU激活函数

  2. 如果ReLU效果不好, 尝试其他激活函数, 如LeakyReLU等

  3. 若使用ReLU则需要注意ReLU死区问题

  4. 少用sigmoid, 可以尝试tanh

输出层选择
  1. 二分类问题选择sigmoid激活函数

  2. 多分类问题选择softmax激活函数

  3. 回归问题选择identity(恒等激活)激活函数

参数初始化

初始化weight和bias

均匀分布初始化

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

import torch.nn as nn
​
​
# 均匀分布初始化
def my_uniform():
    linear = nn.Linear(in_features=6, out_features=2)
    nn.init.uniform_(linear.weight)
    print('uniform', linear.weight.data)
    
>>>uniform tensor([[0.2326, 0.9061, 0.0694, 0.1362, 0.7270, 0.0389],
          [0.1841, 0.0189, 0.0503, 0.4331, 0.0769, 0.6846]])

固定初始化

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

# 固定初始化
def my_constant():
    linear = nn.Linear(6, 2)
    nn.init.constant_(linear.weight, 10)
    print('constant', linear.weight.data)
    
>>>constant tensor([[10., 10., 10., 10., 10., 10.],
        [10., 10., 10., 10., 10., 10.]])

全0初始化

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

# 全0初始化
def my_zeros():
    linear = nn.Linear(6, 2)
    nn.init.zeros_(linear.weight)
    print('zeros', linear.weight.data)
    
>>>zeros tensor([[0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.]])

全1初始化

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

# 全1初始化
def my_ones():
    linear = nn.Linear(6, 3)
    nn.init.ones_(linear.weight)
    print('ones', linear.weight.data)
    
>>>ones tensor([[1., 1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1., 1.]])

正太分布初始化

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

# 正太分布初始化
def my_normal():
    linear = nn.Linear(6, 3)
    nn.init.normal_(linear.weight, mean=0, std=1)
    print('normal', linear.weight.data)
    
>>>normal tensor([[ 0.4047,  0.7500,  0.9120,  0.6850, -1.9469,  1.1815],
        [ 0.7610, -0.3845, -2.1513,  2.4874,  2.2394,  3.8539],
        [-1.9032,  0.7158,  2.0793, -1.1346,  2.2609,  3.2927]])

★kaiming初始化

HE 初始化分为正态分布的 HE 初始化、均匀分布的 HE 初始化.

★正态化的he初始化

stddev = sqrt(2 / fan_in)

均匀分布的he初始化

从 [-limit,limit] 中的均匀分布中抽取样本, limit是sqrt(6 / fan_in), fan_in 输入神经元的个数

# 凯明初始化
def my_kaiming():
    linear1 = nn.Linear(6, 3)
    nn.init.kaiming_normal_(linear1.weight)
    print('kaiming_normal', linear1.weight.data)
​
    linear2 = nn.Linear(6, 3)
    nn.init.kaiming_uniform_(linear2.weight)
    print('kaiming_uniform', linear2.weight.data)
    
    
>>>kaiming_normal tensor([[-1.0790, -0.2549, -1.0042, -0.4537,  0.2316, -0.6732],
        [-0.4751,  0.7185,  0.5173,  0.3771,  0.6589,  0.8899],
        [ 0.0927, -0.4816, -0.6176, -0.2689, -0.2861, -1.0924]])
        
>>>kaiming_uniform tensor([[ 0.8689, -0.3152, -0.0065, -0.1623,  0.7836, -0.8876],
        [ 0.5449,  0.6405,  0.2201, -0.5927, -0.5317,  0.9914],
        [-0.4956,  0.1218,  0.5516,  0.4448,  0.5495, -0.6692]])
​

★Xavier初始化

该方法也有两种,一种是正态分布的 xavier 初始化、一种是均匀分布的 xavier 初始化.

★正态化的Xavier初始化

stddev = sqrt(2 / (fan_in + fan_out))

均匀分布的Xavier初始化

从[-limit,limit] 中的均匀分布中抽取样本, limit 是 sqrt(6 / (fan_in + fan_out))

# Xavier初始化
def my_xavier():
    linear1 = nn.Linear(6, 3)
    nn.init.xavier_normal_(linear1.weight)
    print('xavier_normal', linear1.weight.data)
​
    linear2 = nn.Linear(6, 3)
    nn.init.xavier_uniform_(linear2.weight)
    print('xavier_uniform', linear2.weight.data)
    
​
>>>xavier_normal tensor([[ 1.3166, -1.0188,  0.8923,  0.2222, -0.2327,  0.8967],
        [ 0.2300,  0.2561, -0.2898,  0.3206,  0.9131, -0.2498],
        [-0.7890, -0.0296,  0.0836,  0.2697,  0.6994,  0.4209]])
>>>xavier_uniform tensor([[ 0.1771,  0.7031, -0.7461, -0.6401, -0.4325, -0.0085],
        [-0.2334,  0.2687,  0.3438,  0.4502, -0.1237, -0.6410],
        [-0.5314, -0.0369, -0.3987, -0.2400, -0.7561, -0.7719]])
​

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

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

相关文章

SpringBoot框架在资产管理中的应用

3系统分析 3.1可行性分析 通过对本企业资产管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本企业资产管理系统采用Spring Boot框架&#xff0c;JAVA作…

【C#】选课程序增加、删除统计学时

文章目录 【例6-2】编写选课程序。利用利用列表框和组合框增加和删除相关课程&#xff0c;并统计学时数1. 表6-2 属性设置2. 设计窗体及页面3. 代码实现4. 运行效果 【例6-2】编写选课程序。利用利用列表框和组合框增加和删除相关课程&#xff0c;并统计学时数 分析&#xff1…

uniapp—android原生插件开发(1环境准备)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; 项目背景&#xff1a; UniApp集成新大陆P…

ProtoBuf实战之网络版通讯录

目录 网络版通讯录需求 实现网络版通讯录 搭建服务端客户端 协议约定 客户端菜单功能 服务端代码 Protobuf 还常用于 通讯协议、服务端数据交换 的场景&#xff0c;接下来&#xff0c;我们将实现一个网络版本的通讯录&#xff0c;模拟实现客户端与服务端的交互&#xff0…

动态规划理论基础和习题【力扣】【算法学习day.26】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

Sqoop学习

目录 一、Soop简介 二、Sqoop的安装 1. 上传压缩包到/opt/install目录下 2.解压 3.修改文件名 4.拷贝sqoop-1.4.7.bin__hadoop-2.6.0目录下的sqoop-1.4.7.jar包到/opt/soft/sqoop147目录下 5.拷贝sqoop-1.4.7.bin__hadoop-2.6.0/lib目录下该jar包到sqoop/lib目录下 6.复…

关于随身wifi,看了再决定要不要买!2024年最受欢迎的随身wifi品牌推荐!

话费、流量费缴纳起来肉疼&#xff0c;毕竟不是每个月都有很大需求&#xff0c;主打一个该省省该花花。特别是短租人群、在校学生、出差或旅游的人群、追求高性价比的人群&#xff0c;随身Wifi特别实用&#xff0c;出门当WiFi&#xff0c;在家当宽带&#xff0c;两不耽误&#…

[vulnhub] DarkHole: 1

https://www.vulnhub.com/entry/darkhole-1,724/ 端口扫描主机发现 探测存活主机&#xff0c;184是靶机 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-08 09:59 CST Nmap scan report for 192.168.75.1 Host is up (0.00027s latency). MA…

iPhone 微信传大文件到QQ

问题 解决方法 在微信里打开要拷贝的文件 选择“...” 选择“用其他应用打开” 长按QQ 选择“拷贝到App”&#xff08;有些版本是“在App中打开”&#xff09;

【学习笔记】网络设备(华为交换机)基础知识 11 —— 信息中心 ② 配置案例

提示&#xff1a;学习华为交换机信息中心配置案例&#xff0c;包含配置输出Log信息 &#xff08; 输出到Log缓冲区、控制台、日志文件、终端 &#xff09;、配置输出Trap信息 &#xff08; 输出到Trap缓冲区、控制台、日志文件、终端 &#xff09;、 配置输出Debug信息 &#x…

电脑管家实时监控软件下载 | 六款知名又实用的电脑监控软件推荐!(珍藏篇)

在当今的商业环境&#xff0c;企业对于员工在工作期间的行为监控需求越来越强烈。 尤其是在网络化和信息化程度不断提高的今天&#xff0c;电脑管家实时监控软件是企业管理员工工作行为、提高工作效率、防止信息泄露的重要工具。 本文&#xff0c;将为您推荐六款知名又实用的电…

PICO+Unity MR空间网格

官方链接&#xff1a;空间网格 | PICO 开发者平台 注意&#xff1a;该功能只能打包成APK在PICO 4 Ultra上真机运行&#xff0c;无法通过串流或PICO developer center在PC上运行。使用之前要开启视频透视。 在 Inspector 窗口中的 PXR_Manager (Script) 面板上&#xff0c;勾选…

Spring Boot中集成MyBatis操作数据库详细教程

目录 前言1. 项目依赖配置1.1 引入MyBatis和数据库驱动依赖1.2 数据源配置 2. 创建数据库映射实体类3. 创建Mapper层接口4. 创建Service层4.1 定义Service接口4.2 实现Service接口 5. 创建Controller层6. 运行和测试项目6.1 启动项目6.2 测试接口 7. 总结 前言 在Java开发中&a…

DirectShow过滤器开发-写AVI视频文件过滤器

下载本过滤器DLL 本过滤器将视频流和音频流写入AVI视频文件。 过滤器信息 过滤器名称&#xff1a;写AVI 过滤器GUID&#xff1a;{2EF49957-37DF-4356-A2A0-ECBC52D1984B} DLL注册函数名&#xff1a;DllRegisterServer 删除注册函数名&#xff1a;DllUnregisterServer 过滤器有…

使用 API 和离线库查询 IP 地址方法详解

目录 一、IP 地址查询能获取哪些信息1.地理位置信息2.网络信息3.网络类型 二、IP 地址查询方法&#xff0c;附代码1.在线查询 IP 地址方法2.使用 API 进行 IP 地址查询3.使用离线库进行 IP 地址查询 互联网监管部门要求公开 IP 归属地&#xff0c;引起了很大热度&#xff0c;但…

机器学习在时间序列预测中的应用与实现——以电力负荷预测为例(附代码)

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 随着数据采集技术的发展&#xff0c;时间序列数据在各个领域中的应用越来越广泛。时间序列预测旨在基于过去的时间数据来…

语音识别ic赋能烤箱,离线对话操控,引领智能厨房新体验

一、智能烤箱产品的行业背景 随着科技的飞速发展&#xff0c;智能家居已经成为现代家庭的新宠。智能烤箱作为智能家居的重要组成部分&#xff0c;正逐渐从高端市场走向普通家庭。消费者对于烤箱的需求不再仅仅局限于基本的烘焙功能&#xff0c;而是更加注重其智能化、便捷化和…

【C++】异常处理机制(对运行时错误的处理)

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 目录 引言 1.编译器可以处理的错误 2.编译器不能处理的错误 3.传统的错误处理机制 assert终止程序 返回错误码 一、…

Python基础学习-03逻辑分支语句、循环

目录 1、记住逻辑关系 2、逻辑分支语句 3、for-loop循环 4、while-loop 5、break 和 continue 6、本节总结 1、记住逻辑关系 • 逻辑关系 1&#xff09; True&#xff08;真&#xff09; 和 False&#xff08;假&#xff09; 2&#xff09;逻辑关系有 and&#xff08;与…

【Windows】Android Studio 上cmd 换为Powershell 终端

最近在Windows 环境下Android Studio 的Terminal 终端&#xff0c;低版本默认用的是cmd.exe&#xff0c;好多linux 命令不支持&#xff0c;有时候一不小心就记忆错了&#xff1b;干脆直接换成Windows PowerShell 得了。 下载Powershell&#xff1a;https://aka.ms/PSWindows 选…