如果不用非线性激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中,提高了模型的泛化能力。
下面介绍介绍两个非线性激活函数
ReLU函数
0以上的输出原数据,0以下进行截断,全部取0
参数:
inplace: 是否在原数据上进行修改,默认为false,输出一个新的数据
下面是一个简单的示例:
import torch
from torch import nn
from torch.nn import ReLU
input = torch.tensor([[1, -0.5],
[-1, 4]])
input = torch.reshape(input, (1, 1, 2, 2))
class Model(nn.Module):
def __init__(self):
super().__init__()
self.relu1 = ReLU()
def forward(self, input):
output = self.relu1(input)
return output
model = Model()
output = model(input)
print(output)
tensor([[[[1., 0.],
[0., 4.]]]])
Sigmod函数
Sigmoid函数将输入的数据全部压缩到0到1
下面进行一个简单示例:
import torchvision
from torch import nn
from torch.nn import ReLU, Sigmoid
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
dataset = torchvision.datasets.CIFAR10("./dataset", train=False, download=False, transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset, batch_size=64)
class Model(nn.Module):
def __init__(self):
super().__init__()
self.sigmoid1 = Sigmoid()
def forward(self, input):
output = self.sigmoid1(input)
return output
model = Model()
step = 0
writer = SummaryWriter("log")
for data in dataloader:
imgs, targets = data
writer.add_images("input", imgs, step)
output = model(imgs)
writer.add_images("output", output, step)
step += 1
writer.close()
输出效果: