sunpongber

神经网络-非线性激活

Padding Layers -> nn.ZeroPad2d -> 将输入的tensor周围用0填充

卷积层中填充的时候用padding填充的时候只能用0来填充,即padding=0,和nn.ZeroPad2d一样

nn.ConstantPad2d ->用常数进行一些填充

Padding Layers都是对输入图像进行填充的几种方式,但几乎用不到,绝大多数也可以在卷积层中实现

Non-linear Activations (weighted sum, nonlinearity) -> ReLU

ReLU

torch.nn.ReLU(inplace=False)[source]

非线性激活就是给我们的神经网络中引入一些非线性的特质,最常见的是ReLU
Input < 0,截断为0;Input > 0,为原始值

Non-linear Activations (weighted sum, nonlinearity) -> Sigmoid

Sigmoid

torch.nn.Sigmoid(*args, **kwargs)

输入为x,按照以下公式计算输出:

Sigmoid(x)=σ(x)=11+exp(x)

以ReLU举例,截断好算
inplace是什么?

input = -1
ReLU(input, inplace=True)
input = 0

input = -1
output = ReLU(input, inplace=False)
input = -1
output = 0

原地操作,一般情况inplace=False,防止原始数据丢失,默认是False,就不用管它

import torch
from torch import nn
from torch.nn import ReLU

input = torch.tensor([[1, -0.5],
                      [-1, 3]])

input = torch.reshape(input, (-1, 1, 2, 2))
print(input.shape)

class nn_relu(nn.Module):
    def __init__(self):
        super(nn_relu, self).__init__()
        self.relu1 = ReLU()

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

NN_relu = nn_relu()
output = NN_relu(input)
print(output)

返回:

torch.Size([1, 1, 2, 2])
tensor([[[[1., 0.],
          [0., 3.]]]])

因为图像3个通道的取值都是0-255,用ReLU等于没有变化,用Sigmoid才能映射到0-1的区间,使用数据集演示:

import torch
import torchvision
from torch import nn
from torch.ao.nn.quantized import Sigmoid
from torch.nn import ReLU
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10(root="P19_nn_maxpool/dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)

dataLoader = DataLoader(dataset, batch_size=64)

class nn_relu(nn.Module):
    def __init__(self):
        super(nn_relu, self).__init__()
        self.relu1 = ReLU()
        self.sigmoid1 = nn.Sigmoid()

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

NN_relu = nn_relu()

writer = SummaryWriter(log_dir="logs")

step = 0
for data in dataLoader:
    imgs, targets = data
    writer.add_images("input", imgs, step)
    output = NN_relu(imgs)
    writer.add_images("output", output, step)
    step += 1

writer.close()

非线性变换的主要目的就是给网络引入非线性特征,因为非线性越多,才能训练出符合各种曲线或者特征的模型,否则模型的泛化能力就不够好

原始资料地址:
神经网络-非线性激活
如有侵权联系删除 仅供学习交流使用