首页 > 其他分享 >【Pytorch】神经网络介绍|激活函数|使用pytorch搭建方法

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

时间:2024-11-14 14:47:11浏览次数:3  
标签:初始化 axes linear nn 神经网络 torch Pytorch weight 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 torch

scores = 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:每一维度行数据相加为1
        x = 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)

标签:初始化,axes,linear,nn,神经网络,torch,Pytorch,weight,pytorch
From: https://blog.csdn.net/weixin_57336987/article/details/143771237

相关文章

  • python-三方库-PyTorch-Pillow (PIL Fork)
    1需求官网:https://python-pillow.org/docs:https://pillow.readthedocs.io/en/stable/需求:Image.filename需求:获取图像格式Image.format需求:获取图像尺寸Image.sizeImage.widthImage.height需求:获取图像颜色模式Image.mode需求:获取图像像素值Image.load()[x,y]......
  • pytorch中的ImageFolder 用法
    ImageFolder是PyTorch中torchvision.datasets模块提供的一个常用类,用于从文件夹中加载图像数据。它是一种非常方便的方式来加载按文件夹结构组织的图像数据集。这个类能够自动将文件夹中的子目录作为标签,并且将其中的图像文件加载为PyTorch张量。1.基本概念ImageF......
  • 神经网络架构参考:2-2 卷积篇
    densenet结构层名称类型输入大小(HxWxC)输出大小(HxWxC)核尺寸步长参数数量InitialConvConv2D224x224x3112x112x647x729,408MaxPoolingMaxPool2D112x112x6456x56x643x320DenseBlock1Composite56x56x64......
  • 神经网络架构参考:2-1 卷积篇
    提示词:给出{xxx}的网络结构表格,包含层名称、类型、输入大小(HWC),输出大小(HWC)、核尺寸、步长、参数数量AlexNet层名称类型输入大小(HWC)输出大小(HWC)核尺寸步长参数数量输入层输入227x227x3---0Conv1卷积层227x227x355x55x9611x114961111*3+96=34......
  • PyTorch——从入门到精通:PyTorch简介与安装(最新版)【PyTorch系统学习】
    前言        在这个由数据驱动的时代,深度学习已经成为了推动技术进步的核心力量。而PyTorch,作为当今最流行的深度学习框架之一,以其动态计算图、易用性和灵活性,受到了全球开发者和研究者的青睐。为了帮助更多的学习者和开发者掌握这一强大的工具,我决定在CSDN开设一个专......
  • 【打破传统授信模型:基于深度神经网络 DNN模型的精确授信额度计算方法】-附完整python
    打破传统授信模型:基于深度神经网络DNN模型的精确额度计算方法模型结构概览数据预处理1.导入必要的库2.加载数据3.数据预处理4.构建深度神经网络模型5.模型训练与调参6.模型评估7.可视化训练过程9.完整代码深度神经网络(DeepNeuralNetwork,DNN),该模型通过K......
  • 深度学习 PyTorch 中的 logits 和交叉熵损失函数
    在深度学习中,理解损失函数是训练模型的关键一步。在分类任务中,交叉熵损失函数是最常用的损失函数之一。本文将详细解释PyTorch中的logits、交叉熵损失函数的工作原理,并展示如何调整张量的形状以确保计算正确的损失。什么是logits?logits是模型输出的未归一化预测值,通常......
  • 【自动驾驶-感知】CenterNet与CenterFusion融合目标检测的目标检测模型实战代码-基于P
    【自动驾驶-感知】CenterNet与CenterFusion融合目标检测的目标检测模型实战代码一.CenterNet目标检测模型1.中心点热力图2.物体尺寸回归3.分类任务4.损失函数二、融合目标检测CenterFusion算法原理三.实现案例与代码数据集与实验环境数据预处理与增强模型定义......
  • 【图神经网络】 GAT原文精讲(全网最细致篇)
    GCN网络系列论文精讲部分0.摘要1引言2GAT架构2.1图注意力层2.2与相关工作的比较3评估3.1数据集3.2最新技术方法3.3实验设置3.4结果4结论5笔者总结论文精讲部分本专栏深入探讨图神经网络模型相关的学术论文,并通过实际代码实验来提高理解。读者可以根......
  • 基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)
    摘要:基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集,使用Pysdie6库来搭建前端页面展示......