深入理解 PyTorch 激活函数:从基础到高效实用技巧(4)

发布时间:2024年01月16日

目录

torch.nn.functional激活层详解

tanh

1. 函数用途

2. 参数详解

3. Tanh函数的定义及数学解释

4. 使用示例

sigmoid

1. 函数用途

2. 参数详解

3. Sigmoid函数的定义及数学解释

4. 使用示例

hardsigmoid

1. 函数用途

2. 参数详解

3. Hardsigmoid函数的定义及数学解释

4. 使用示例

silu

1. 函数用途

2. 参数详解

3. SiLU函数的定义及数学解释

4. 使用示例

mish

1. 函数用途

2. 参数详解

3. Mish函数的定义及数学解释

4. 使用示例

batch_norm

1. 函数用途

2. 参数详解

3. Batch Normalization的工作原理

4. 使用示例

group_norm

1. 函数用途

2. 参数详解

3. 工作原理

4. 使用示例

instance_norm

1. 函数用途

2. 参数详解

3. 工作原理

4. 使用示例

layer_norm

1. 函数用途

2. 参数详解

3. 工作原理

4. 使用示例

local_response_norm

1. 函数用途

2. 参数详解

3. 工作原理

4. 使用示例

normalize

1. 函数用途

2. 参数详解

3. 工作原理

4. 使用示例

总结?


torch.nn.functional激活层详解

tanh

torch.nn.functional.tanh 是 PyTorch 框架中的一个函数,用于逐元素应用双曲正切(Tanh)激活函数。

1. 函数用途

Tanh 函数是深度学习中常用的非线性激活函数之一。它将输入值压缩到 (-1, 1) 的范围内,对于中心化数据特别有效。Tanh 函数在处理数据时提供平滑的过渡,常用于隐藏层的激活函数。

2. 参数详解

  • input(Tensor):输入的张量。

3. Tanh函数的定义及数学解释

Tanh 激活函数的数学表达式是:

  • Tanh(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x))

这个公式表示输入值的指数减去其负指数,然后除以这两个指数的和。结果是一个在 -1 和 1 之间的输出,提供了一个平滑的非线性变换。

4. 使用示例

import torch
import torch.nn.functional as F

# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])

# 应用Tanh激活函数
output_tensor = F.tanh(input_tensor)

# 输出结果
print("原始张量:", input_tensor)
print("Tanh处理后的张量:", output_tensor)

在这个示例中,Tanh 函数将输入张量的每个元素转换为介于 -1 和 1 之间的值。Tanh 函数由于其平滑和中心化的特性,适用于多种深度学习模型中,特别是在需要平衡激活值范围的隐藏层中。

sigmoid

torch.nn.functional.sigmoid 是 PyTorch 框架中的一个函数,用于逐元素应用 Sigmoid 激活函数。

1. 函数用途

Sigmoid 函数是一种广泛使用的非线性激活函数,它将输入值压缩到 (0, 1) 的范围内。这使得它特别适用于将输出解释为概率,例如在二元分类问题中。Sigmoid 函数因其 S 形曲线而得名,常用于神经网络的输出层。

2. 参数详解

  • input(Tensor):输入的张量。

3. Sigmoid函数的定义及数学解释

Sigmoid 激活函数的数学表达式是:

  • Sigmoid(x) = 1 / (1 + exp(-x))

这个公式表示计算输入值的负指数,加 1 后取其倒数。结果是一个在 0 和 1 之间的输出,提供了平滑的非线性变换。

4. 使用示例

import torch
import torch.nn.functional as F

# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])

# 应用Sigmoid激活函数
output_tensor = F.sigmoid(input_tensor)

# 输出结果
print("原始张量:", input_tensor)
print("Sigmoid处理后的张量:", output_tensor)
# 输出将是:
# 原始张量: tensor([-2.0000,  0.0000,  2.0000])
# Sigmoid处理后的张量: tensor([0.1192, 0.5000, 0.8808])

在这个示例中,Sigmoid 函数将输入张量的每个元素转换为介于 0 和 1 之间的值。?

hardsigmoid

torch.nn.functional.hardsigmoid 是 PyTorch 框架中的一个函数,用于逐元素应用 Hardsigmoid 激活函数。

1. 函数用途

Hardsigmoid 函数是 Sigmoid 激活函数的分段线性近似。与传统的 Sigmoid 相比,Hardsigmoid 提供了计算上更简单和更快的版本,尤其适用于需要提高运算效率的场景,例如在硬件加速环境中。

2. 参数详解

  • input(Tensor):输入的张量。
  • inplace(bool):如果设置为 True,则会在原地进行操作,不会创建新的张量。默认为 False。

3. Hardsigmoid函数的定义及数学解释

Hardsigmoid 激活函数的数学表达式是:

  • 如果 x ≤ -3,则 Hardsigmoid(x) = 0
  • 如果 x ≥ +3,则 Hardsigmoid(x) = 1
  • 否则,Hardsigmoid(x) = x / 6 + 1 / 2

这个公式将输入值分为三个区域:小于等于 -3 的区域输出为 0,大于等于 +3 的区域输出为 1,介于这两者之间的区域输出为 x / 6 + 1 / 2

4. 使用示例

import torch
import torch.nn.functional as F

# 创建一个示例张量
input_tensor = torch.tensor([-4.0, -2.0, 0.0, 2.0, 4.0])

# 应用Hardsigmoid激活函数
output_tensor = F.hardsigmoid(input_tensor)

# 输出结果
print("原始张量:", input_tensor)
print("Hardsigmoid处理后的张量:", output_tensor)
# 输出将是:
# 原始张量: tensor([-4.0000, -2.0000,  0.0000,  2.0000,  4.0000])
# Hardsigmoid处理后的张量: tensor([0.0000, 0.1667, 0.5000, 0.8333, 1.0000])

silu

torch.nn.functional.silu 是 PyTorch 框架中的一个函数,用于按元素应用 Sigmoid Linear Unit(SiLU)函数,该函数也被称为 swish 函数。

1. 函数用途

SiLU 激活函数是深度学习中的一种创新激活函数,结合了 Sigmoid 函数的门控特性和线性单元的优势。它通过自我门控机制,使得网络能够自适应地调整信息的传递,从而改善学习性能。

2. 参数详解

  • input(Tensor):输入的张量。
  • inplace(bool,默认为 False):如果设置为 True,则会在原地进行操作,不会创建新的张量。

3. SiLU函数的定义及数学解释

SiLU 激活函数的数学表达式是:

  • silu(x) = x * σ(x)

其中 σ(x) 是逻辑 Sigmoid 函数。这意味着每个输入值 x 被它自己的 Sigmoid 函数输出所缩放。

4. 使用示例

import torch
import torch.nn.functional as F

# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])

# 应用SiLU激活函数
output_tensor = F.silu(input_tensor)

# 输出结果
print("原始张量:", input_tensor)
print("SiLU处理后的张量:", output_tensor)

## 原始张量: tensor([-2.0000,  0.0000,  2.0000])
## SiLU处理后的张量: tensor([-0.2384,  0.0000,  1.7616])

在这个示例中,SiLU 函数将输入张量的每个元素转换为其 Sigmoid 缩放的值。SiLU 函数由于其自适应和平滑的特性,适用于各种深度学习模型,尤其是在需要复杂非线性激活功能的场合。

mish

torch.nn.functional.mish 是 PyTorch 框架中的一个函数,用于按元素应用 Mish 激活函数。

1. 函数用途

Mish 函数是一种非线性激活函数,用于深度学习模型中。它被设计为自我调节的非单调神经激活函数,提供了优秀的性能并帮助提升模型的学习能力。Mish 函数特别适用于深度卷积神经网络和其他需要复杂非线性激活的场景。

2. 参数详解

  • input(Tensor):输入的张量。
  • inplace(bool,默认为 False):如果设置为 True,则会在原地进行操作,不会创建新的张量。

3. Mish函数的定义及数学解释

Mish 激活函数的数学表达式是:

  • Mish(x) = x * Tanh(Softplus(x))

这个公式结合了 Tanh 和 Softplus 函数的特点,其中 Softplus 函数为 Softplus(x) = log(1 + exp(x))。Mish 函数通过将输入值与其 Softplus 的 Tanh 值相乘,实现了一种有效的非线性变换。

4. 使用示例

import torch
import torch.nn.functional as F

# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])

# 应用Mish激活函数
output_tensor = F.mish(input_tensor)

# 输出结果
print("原始张量:", input_tensor)
print("Mish处理后的张量:", output_tensor)

在这个示例中,Mish 函数为输入张量的每个元素提供了平滑且有效的非线性激活。Mish 函数由于其自适应和高性能的特性,适用于各种深度学习模型,尤其是在需要强大的非线性激活功能的场合。

batch_norm

torch.nn.functional.batch_norm 是 PyTorch 框架中的一个函数,用于对一批数据中的每个通道应用批量归一化(Batch Normalization)。

1. 函数用途

批量归一化是一种广泛应用于深度学习模型中的技术,旨在提高训练速度、稳定性并减少对初始化的依赖。通过规范化每个特征通道的输入分布,它有助于防止内部协变量偏移(Internal Covariate Shift),从而改善模型的训练效果和泛化能力。

2. 参数详解

  • input(Tensor):输入的张量。
  • running_mean(Tensor):用于计算均值的张量。
  • running_var(Tensor):用于计算方差的张量。
  • weight(Tensor,可选):可学习的缩放系数。
  • bias(Tensor,可选):可学习的偏移量。
  • training(bool):指示模型是否在训练状态;为 True 时,会使用 running_meanrunning_var 计算的均值和方差,为 False 时,会使用输入数据的均值和方差。
  • momentum(float):用于更新 running_meanrunning_var 的动量。
  • eps(float):用于避免除以零,加到方差中的小值。

3. Batch Normalization的工作原理

批量归一化通过以下步骤对输入数据进行归一化处理:

  • 计算一批数据的均值和方差。
  • 使用均值和方差对数据进行归一化。
  • 使用可学习的参数对归一化后的数据进行缩放和偏移。

这种处理方式有助于确保网络中每层的输入分布保持相对稳定,减少了层数增加带来的训练困难。

4. 使用示例

import torch
import torch.nn.functional as F

# 创建一个示例张量
input_tensor = torch.randn(2, 3) # 假设有2个样本,每个样本3个特征
running_mean = torch.zeros(3)
running_var = torch.ones(3)

# 应用Batch Normalization
output_tensor = F.batch_norm(input_tensor, running_mean, running_var, training=True)

# 输出结果
print("原始张量:", input_tensor)
print("Batch Normalization处理后的张量:", output_tensor)

输出将展示批量归一化处理后的张量,其中每个特征通道的均值和方差都被规范化。批量归一化在提高模型训练速度和稳定性方面发挥着关键作用,是现代深度神经网络中不可或缺的组件之一。

group_norm

torch.nn.functional.group_norm 是 PyTorch 框架中的一个函数,用于对输入的最后几个维度应用组归一化(Group Normalization)。

1. 函数用途

组归一化是一种在神经网络中常用的规范化技术,特别是当批量大小很小或者不稳定时。不同于批量归一化(Batch Normalization)对整个批量数据进行归一化,组归一化将输入的通道分为多个组,并对每个组内的特征进行归一化。这使得组归一化在训练过程中更加稳定,且对批量大小不敏感。

2. 参数详解

  • input(Tensor):输入的张量。
  • num_groups(int):要划分的组数。
  • weight(Tensor,可选):可学习的缩放系数。
  • bias(Tensor,可选):可学习的偏移量。
  • eps(float):用于避免除以零,加到方差中的小值。

3. 工作原理

组归一化通过以下步骤工作:

  • 将输入的通道分为指定数量的组。
  • 计算每个组内的均值和方差。
  • 使用这些统计数据对每个组内的数据进行归一化。
  • 可选地应用缩放和偏移变换。

4. 使用示例

import torch
import torch.nn.functional as F

# 创建一个示例张量
input_tensor = torch.randn(2, 6) # 假设有2个样本,每个样本6个通道
num_groups = 2

# 应用Group Normalization
output_tensor = F.group_norm(input_tensor, num_groups)

# 输出结果
print("原始张量:", input_tensor)
print("Group Normalization处理后的张量:", output_tensor)

instance_norm

torch.nn.functional.instance_norm 是 PyTorch 框架中的一个函数,用于对每个数据样本中的每个通道应用实例归一化(Instance Normalization)。

1. 函数用途

实例归一化是一种在深度学习中常用的规范化技术,特别是在样式转换和生成对抗网络(GANs)中。与批量归一化(Batch Normalization)和组归一化(Group Normalization)不同,实例归一化是在单个样本的每个通道上独立进行的,使得其特别适用于处理样式化任务和非稳定数据。

2. 参数详解

  • input(Tensor):输入的张量。
  • running_mean(Tensor,可选):用于计算均值的张量。
  • running_var(Tensor,可选):用于计算方差的张量。
  • weight(Tensor,可选):可学习的缩放系数。
  • bias(Tensor,可选):可学习的偏移量。
  • use_input_stats(bool):是否使用输入数据的统计信息。当为 True 时,使用输入数据的均值和方差;为 False 时,使用 running_meanrunning_var
  • momentum(float):用于更新 running_meanrunning_var 的动量。
  • eps(float):用于避免除以零,加到方差中的小值。

3. 工作原理

实例归一化通过以下步骤对输入数据进行归一化处理:

  • 独立地计算每个样本的每个通道的均值和方差。
  • 使用这些统计数据对每个通道进行归一化。
  • 可选地应用缩放和偏移变换。

这种处理方式有助于确保网络在处理不同样本时具有更强的鲁棒性,尤其是在样式化和图像生成的应用中。

4. 使用示例

import torch
import torch.nn.functional as F

# 创建一个示例张量
input_tensor = torch.randn(2, 3, 5, 5) # 假设有2个样本,每个样本3个通道,大小为5x5
running_mean = None
running_var = None
weight = None
bias = None

# 应用Instance Normalization
output_tensor = F.instance_norm(input_tensor, running_mean, running_var, weight, bias, use_input_stats=True)

# 输出结果
print("原始张量:", input_tensor)
print("Instance Normalization处理后的张量:", output_tensor)

?在这个示例中,输入张量的每个通道都独立进行了实例归一化处理。实例归一化特别适用于需要独立处理每个样本特征的深度学习模型,例如在图像风格化和高级图像处理中。

layer_norm

torch.nn.functional.layer_norm 是 PyTorch 框架中的一个函数,用于对输入的最后几个维度进行层归一化(Layer Normalization)。

1. 函数用途

层归一化是一种在深度学习中常用的规范化技术,特别适用于循环神经网络(RNNs)和自注意力模型(如 Transformer)。与批量归一化不同,层归一化不是对批次的每个通道进行归一化,而是在单个样本的特定层内进行归一化。这有助于稳定训练过程,并减少批次大小对模型性能的影响。

2. 参数详解

  • input(Tensor):输入的张量。
  • normalized_shape:要归一化的输入形状的最后几个维度。
  • weight(Tensor,可选):可学习的缩放系数。
  • bias(Tensor,可选):可学习的偏移量。
  • eps(float):用于避免除以零,加到方差中的小值。

3. 工作原理

层归一化通过以下步骤工作:

  • 在单个样本的特定层(或几个维度)内独立计算均值和方差。
  • 使用这些统计数据对该层进行归一化。
  • 可选地应用缩放和偏移变换。

4. 使用示例

import torch
import torch.nn.functional as F

# 创建一个示例张量
input_tensor = torch.randn(2, 5, 10) # 假设有2个样本,每个样本5个特征,每个特征10个元素
normalized_shape = (5, 10)

# 应用Layer Normalization
output_tensor = F.layer_norm(input_tensor, normalized_shape)

# 输出结果
print("原始张量:", input_tensor)
print("Layer Normalization处理后的张量:", output_tensor)

local_response_norm

torch.nn.functional.local_response_norm 是 PyTorch 框架中的一个函数,用于对多个输入平面组成的输入信号应用局部响应归一化(Local Response Normalization, LRN)。这种归一化是在通道维度上进行的。

1. 函数用途

局部响应归一化是一种在卷积神经网络中常用的规范化技术,特别是在图像处理和计算机视觉任务中。LRN 通过归一化一个局部区域内的响应来增强模型对高频特征的响应,从而模仿生物神经系统中的侧抑制现象。

2. 参数详解

  • input(Tensor):输入的张量。
  • size(int):归一化窗口的大小。
  • alpha(float,默认为0.0001):乘法项的系数。
  • beta(float,默认为0.75):指数项的系数。
  • k(float,默认为1.0):加法项的常数。

3. 工作原理

局部响应归一化在指定的通道窗口范围内工作,通过以下步骤进行归一化处理:

  • 对于每个位置,考虑当前通道及其相邻的 size 个通道。
  • 计算这些通道上的平方和,并乘以一个缩放系数 alpha
  • 将这个和加上常数 k,然后取其 beta 次幂。
  • 使用这个计算得到的值来缩放当前位置的原始响应值。

4. 使用示例

import torch
import torch.nn.functional as F

# 创建一个示例张量
input_tensor = torch.randn(1, 5, 10, 10) # 假设有1个样本,5个通道,每个通道10x10大小

# 应用Local Response Normalization
output_tensor = F.local_response_norm(input_tensor, size=5)

# 输出结果
print("原始张量:", input_tensor)
print("Local Response Normalization处理后的张量:", output_tensor)

在这个示例中,输入张量的每个通道及其相邻通道被用于计算局部响应归一化。?

normalize

torch.nn.functional.normalize 是 PyTorch 框架中的一个函数,用于对输入进行 归一化,即按指定维度对输入执行归一化处理。

1. 函数用途

此函数对输入张量的指定维度进行归一化。归一化是深度学习中常用的数据预处理步骤,它可以改善模型的训练效率和泛化性能。通过归一化,可以确保不同特征或数据点在数值范围和重要性上处于同一水平,从而有助于优化过程。

2. 参数详解

  • input(Tensor):任何形状的输入张量。
  • p(float):范数公式中的指数值,默认为 2,即欧几里得范数。
  • dim(int 或 int元组):要归一化的维度,默认为 1。
  • eps(float):避免除零的小值,默认为 1e-12。
  • out(Tensor,可选):输出张量。如果使用 out,则此操作将不可微分。

3. 工作原理

对于形状为(n_{0},...,n_{dim},...,n_{k})?的输入张量,沿维度 dim 的每个n_{dim} 元素向量 V 被转换为:

V=\frac{V}{max(||V||_{p},\varepsilon )}?默认情况下,它使用维度 1 上的向量的欧几里得范数进行归一化。

4. 使用示例

import torch
import torch.nn.functional as F

# 创建一个示例张量
input_tensor = torch.randn(4, 3)

# 应用L2归一化
output_tensor = F.normalize(input_tensor, p=2.0, dim=1)

# 输出结果
print("原始张量:", input_tensor)
print("归一化处理后的张量:", output_tensor)

在这个示例中,输入张量的每一行(维度 1 的每个向量)都被归一化,使得每行向量的欧几里得范数为 1。这种归一化技术在数据预处理和特征向量的规范化中非常有用。?

总结?

在这篇博客中,我们探讨了 PyTorch 框架中的多种激活和规范化函数,包括 Tanh、Sigmoid、Hardsigmoid、SiLU、Mish、批量归一化(Batch Norm)、组归一化(Group Norm)、实例归一化(Instance Norm)、层归一化(Layer Norm)、局部响应归一化(Local Response Norm)和标准化(Normalize)。每种函数都具有特定的应用场景和优势,例如 Tanh 和 Sigmoid 适用于平滑激活,Hardsigmoid 为高效计算提供了选项,而 SiLU 和 Mish 则提供复杂的非线性激活。批量归一化、组归一化和实例归一化等规范化技术有助于改善模型的训练效率和泛化性能,特别适合于深度学习模型。通过这些函数的合理应用,可以显著提升神经网络的性能和稳定性。?

文章来源:https://blog.csdn.net/qq_42452134/article/details/135617990
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。