非线性介绍
非线性变换的主要目的就是给网中加入一些非线性特征,非线性越多才能训练出符合各种特征的模型。常见的非线性激活:
ReLU:
* 表示输入的形状可以任意
在进行网络初始化时,发现ReLU有一个参数inplace:
input = -1 ReLU(input, inplace=True) input = 0 input = -1 output = ReLU(input, inplace = False) input = -1 output = 0#inplace为真时,将处理后的结果赋值给原来的参数;为假时,原值不会改变。
SIGMOID:
代码验证
数值验证
以relu为例,观察图像可以知道,小于0的部分经过处理后输出为0:
import torch
from torch import nn
#初始化数据
input = torch.tensor([[1, -1],
[5, -7]])
#定义网络
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.relu1 = nn.ReLU()
def forward(self, input):
return self.relu1(input)
#进行数值处理
model = Model()
print(model(input))
输出结果为:
tensor([[1, 0],
[5, 0]])
图片验证
relu对图片处理结果不是很明显,这里采用sigmoid进行处理:
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
dataset = torchvision.datasets.CIFAR10("./dataset", False, torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset, 64)
#定义网络
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.sigmoid = nn.Sigmoid()
def forward(self, input):
return self.sigmoid(input)
model = Model()
writer = SummaryWriter("logs")
step = 0
for data in dataloader:
imgs, targets = data
writer.add_images("inputs", imgs, step)
writer.add_images("outputs", model(imgs), step)
step += 1
writer.close()
打开Tensorboard查看: