非线性激活

1.什么是激活函数

        激活函数(Activation Function)是神经网络中的一个关键组成部分,作用是在神经元接收到输入信号后,决定是否将信号传递到下一层神经元。激活函数可以引入非线性,从而使得神经网络能够表示更复杂的函数关系。

        线性激活函数:输出是输入的线性变换,例如 f(x) = x。线性激活函数无法引入非线性特性,因此,无论网络有多少层,用线性激活函数的网络最终相当于一个单层的线性变换,无法解决复杂的任务。

        非线性激活函数:输出是输入的非线性变换,如 ReLU、Sigmoid、Tanh 等。非线性激活函数可以引入非线性特性,使得神经网络能够学习并表示复杂的函数和决策边界。它们是现代神经网络的核心,因为没有非线性激活函数,神经网络的表达能力会受到极大限制。

2.常见的非线性激活函数

        1.ReLU

        ReLU(x) = max(0, x),如果输入是正数,则输出等于输入;如果输入是负数或零,则输出为零。

        2.Sigmoid

        Sigmoid(x) = 1 / (1 + e^(-x)),就是将输入值映射到 (0, 1) 的范围内,通常用于二分类问题。非线性,但容易导致梯度消失问题,尤其是在深层网络中。

        3.Tanh(双曲正切函数)

        Tanh(x) = (e^x - e^(-x)) / (e^x + e^(-x)),将输入值映射到 (-1, 1) 的范围内。输出范围比Sigmoid更大,通常在深层网络中表现比Sigmoid更好,但仍有梯度消失问题。

3.代码实现

"""
非线性激活
padding层几乎用不到,就是对输入图像用各种方法填充,我还不如用卷积层和池化层里填了拉倒
non_liner activations很简单,尤其是ReLU(x) = Max(0 , x)
Sigmoid(x) = 1 / (1 + e^(-x)),取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。
Relu(input , inplace)中的input要求其为[batch , channel , h , w]形式
inplace如果为true,则直接将input的值替换,否则就需要额外一个存储改变后的值,但是input的内容不变
"""

import torch
import torch.nn.functional as F
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10('E:\\PyCharm_Project\\Pytorch_2.3.1\\PytorchVision\\dataset', train=False,
                                       transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size=64)


# input = torch.tensor([[1,-1],
#                     [-1.1,3]], dtype=torch.float)
# input = torch.reshape(input, (-1 , 1 , 2 , 2))
# print(input.shape)

class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.relu = torch.nn.ReLU()
        self.sig = torch.nn.Sigmoid()

    def forward(self, x):
        x = self.sig(x)
        return x


writer = SummaryWriter("logs")
model = Net()
step = 1
for data in dataloader:
    imgs, labels = data
    writer.add_images("input", imgs, step)
    outputs = model(imgs)
    writer.add_images("output", outputs, step)
    step += 1
writer.close()

        通常,在图像处理中,像素值通常为 [0, 1] 或 [0, 255] 之间的浮点数或整数。加载 CIFAR-10 图像时,使用了 ToTensor() 转换,这将图像像素值标准化到 [0, 1] 范围内。 由于 Sigmoid 函数的输出范围在 (0, 1) 之间,并且对于接近 0 的输入值,输出更接近 0.5,因此像素值整体被压缩并接近于中间值(0.5),这样会使得图像整体缺乏对比度,看起来较为灰暗。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值