一、非线性的作用:主要是给模型加上一些非线性特征,非线性特征越多,才能训练出符合各种特征的模型,提高模型的泛化能力。
二、常见的非线性激活:
1、ReLU
从图中可以看出这种非线性激活的作用是:当输入大于0时,不改变输入的东西,如果输入小于0,则将输入的东西变成0
ReLU参数:
inplace参数:
当 inplace = True时:会将输入图像也改变
当 inplace = False时:不改变输入的图像,即:
input = -1
ReLU(input, inplace=True)
input = 0
input = -1
output = ReLU(input, inplace = False)
input = -1
output = 0
未True时,会自动将结果赋给原值,为False时,不会讲结果赋给原值
由于此线性激活作用于图像上并不明显,因此不再演示,将演示内容放至下一个非线性激活中
2、sigmoid
内容与ReLU大致相同,直接上实际代码展示:
from torch import nn
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from torch.utils.data import DataLoader
import torchvision
tensor_trans = transforms.ToTensor()
test_data = torchvision.datasets.CIFAR10(root="./dataloader",train=False,transform=tensor_trans,download=True)
dataloader = DataLoader(dataset=test_data,batch_size=64,shuffle=True,num_workers=0,drop_last=False)
class MyModule(nn.Module):
def __init__(self):
super().__init__()
self.sigmoid = nn.Sigmoid()
def forward(self,imgs):
imgs = self.sigmoid(imgs)
return imgs
writer = SummaryWriter("log")
sigmoid = MyModule()
step = 0
for each in dataloader:
imgs,labels = each
writer.add_images("未池化",imgs,step)
# 用未进行线性激活的原图进行对比
imgs = sigmoid(imgs)
# 使用线性激活后的图片,线性激活并不会改变图片通道数,因此不需要改变格式
writer.add_images("池化",imgs,step)
step += 1
writer.close()
结果展示: