“激活”一词来源于生物学神经系统,在人的大脑中,存在着大量的神经元。每个神经元在接收到足够强的刺激时,会被激活,产生电信号并传递给其他神经元。这些电信号在神经网络中层层流动,最终形成了大脑对外界信息的反应。
神经元就等同于人工神经网络中的基本计算单元,每一个网络层都包含着许多这样的神经元,激活函数就是为了能够判断输入是否达到“激活”标准,达到激活标准,则会影响后续计算,反之,则不会
再来说非线性,非线性的目的是为了能够让模型学会复杂的、非线性的关系,如果没有非线性激活函数,模型永远“长不大”。
了解了这些,我们就可以来看官方文档了,官方文档中有很多非线性激活函数:
今天学习其中的两个nn.Relu和nn.Sigmoid
nn.Relu,全名是 Rectified Linear Unit(线性整流函数),是 PyTorch 中使用最广泛的非线性激活函数之一。他的作用就是将输入中小于0的元素变成0(未激活),大于0则保持不变(激活)
参数:
代码能够帮我们更加深入的理解
import torch
from torch import nn
input1 = torch.tensor([[5, 25, -5, -25],
[0.5, 2.5, -0.5, -2.5]])
class ReluModel(nn.Module):
def __init__(self):
super(ReluModel, self).__init__()
self.relu = nn.ReLU(inplace=True)
def forward(self, x):
output = self.relu(x)
return output
remodel = ReluModel()
output = remodel(input1)
print(input1)
print(output)
输出结果:
分析:
将inplace改为false,再运行一下,结果如下:
这里为什么会显示4位小数呢?
因为PyTorch 默认显示小数点后 4 位,是为了统一格式和方便调试。这么做只是为了显示精度,并不影响实际计算和数据精度。
nn.Sigmoid,全名是 Logistic Sigmoid,他的作用是把输入的任意实数映射到(0,1)之间,即:非1即0,常用于二分类任务,比如:这张图像是不是猫?这段话是不是英文?
这个激活函数不需要参数
跑一下代码:
import torch
from torch import nn
input1 = torch.tensor([[5, 25, -5, -25],
[0.5, 2.5, -0.5, -2.5]])
class SigmoidModel(nn.Module):
def __init__(self):
super(SigmoidModel, self).__init__()
self.sigmoid = nn.Sigmoid()
def forward(self, x):
output = self.sigmoid(x)
return output
remodel = SigmoidModel()
output = remodel(input1)
print(output)
结果:
展示的时候用了科学计数法,第一组数据约为:0.9933,1.0,0.0067,1.38*10^-11(最接近0)
第二组数据约为:0.6225,0.9241,0.3775,0.0759
拜拜