目录
一、非线性激活层
作用:
非线性变换的主要目的就是给网中加入一些非线性特征,非线性越多才能训练出符合各种特征的模型。常见的非线性激活函数有:relu、sigmond等。
二、常用非线性激活函数
2.1 Relu函数
2.1.1 函数简介
在神经网络中,激活函数负责将来自节点的加权输入转换为该输入的节点或输出的激活。
ReLU 是一个分段线性函数,如果输入为正,它将直接输出,否则,它将输出为零。它已经成为许多类型神经网络的默认激活函数,因为使用它的模型更容易训练,并且通常能够获得更好的性能。
2.1.2 inplace参数介绍
CLASS torch.nn.ReLU(inplace=False)
inplace代表是否替换/保留的意思。
- inplace = True,代表确定替换,即不保留非线性激活之前的值,会把输入值直接替换为激活后的值。
- inplace = False,代表不替换,即保留非线性激活之前的值,会把输入值保留下来,再另存一个输出值。
一般我们默认设置inplace的值为FALSE,以确保训练过程中的数据保存下来,不丢失。
2.2 Sigmoid函数
2.2.1 函数简介
Sigmoid — PyTorch 1.13 documentation
Sigmoid函数的特性与优缺点:
- Sigmoid函数的输出范围是0到1。由于输出值限定在0到1,因此它对每个神经元的输出进行了归一化。
- 用于将预测概率作为输出的模型。由于概率的取值范围是0到1,因此Sigmoid函数非常合适
- 梯度平滑,避免跳跃的输出值
- 函数是可微的。这意味着可以找到任意两个点的Sigmoid曲线的斜率
- 明确的预测,即非常接近1或0。
- 函数输出不是以0为中心的,这会降低权重更新的效率
- Sigmoid函数执行指数运算,计算机运行得较慢。
(7条消息) 机器学习中的数学——激活函数(一):Sigmoid函数_von Neumann的博客-CSDN博客_sigmoid函数计算器
2.2.2 参数介绍
使用Sigmoid类时无需参数 。
三、代码实现
3.1 relu
注意:默认的inplace参数为false,因此在ReLU类的使用中我们可以不进行inplace的设置。
import torch
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 Maweiyi(torch.nn.Module):
def __init__(self):
super(Maweiyi, self).__init__()
# inplace默认为FALSE,可以不进行设置
self.relu = ReLU()
def forward(self,input):
output = self.relu(input)
return output
maweiyi = Maweiyi()
output = maweiyi(input)
print(output)
输出:
可以看到输入的矩阵中<0的部分被替换成了0,其他的保持不变。
3.2 sigmoid
使用tensorboard可视化构建
import torch
import torchvision.datasets
from torch.nn import ReLU, Sigmoid
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
input = torch.tensor([
[1,-0.5],
[-1,3]
])
dataset = torchvision.datasets.CIFAR10(root=".\CIFAR10",train=True,transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset,batch_size=64)
input= torch.reshape(input,(-1,1,2,2))
print(input)
class Maweiyi(torch.nn.Module):
def __init__(self):
super(Maweiyi, self).__init__()
# inplace默认为FALSE,可以不进行设置
self.relu = ReLU()
#设置sigmoid激活
self.sigmoid1 = Sigmoid()
def forward(self,input):
output = self.sigmoid1(input)
return output
maweiyi = Maweiyi()
writer = SummaryWriter("logs")
step = 0
for data in dataloader:
imgs,labels = data
writer.add_images("inputs",imgs,step)
outputs = maweiyi(imgs)
writer.add_images("outputs",outputs,step)
step+=1
writer.close()
输出: