非线性激活在神经网络的搭建中很重要,我们可以简单的理解为非线性变化的目的就是为神经网络中引入非线性特征,这样才能训练出符合各种特征,各种曲线的模型。
一、激活函数是什么
激活函数是指在多层神经网络中,上层神经元的输出和下层神经元的输入存在一个函数关系,这个函数就是激活函数。
可以这样理解:上层神经元通过加权求和,得到输出值,然后被作用于一个激活函数,得到下一层的输入值。引入激活函数的目的是为了增加神经网络的非线性拟合能力。
二、非线性激活函数ReLU和Sigmoid的使用
1.ReLU函数
1.1 ReLU函数的官方文档
torch.nn.ReLU(inplace=False)
非常简单。其中只有一个参数。
inplace - 可以选择就地执行操作。 默认值:False,可以保留原始数据。
Shape:
Input: (*)(∗), 其中 *∗ 表示任意数量的维度。
Output: (*)(∗), 与输入的形状相同。
1.2 实例练习
代码如下:
import torch
from torch import nn
#输入数组
input = torch.tensor([[1, -2],
[-1.5, 3]])
#查看数组类型 ——> torch.Size([2, 2])
print(input.shape)
#改变尺寸 ——> torch.Size([1, 1, 2, 2])
input2 = torch.reshape(input, [-1, 1, 2, 2]) #数量N不知道,可以输入-1,根据后面可以自动推出N值
print(input2.shape)
#搭建神经网络
class Test(nn.Module):
def __init__(self):
super(Test, self).__init__()
self.input = torch.nn.ReLU()
def forward(self, x):
x = self.input(x)
return x
#创建神经网络
test = Test()
output1 = test(input)
output2 = test(input2)
print(output1)
print(output2)
输出结果:
torch.Size([2, 2])
torch.Size([1, 1, 2, 2])
tensor([[1., 0.],
[0., 3.]])
tensor([[[[1., 0.],
[0., 3.]]]])
可以发现,input任意数量的维度,都可以执行。
2.Sigmoid函数
2.1Sigmoid函数的官方文档
torch.nn.Sigmoid
Shape:
Input: (*)(∗), 其中 *∗ 表示任意数量的维度。
Output: (*)(∗), 与输入的形状相同。
非常简单,同ReLU函数一样。
Sigmoid函数是常用的连续、平滑的s型激活函数,也被称为逻辑(Logistic)函数。可以将一个实数映射到(0,1)的区间,用来做二分类。
2.2 实例练习
代码如下:
import torch.nn
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
#准备测试数据集并转为tensor类型
dataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(),
download=True)
#使用dataloder数据迭代器,为神经网络提供数据
dataloader = DataLoader(dataset, batch_size=64, drop_last=False)
#搭建神经网络
class Test(nn.Module):
def __init__(self):
super(Test, self).__init__()
self.input = torch.nn.Sigmoid()
def forward(self, x):
x = self.input(x)
return x
#此计算机网络,初始化
test = Test()
#使用tensorboard
writer = SummaryWriter("logs")
step = 0
#使用for循环,查看数据
for data in dataloader:
imgs, targets = data
writer.add_images("input", imgs, step) #查看输入数据
output = test(imgs)
writer.add_images("output", output, step)
step += 1
writer.close()