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

一. 神经网络介绍

神经网络概念

神经元构建

神经网络

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

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

输入层: 数据

输出层: 目标(加权和)

隐藏层: 加权和 + 激活

全连接

第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.rhkb.cn/news/468306.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

栈(Stack)和队列(Deque、Queue)

文章目录 一、栈1.1 栈 VS 虚拟机栈 VS 栈帧1.2 数据结构 -- 栈介绍1.3 用数组模拟实现栈1.4 栈的功能&#xff1a;逆序打印 二、队列2.1 数据结果 -- 队列介绍2.2 用单链表模拟实现Queue队列 一、栈 1.1 栈 VS 虚拟机栈 VS 栈帧 区别&#xff1a; 栈&#xff1a;是一种数据结…

Spring Boot2.0之九 使用EasyExcel导出Excel

前言 SpringBoot项目实现Excel文件导出功能&#xff0c;可以使用alibaba开源项目EasyExcel实现。默认导出的Excel表头为宋体14加粗&#xff0c;表内容为宋体11。 一、引入EasyExcel依赖 <dependency><groupId>com.alibaba</groupId><artifactId>eas…

Java关于暴力破解MD5加密字符串示例

最近看到一个系统的用户密码直接就是用MD5加密的方式存在数据库的&#xff0c;而且也没有加盐&#xff0c;顿时有些好奇&#xff0c;因为一直听说MD5加密不够安全&#xff0c;很容易碰撞攻击&#xff0c;但是这个容易是有多容易&#xff0c;如果要破解一个MD5加密的密码大概要多…

我国成功发射航天宏图PIESAT-2 01~04星

11月9日11时39分&#xff0c;我国在酒泉卫星发射中心使用长征二号丙运载火箭&#xff0c;成功将航天宏图PIESAT-2 01&#xff5e;04星发射升空&#xff0c;卫星顺利进入预定轨道&#xff0c;发射任务获得圆满成功[1]。 航天宏图信息技术股份有限公司&#xff08;以下简称“航天…

三十四、VB基本知识与提高篇

一、代码编写规则: (一)标识符的使用规则: 标识符有两种:一种是系统关键字,另一种是自己定义标识符。 1、不能与系统关键字相同。 2、同一作用域(块)中不同出现重名标识符。用户自定义的标识符是不区分大小写的。 3、自定义标识符必须以字母开头,长度不能超过255…

[代码随想录打卡Day8] 344.反转字符串 541. 反转字符串II 54. 替换数字

反转字符串 难度&#xff1a;易。 问题描述&#xff1a;编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 这个就是开头…

【双十一特惠】腾讯云省钱攻略:如何智取云计算资源

前言 双十一不仅是购物的狂欢节&#xff0c;对于云计算用户来说&#xff0c;更是一个节省成本的绝佳时机。腾讯云&#xff0c;作为国内领先的云计算服务商&#xff0c;每年双十一都会推出一系列优惠活动。本文将为您揭开如何在这个购物节中&#xff0c;最大化利用腾讯云的优惠…

mean_x2 = (x**2).mean(dim=dims, keepdims=True)

这行代码的作用是计算输入张量 x 在指定维度上的平方均值&#xff0c;并保持原始维度的形状。具体来说&#xff1a; mean_x2 (x**2).mean(dimdims, keepdimsTrue) # [b,1,1] 参数解释 x**2&#xff1a;对输入张量 x 的每个元素进行平方运算。.mean(dimdims, keepdimsTrue)…

如何在 Android 上增加 SELinux 权限

SELinux&#xff08;Security-Enhanced Linux&#xff09;是一种强制访问控制&#xff08;MAC&#xff09;机制&#xff0c;它为 Android 系统提供了额外的安全层。通过 SELinux&#xff0c;系统管理员可以定义细粒度的安全策略&#xff0c;限制进程对文件、网络和其他资源的访…

数字化转型实践:金蝶云星空与钉钉集成提升企业运营效率

数字化转型实践&#xff1a;金蝶云星空与钉钉集成提升企业运营效率 本文介绍了深圳一家电子设备制造企业在数字化转型过程中&#xff0c;如何通过金蝶云星空与钉钉的高效集成应对挑战、实施解决方案&#xff0c;并取得显著成果。集成项目在提高沟通效率、自动化审批流程和监控异…

『事善能』MySQL基础 — 2.MySQL 5.7安装(一)

1、通过msi安装软件进行MySQL安装 &#xff08;1&#xff09;点击运行MySQL安装文件 &#xff08;2&#xff09;选择安装类型 我们选择自定义安装&#xff0c;点击Next。 说明 Develop Default&#xff1a;默认开发类型&#xff0c;安装MySQL服务器以及开发MySQL应用所需要的工…

DICOM图像知识:DICOM图像排序与坐标系解析

目录 引言 1. 概述 2. DICOM图像排序规则 2.1 Patient的Study按Study Date排序 2.2 Study的Series按Series Number排序 2.3 Series的SOP按Instance Number或Slice Location排序 2.3.1 Instance Number排序 2.3.2 Slice Location排序 2.3.3 使用Image Position (Patien…

uniapp—android原生插件开发(2原生插件开发)

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

清华大学提出Mini-Omni2:开源多模态模型,功能与GPT-4o媲美!

&#x1f310; 在人工智能领域&#xff0c;多模态模型的发展正如火如荼。今天&#xff0c;我们要介绍的是由清华大学提出的Mini-Omni2&#xff0c;这是一个开源的多模态语言模型&#xff0c;它在功能上与GPT-4o相媲美&#xff0c;能够理解和生成视觉、听觉和文本内容&#xff0…

Golang进阶

1.面向对象 1.1.golang语言面向对象编程说明 Golang 也支持面向对象编程(OOP)&#xff0c;但是和传统的面向对象编程有区别&#xff0c;并不是纯粹的面向对象语言。所以我们说 Golang 支持面向对象编程特性是比较准确的。Golang 没有类(class)&#xff0c;Go 语言的结构体(st…

ElasticSearch 添加IK分词器

ElasticSearch 添加IK分词器 前言一、IK分词器的算法二、Ik分词器的下载安装&#xff08;Winows 版本&#xff09;三、Ik分词器的下载安装&#xff08;Linux 版本&#xff09;四、验证测试&#xff08;postman工具&#xff09;测试 ik_smart 分词算法测试 ik_max_word 分词算法…

双指针算法的妙用:提高代码效率的秘密(2)

双指针算法的妙用&#xff1a;提高代码效率的秘密&#xff08;2&#xff09; 前言&#xff1a; 小编在前几日讲述了有关双指针算法两道题目的讲解&#xff0c;今天小编继续进行有关双指针算法习题的讲解&#xff0c;老规矩&#xff0c;今天还是两道题目的讲解&#xff0c;希望…

浮动路由:实现出口线路的负载均衡冗余备份。

浮动路由 Tip&#xff1a;浮动路由指在多条默认路由基础上加入优先级参数&#xff0c;实现出口线路冗余备份。 ip routing-table //查看路由表命令 路由优先级参数&#xff1a;越小越优 本次实验测试两条默认路由&#xff0c;其中一条默认路由添加优先级参数&#xff0c;设置…

利用VMware workstation pro 17安装 Centos7虚拟机以及修改网卡名称

通过百度网盘分享的文件&#xff1a;安装虚拟机必备软件 链接&#xff1a;https://pan.baidu.com/s/1rbYhDh8x1hTzlSNihm49EA?pwdomxy 提取码&#xff1a;omxy 123网盘 https://www.123865.com/s/eXPrVv-UsKch 提取码:eNcy 先自行安装好VMware workstation pro 17 设置虚拟机…

如何在Linux中使用Cron定时执行SQL任务

文章目录 前言一、方案分析二、使用步骤1.准备脚本2.crontab脚本执行 踩坑 前言 演示数据需要每天更新监控数据&#xff0c;不想手动执行&#xff0c;想到以下解决方案 navicat 创建定时任务java服务定时执行linux crontab 定时执行sql脚本 一、方案分析 我选择了第三个方案…