Pytorch深度学习-----神经网络之非线性激活的使用(ReLu、Sigmoid)

系列文章目录

PyTorch深度学习——Anaconda和PyTorch安装
Pytorch深度学习-----数据模块Dataset类
Pytorch深度学习------TensorBoard的使用
Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Compose,RandomCrop)
Pytorch深度学习------torchvision中dataset数据集的使用(CIFAR10)
Pytorch深度学习-----DataLoader的用法
Pytorch深度学习-----神经网络的基本骨架-nn.Module的使用
Pytorch深度学习-----神经网络的卷积操作
Pytorch深度学习-----神经网络之卷积层用法详解
Pytorch深度学习-----神经网络之池化层用法详解及其最大池化的使用


文章目录

  • 系列文章目录
  • 一、非线性激活是什么?
  • 二、ReLU函数
    • 1.ReLU函数介绍
    • 2.使用Relu函数处理矩阵
  • 三、Sigmoid函数
    • 1.Sigmoid函数介绍
    • 2.使用Sigmoid函数处理CIFAR10数据集


一、非线性激活是什么?

非线性激活是神经网络中的一种操作,它被用于引入非线性特性到神经网络的输出中。在神经网络中,线性操作如加法和乘法只能产生线性变换,而非线性激活函数则允许网络学习非线性关系

在每个神经元的输出中应用非线性激活函数,可以使得神经网络能够学习和表示更加复杂的函数关系。这是因为非线性激活函数可以对输入数据进行非线性映射,从而增加了网络的表达能力。

常见的非线性激活函数包括sigmoid函数、ReLU函数、tanh函数等。

英文为:Non-linear Activations;官网解释为:Non-linear Activations

二、ReLU函数

1.ReLU函数介绍

首先先查看官网对其解释:如下图所示
Pytorch深度学习-----神经网络之非线性激活的使用(ReLu、Sigmoid)_第1张图片
Pytorch深度学习-----神经网络之非线性激活的使用(ReLu、Sigmoid)_第2张图片
可以见到有一个参数inplace,布尔类型,所以具有两种情况
当inplace 为True时,会将输入数据进行替换;当inplace 为False时,输入数据不进行替换

即:input=-1 经过 Relu(input,inplace=True)后,input=0;
input=-1 经过 Relu(input,inplace=False)后,input=-1;

即将小于0的数据替换为0
由官网的图像可以推测,Relu函数的表达式为
在这里插入图片描述
因为input=-1时小于0,故替换为0.

其次:relu函数也是分段线性函数。

2.使用Relu函数处理矩阵

import torch

# 准备数据
input = torch.tensor([[1,-1],
                      [-2,3]])

# 搭建自己的一个神经网络
class lgl(torch.nn.Module):
    def __init__(self):
        super(lgl, self).__init__()
        # 默认inplace参数为False
        self.relu1 = torch.nn.ReLU()
    def forward(self,input):
        output = self.relu1(input)
        return output

# 实例化
l = lgl()
output = l(input)
print(input)
print(output)

输出结果如下:

tensor([[ 1, -1],
        [-2,  3]])
tensor([[1, 0],
        [0, 3]])

验证结果,由Relu函数的特点,进行relu后会将小于等于0的数值替换为0,大于0的数值保持不变,故上述结果正确。同时inplace默认是False,故输入不会改变。

下面将inplace=True

import torch

# 准备数据
input = torch.tensor([[1,-1],
                      [-2,3]])

# 搭建自己的一个神经网络
class lgl(torch.nn.Module):
    def __init__(self):
        super(lgl, self).__init__()
        # 同时将inplace参数设置为True
        self.relu1 = torch.nn.ReLU(inplace=True)
    def forward(self,input):
        output = self.relu1(input)
        return output

# 实例化
l = lgl()
output = l(input)
print(input)
print(output)

输出结果如下:

tensor([[1, 0],
        [0, 3]])
tensor([[1, 0],
        [0, 3]])

三、Sigmoid函数

1.Sigmoid函数介绍

首先先查看官网,对其解释如下图所示

Pytorch深度学习-----神经网络之非线性激活的使用(ReLu、Sigmoid)_第3张图片
函数表达式如下
Pytorch深度学习-----神经网络之非线性激活的使用(ReLu、Sigmoid)_第4张图片
函数取值范围为(0,1)

2.使用Sigmoid函数处理CIFAR10数据集

代码如下:

import torch
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# 准备cifar10数据集
test_set = torchvision.datasets.CIFAR10("dataset",
                                        train=False,
                                        transform=torchvision.transforms.ToTensor(),
                                        download=True)
# 加载器
dataloader = DataLoader(test_set,batch_size=64)

# 搭建自己的神经网络
class Lgl(torch.nn.Module):
    def __init__(self):
        super(Lgl, self).__init__()
        self.sigmoid1 = torch.nn.Sigmoid()

    def forward(self, input):
        output = self.sigmoid1(input)
        return output

# 实例化
l = Lgl()

# 进行sigmoid函数化,并在TensorBoard中显示
writer = SummaryWriter("logs_test")
step = 0
for data in dataloader:
    imgs, target = data
    # 未进行sigmoid函数前图片显示
    writer.add_images("input",imgs,step)
    output = l(imgs)
    # 进行sigmoid函数化后图片显示
    writer.add_images("output",output,step)
    step = step + 1

writer.close()

对比如下图所示:
Pytorch深度学习-----神经网络之非线性激活的使用(ReLu、Sigmoid)_第5张图片
Pytorch深度学习-----神经网络之非线性激活的使用(ReLu、Sigmoid)_第6张图片

你可能感兴趣的:(pytorch深度学习,深度学习,pytorch,神经网络)