【Pytorch】神经网络介绍|激活函数|使用pytorch搭建方法

神经网络

神经网络介绍

概念

  • 神经网络

    • 人工神经网络ANN 也称神经网络NN 是一种模仿生物神经网络结构和功能的计算模型
    • 人脑可以看作是一个生物神经网络,由众多神经元连接而成,神经网络可以看作是模拟生物神经元的过程

在这里插入图片描述

  • 输入层 input Layer: 输入x的那一层

  • 输出层 output Layer: 输出y的那一层

  • 隐藏层 hidden Layer: 输入层和输出层之间是隐藏层

  • 特点是:

    • 每一层神经元之间没有链接
    • 第n层的每个神经元和第n-1层的所有神经元相连接(full connected 全连接神经网络)
    • 第n-1层神经元的输出是第n层神经元的输入
    • 每个连接都有一个权重值(w系数和b系数)

激活函数

​ 激活函数用于对每层的输出数据进行变换, 进而为整个网络注入非线性因素.此时神经网络就可以拟合各种曲线

没有引入非先行因素的网络等价于使用一个线性模型来拟合,通过给网络输出增加激活函数,实现引入非线性因素,使得网络模型可以逼近任意函数,提升网络对复杂问题的拟合能力

sigmoid 激活函数

在这里插入图片描述

  • 将任意的输入映射到0,1之间, 当输入的值<-6或者<6时,输入任何值得到的激活值都是差不多的,意味着会丢失信息
  • sigmoid输入值在[-6,6]之间才会有明显差异[-3,3]之间才会有比较好的效果
  • sigmoid网络在5层之内就会产生梯度消失现象,sigmoid函数一般只用于二分类的输出层
import torch
import matplotlib.pyplot as plt# 创建画布和坐标轴
_, axes = plt.subplots(1, 2)
# sigmoid函数图像
x = torch.linspace(-20, 20, 1000)
# 输入值x通过sigmoid函数转换成激活值y
y = torch.sigmoid(x)
axes[0].plot(x, y)
axes[0].grid()
axes[0].set_title('Sigmoid 函数图像')# sigmoid导数图像
x = torch.linspace(-20, 20, 1000, requires_grad=True)
torch.sigmoid(x).sum().backward()
# x.detach():输入值x的数值
# x.grad:计算梯度,求导
axes[1].plot(x.detach(), x.grad)
axes[1].grid()
axes[1].set_title('Sigmoid 导数图像')
plt.show()
tanh激活函数

在这里插入图片描述

  • Tanh函数将输入映射到(-1,1)之间,图像在0处对称,导数范围在(0,1)当输入值<-3或>3时,导数近似0
  • 与sigmoid相比,它是以0为中心的,且梯度相对于sigmoid大,使得其收敛速度闭sigmoid快,同样,tanh也会梯度消失
  • 使用时可在隐藏层使用tanh输出层用sigmoid
import torch
import matplotlib.pyplot as plt# 创建画布和坐标轴
_, axes = plt.subplots(1, 2)
# 函数图像
x = torch.linspace(-20, 20, 1000)
y = torch.tanh(x)
axes[0].plot(x, y)
axes[0].grid()
axes[0].set_title('Tanh 函数图像')# 导数图像
x = torch.linspace(-20, 20, 1000, requires_grad=True)
torch.tanh(x).sum().backward()
axes[1].plot(x.detach(), x.grad)
axes[1].grid()
axes[1].set_title('Tanh 导数图像')
plt.show()
ReLU激活函数

在这里插入图片描述

  • ReLU激活函数将小于0的值映射为0,而大于0的值保持不变,更加重视正信号,忽略负信号,更为简单,提高模型的训练效率
  • x>0时,保持梯度不衰减,但是随着训练的进行,部分输入会落入x<0区域,导致对应的权重无法更新,这种情况被称为神经元死亡
  • ReLU是目前最常用的激活函数与sigmoid相比ReLU的优势是
    • 计算量少
    • sigmoid进行反向传播是,很容易出现梯度消失的情况,无法完成深层网络的训练,Relu会使一部分神经元输出为0,缓解了过拟合的发生
# 创建画布和坐标轴
import torch
from matplotlib import pyplot as plt_, axes = plt.subplots(1, 2)
# 函数图像
x = torch.linspace(-20, 20, 1000)
y = torch.relu(x)
axes[0].plot(x, y)
axes[0].grid()
axes[0].set_title('ReLU 函数图像')
# 导数图像
x = torch.linspace(-20, 20, 1000, requires_grad=True)
torch.relu(x).sum().backward()
axes[1].plot(x.detach(), x.grad)
axes[1].grid()
axes[1].set_title('ReLU 导数图像')
plt.show()
SoftMax激活函数

在这里插入图片描述

softmax将网络输出的logits通过softmax函数,映射为0,1之间的值,这些值的累和为1,选取值最大的节点,作为预测目标的类别

import torchscores = torch.tensor([0.2, 0.02, 0.15, 0.15, 1.3, 0.5, 0.06, 1.1, 0.05, 3.75])
# dim = 0,按行计算
probabilities = torch.softmax(scores, dim=0)
print(probabilities)
其他常用的激活函数

在这里插入图片描述

参数初始化方法

  • 均匀分布初始化

    • 权重参数初始化从区间均匀随机取值
  • 正态分布初始化

    • 随机从均值为0,标准差为1的高斯分布中取样
  • 全0初始化

    • 所有权重参数初始化为0
  • 全1初始化

    • 所有权重参数初始化为1
  • 固定值初始化

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

    • 分为正态分布的HE初始化和均匀分布的HE初始化
    • 正态化的HE初始化
      • stddev = sqer(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():linear = nn.Linear(5, 3)# 从0-1均匀分布产生参数nn.init.uniform_(linear.weight)print(linear.weight.data)# 2.固定初始化
    def test02():linear = nn.Linear(5, 3)nn.init.constant_(linear.weight, 5)print(linear.weight.data)# 3. 全0初始化
    def test03():linear = nn.Linear(5, 3)nn.init.zeros_(linear.weight)print(linear.weight.data)# 4. 全1初始化
    def test04():linear = nn.Linear(5, 3)nn.init.ones_(linear.weight)print(linear.weight.data)# 5. 正态分布随机初始化
    def test05():linear = nn.Linear(5, 3)nn.init.normal_(linear.weight, mean=0, std=1)print(linear.weight.data)# 6. kaiming 初始化
    def test06():# kaiming 正态分布初始化linear = nn.Linear(5, 3)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)# 7. xavier 初始化
    def test07():# xavier 正态分布初始化linear = nn.Linear(5, 3)nn.init.xavier_normal_(linear.weight)print(linear.weight.data)# xavier 均匀分布初始化linear = nn.Linear(5, 3)nn.init.xavier_uniform_(linear.weight)print(linear.weight.data)
    

神经网络搭建和参数计算

在pytorch中定义深度神经网络其实就是层堆叠的过程,继承自nn.Module,实现两个方法:

  • __init__方法中定义网络中的层结构,主要是全连接层,并进行初始化
  • forward方法,在实例化模型的时候,底层会自动调用该函数。该函数中可以定义学习率,为初始化定义的layer传入数据等。
    在这里插入图片描述

编码设计如下:

  • 第1个隐藏层:权重初始化采用标准化的xavier初始化 激活函数使用sigmoi
  • 第2个隐藏层:权重初始化采用标准化的He初始化 激活函数采用relu
  • out输出层线性层 假若二分类,采用softmax做数据归一化
import torch
import torch.nn as nn
from torchsummary import summary  # 计算模型参数,查看模型结构, pip install torchsummary
# 创建神经网络模型类
class Model(nn.Module):# 初始化属性值def __init__(self):super(Model, self).__init__() # 调用父类的初始化属性值self.linear1 = nn.Linear(3, 3) # 创建第一个隐藏层模型, 3个输入特征,3个输出特征nn.init.xavier_normal_(self.linear1.weight) # 初始化权# 创建第二个隐藏层模型, 3个输入特征(上一层的输出特征),2个输出特征self.linear2 = nn.Linear(3, 2)# 初始化权重nn.init.kaiming_normal_(self.linear2.weight)# 创建输出层模型self.out = nn.Linear(2, 2)
# 创建前向传播方法,自动执行forward()方法def forward(self, x):# 数据经过第一个线性层x = self.linear1(x)# 使用sigmoid激活函数x = torch.sigmoid(x)# 数据经过第二个线性层x = self.linear2(x)# 使用relu激活函数x = torch.relu(x)# 数据经过输出层x = self.out(x)# 使用softmax激活函数# dim=-1:每一维度行数据相加为1x = torch.softmax(x, dim=-1)return x
if __name__ == "__main__":# 实例化model对象my_model = Model()# 随机产生数据my_data = torch.randn(5, 3)print("mydata shape", my_data.shape)# 数据经过神经网络模型训练output = my_model(my_data)print("output shape-->", output.shape)# 计算模型参数# 计算每层每个神经元的w和b个数总和summary(my_model, input_size=(3,), batch_size=5) # 查看模型参数print("======查看模型参数w和b======")for name, parameter in my_model.named_parameters():print(name, parameter)

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

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

相关文章

【HarmonyOS NEXT】实战——登录页面

【HarmonyOS NEXT】实战——登录页面 在本文中&#xff0c;我们将深入探讨如何使用HarmonyOS NEXT来实现一个功能完备的登录页面。通过这个实战案例&#xff0c;你将结合页面布局、数据本地化存储、网络请求等多方面了解到HarmonyOS NEXT在构建现代应用时的强大能力和灵活性。…

iscc2023

iscc 还没想好名字的塔防游戏 就是那句话首字母&#xff0c;加上玩游戏通关后有提示就是后面的字母 Flask中的pin值计算 先f12&#xff0c;看到base64到路由/getusername 输入app.py&#xff0c;得到路由/crawler 进入后发现是一个计算&#xff0c;写一个python脚本 impor…

力扣-Mysql-3328-查找每个州的城市 II(中等)

一、题目来源 3328. 查找每个州的城市 II - 力扣&#xff08;LeetCode&#xff09; 二、数据表结构 表&#xff1a;cities ---------------------- | Column Name | Type | ---------------------- | state | varchar | | city | varchar | ----------------…

Vue2:组件

Vue2&#xff1a;组件 非单文件组件定义注册使用 单文件组件 组件是Vue中最核心的内容&#xff0c;在编写页面时&#xff0c;将整个页面视为一个个组件&#xff0c;再把组件拼接起来&#xff0c;这样每个组件之间相互独立&#xff0c;有自己的结构样式&#xff0c;使页面编写思…

力扣 LeetCode 28. 找出字符串中第一个匹配项的下标(Day4:字符串)

解题思路&#xff1a; KMP算法 需要先求得最长相等前后缀&#xff0c;并记录在next数组中&#xff0c;也就是前缀表&#xff0c;前缀表是用来回退的&#xff0c;它记录了模式串与主串(文本串)不匹配的时候&#xff0c;模式串应该从哪里开始重新匹配。 next[ j - 1 ] 记录了 …

计算机网络 (1)互联网的组成

一、互联网的边缘部分 互联网的边缘部分由所有连接在互联网上的主机组成&#xff0c;这些主机又称为端系统&#xff08;end system&#xff09;。端系统可以是各种类型的计算机设备&#xff0c;如个人电脑、智能手机、网络摄像头等&#xff0c;也可以是大型计算机或服务器。端系…

智慧军营安防方案

1. 引言 智慧安防方案集成高清视频监控、智能分析与大数据管理&#xff0c;打造全方位安全防护体系。通过先进技术&#xff0c;提升预警与应急响应能力&#xff0c;确保安全无死角。 2. 视频监控技术 采用高清摄像设备与智能识别算法&#xff0c;实现全景监控与细节跟踪&#…

ABAP开发学习——ST05 ABAP SQL跟踪工具

操作步骤 第一步使用ST05之前&#xff0c;将要查的程序停留想要看的操作的前一步&#xff0c;这里想看到取数操作&#xff0c;所以停留在选择界面 第二步进入ST05 选择SQL Trace 然后激活 第三步去执行程序 第四步ST05取消激活 第五步查看操作 选完时间直接执行

AtCoder ABC378 A-D题解

比赛链接:ABC378 比较简单的一次 ABC。 Problem A: Code #include <bits/stdc.h> using namespace std; int main(){cin>>A[1]>>A[2]>>A[3]>>A[4];sort(A1,A5);if(A[1]A[2] && A[3]A[4])cout<<2<<endl;else{if(A[1]A[2]…

Windows上安装专业版IDEA2024并激活

1、IDEA官方下载 搜索IDEA官网点击进入&#xff0c;点击Download&#xff08;目前这个激活脚本只能激活2024.1.7&#xff0c;2024.2.x的版本都不能激活&#xff0c;2024.1.7版本已上传资源&#xff09;&#xff0c;如图&#xff1a; 2、开始安装 1&#xff09;、双击下载的.…

表达式求值问题(中缀转后缀,对后缀求值)详解

目录 实验题目 理解中缀和后缀表达式 问题分析 1转化为中缀表达式 2计算后缀表达式 完整代码 运行结果 实验题目 实验题目&#xff1a;表达式求值问题。这里限定的表达式求值问题是&#xff1a; 用户输入一个包含“”、“-”、“*”、“/”、正整数和圆括号的合法数学表…

AD22怎么按照板子形状铺铜

如何按照板子形状来铺铜&#xff1f; 选择铺铜管理器 选择板外形 我这里图里VCC没画就选择VCC&#xff0c; 你选什么层&#xff0c;就勾什么层 死铜移除勾选 效果如下&#xff1a;

【视觉SLAM】2-三维空间刚体运动的数学表示

读书笔记&#xff1a;学习空间变换的三种数学表达形式。 文章目录 1. 旋转矩阵1.1 向量运算1.2 坐标系空间变换1.3 变换矩阵与齐次坐标 2. 旋转向量和欧拉角2.1 旋转向量2.2 欧拉角 3. 四元数 1. 旋转矩阵 1.1 向量运算 对于三维空间中的两个向量 a , b ∈ R 3 a,b \in \R^3 …

研发费用资本化的意义

1.更真实地反映企业价值&#xff1a;研发费用是企业为创造未来经济利益而进行的投资&#xff0c;通过将其资本化并作为无形资产计入资产负债表&#xff0c;可以更真实地反映企业的资产总额和长期投资价值。这有助于投资者、债权人和其他利益相关者更准确地评估企业的财务状况、…

Ubuntu24.04安装Anaconda3+Pycharm

一、引言 重装系统已经过去一段时间了&#xff0c;现在安装一下 Anaconda 和 Pycharm。 参考连接&#xff1a; Ubuntu中安装Anaconda3和Pycharm 及其环境搭建Ubuntu18.04安装Pycharm教程ubuntu系统安装Anaconda及Pycharm在移动硬盘上搭建Ubuntu24.04深度学习环境&#xff08;…

稀疏矩阵(Sparse Matrix)及其存储格式详解

稀疏矩阵&#xff08;Sparse Matrix&#xff09;是线性代数和计算机科学中的一个重要概念&#xff0c;广泛应用于科学计算、工程模拟、图像处理、机器学习等多个领域。与稠密矩阵&#xff08;Dense Matrix&#xff09;相比&#xff0c;稀疏矩阵大部分元素为零&#xff0c;仅有少…

操作系统:页表中的页表项

操作系统&#xff1a;页表中的页表项 页表是操作系统用于跟踪进程使用的虚拟地址与系统内存中相应物理地址之间映射的数据结构。 页表项&#xff08;Page Table Entry&#xff0c;PTE&#xff09;是页表中的一个条目&#xff0c;用于存储有关特定内存页的信息。每个页表项包含…

Docker部署Kafka SASL_SSL认证,并集成到Spring Boot

1&#xff0c;创建证书和密钥 需要openssl环境&#xff0c;如果是Window下&#xff0c;下载openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 还需要keytool环境&#xff0c;此环境是在jdk环境下 本案例所使用的账号密码均为&#xff1a; ka…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《基于改进容积卡尔曼滤波的含光伏配电网动态状态估计》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

jenkins使用cli发行uni-app到h5

官网文档HBuilderX 文档 首先确定是否存在环境变量 正常情况cmd中执行cli 如果提示 cli 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。请先配置环境变量 Freestyle Project项目在Build Steps中增加Execute Windows batch command命令如下 d: cd D:\devsof…