在本文中,我们将了解 PyTorch 激活函数。
目录
什么是激活函数以及为什么使用它们?
Pytorch 激活函数的类型
ReLU 激活函数:
Python3
Leaky ReLU 激活函数:
Python3
S 形激活函数:
Python3
Tanh 激活函数:
Python3
Softmax 激活函数:
Python3
激活函数是 Pytorch 的构建块。在讨论激活函数的类型之前,让我们首先了解人脑中神经元的工作原理。在人工神经网络中,我们有一个输入层,它是用户以某种格式输入的输入,一个隐藏层,它执行隐藏计算并识别特征,输出就是结果。所以整个结构就像一个神经元相互连接的网络。所以我们有由这些激活函数激活的人工神经元。激活函数是执行计算以提供可以充当下一个神经元的输入的输出的函数。理想的激活函数应该利用线性概念来处理非线性关系,并且应该是可微的,以减少误差并相应地调整权重。所有激活函数都存在于 torch.nn 库中。
让我们看看不同的 Pytorch 激活函数:
ReLU 代表修正线性激活函数。它是一个非线性函数,从图形上看 ReLU 具有以下变换行为:
ReLU 是一种流行的激活函数,因为它是可微分和非线性的。如果输入为负,则其导数变为零,这会导致神经元“死亡”并且学习不会发生。让我们借助 Python 程序来说明 ReLU 的使用。
import torch
import torch.nn as nn
# 定义ReLU激活函数
r = nn.ReLU()
# 创建一个包含数组的Tensor
input = torch.Tensor([1, -2, 3, -5])
# 将数组传递给ReLU激活函数
output = r(input)
print(output)
这段代码执行以下操作:
导入PyTorch库,并导入神经网络模块
torch.nn
。使用
nn.ReLU()
创建ReLU激活函数的实例,命名为r
。创建一个包含数组的PyTorch Tensor,名为
input
。将该数组传递给ReLU激活函数,通过
r(input)
得到输出output
。打印输出结果。
ReLU激活函数对输入进行逐元素操作,将负值置零,保留正值。这有助于引入非线性性质,使神经网络能够学习更复杂的函数。
输出:
tensor([1., 0., 3., 0.])
输出的Tensor包含了ReLU激活函数作用后的结果,其中负值变为零,正值保持不变。
Leaky ReLU 激活函数或 LReLU 是另一种类型的激活函数,与 ReLU 类似,但解决了“死亡”神经元的问题,并且从图形上看,Leaky ReLU 具有以下转换行为:
该函数非常有用,因为当输入为负时,函数的微分不为零。因此神经元的学习不会停止。让我们借助 Python 程序来说明 LReLU 的使用。
import torch
import torch.nn as nn
# 定义LeakyReLU激活函数,参数0.2控制负斜率;a=0.2
r = nn.LeakyReLU(0.2)
# 创建一个包含数组的Tensor
input = torch.Tensor([1, -2, 3, -5])
# 将数组传递给LeakyReLU激活函数
output = r(input)
print(output)
这段代码执行以下操作:
导入PyTorch库,并导入神经网络模块
torch.nn
。使用
nn.LeakyReLU(0.2)
创建LeakyReLU激活函数的实例,其中参数0.2
控制负斜率。创建一个包含数组的PyTorch Tensor,名为
input
。将该数组传递给LeakyReLU激活函数,通过
r(input)
得到输出output
。打印输出结果。
LeakyReLU激活函数允许负值有一个小的斜率,而不是直接置零,以引入一定程度的非线性性。这对于训练某些类型的神经网络可能会更有利。
输出:
tensor([ 1.0000, -0.4000, 3.0000, -1.0000])
输出的Tensor包含了LeakyReLU激活函数作用后的结果,其中负值具有小的斜率,正值保持不变。在这个例子中,参数
0.2
控制了负值的斜率。
Sigmoid 函数是一种非线性且可微的激活函数。它是一条不经过原点的S形曲线。它产生介于 0 和 1 之间的输出。输出值通常被视为概率。它通常用于二元分类。它的计算速度很慢,并且从图形上看,Sigmoid 具有以下转换行为:
Sigmoid激活函数存在“梯度消失”的问题。梯度消失是一个重要的问题,因为大量输入被输入神经网络,并且隐藏层数量增加,梯度或导数变得接近于零,从而导致神经网络不准确。
让我们借助 Python 程序来说明 Sigmoid 函数的使用。
import torch
import torch.nn as nn
# 调用Sigmoid激活函数
sig = nn.Sigmoid()
# 定义一个包含数组的Tensor
input = torch.Tensor([1, -2, 3, -5])
# 将数组传递给Sigmoid激活函数
output = sig(input)
print(output)
这段代码执行以下操作:
导入PyTorch库,并导入神经网络模块
torch.nn
。使用
nn.Sigmoid()
调用Sigmoid激活函数的实例,命名为sig
。定义一个包含数组的PyTorch Tensor,名为
input
。将该数组传递给Sigmoid激活函数,通过
sig(input)
得到输出output
。打印输出结果。
Sigmoid激活函数将输入的每个元素压缩到 (0, 1) 范围内,常用于二分类问题中的输出层。在这个例子中,输入数组经过Sigmoid激活函数后,输出的Tensor包含了每个元素的Sigmoid变换结果。
输出:
tensor([0.7311, 0.1192, 0.9526, 0.0067])
在这段代码中,
input
是包含数字[1, -2, 3, -5]
的Tensor。然后,通过sig(input)
将这个Tensor传递给Sigmoid激活函数,并将结果存储在output
中。最后,你打印输出output
。运行这段代码后,你会看到Sigmoid激活函数应用于输入数组,输出对应的Sigmoid函数值。 Sigmoid函数的输出范围在0到1之间。
Tanh 函数是一种类似于 sigmoid 函数的非线性可微函数,但输出值范围为 -1 到 +1。它是一条穿过原点的 S 形曲线,从图形上看,Tanh 具有以下变换行为:
Tanh 激活函数的问题是速度慢并且梯度消失问题仍然存在。让我们借助 Python 程序来说明 Tanh 函数的使用。
import torch
import torch.nn as nn
# 调用Tanh激活函数
t = nn.Tanh()
# 定义一个包含数字的Tensor
input = torch.Tensor([1, -2, 3, -5])
# 将数组传递给Tanh激活函数
output = t(input)
# 打印输出结果
print(output)
输出:
tensor([ 0.7616, -0.9640, 0.9951, -0.9999])
解释:这段代码使用PyTorch库创建了一个包含Tanh激活函数的神经网络模块。定义了一个包含数字
[1, -2, 3, -5]
的Tensor,然后通过output = t(input)
将这个Tensor传递给Tanh激活函数。最后,打印输出了Tanh函数应用于输入数组后的结果。Tanh函数的输出范围在-1到1之间。
softmax 函数与其他激活函数不同,因为它被放置在最后以标准化输出。我们可以将其他激活函数与 Softmax 结合使用来产生概率形式的输出。它用于多类分类,生成总和为 1 的概率输出。输出范围在 0 到 1 之间。Softmax 具有以下变换行为:
让我们借助 Python 程序进行说明:
import torch
import torch.nn as nn
# 调用维度为0的Softmax函数
sm = nn.Softmax(dim=0)
# 定义一个包含数字的Tensor
input = torch.Tensor([1, -2, 3, -5])
# 将数组传递给Softmax函数
output = sm(input)
# 打印输出结果
print(output)
输出:
tensor([0.8378, 0.0351, 0.9459, 0.0001])
解释:这段代码使用PyTorch库创建了一个包含维度为0的Softmax函数的神经网络模块。定义了一个包含数字
[1, -2, 3, -5]
的Tensor,然后通过output = sm(input)
将这个Tensor传递给Softmax函数。最后,打印输出了Softmax函数应用于输入数组后的结果。Softmax函数将输入的每个元素转换为表示概率的值,使得所有输出的总和为1。