前言
在深度学习日益成为解决复杂问题重要工具的今天,PyTorch凭借其灵活性和易用性,成为了众多研究者与开发者的首选框架。本系列博客
将对torch中的nn模块中186个函数进行介绍,以函数首字母从a到z的排序开展,包含函数原理、原型和示例。
本文对nn.AdaptiveAvgPool1d、nn.AdaptiveAvgPool2d、nn.AdaptiveAvgPool3d、nn.AdaptiveLogSoftmaxWithLoss、nn.AdaptiveMaxPool1d、nn.AdaptiveMaxPool2d、nn.AdaptiveMaxPool3d、nn.AlphaDropout、nn.AvgPool1d、nn.AvgPool2d、nn.AvgPool3d、nn.BCELoss、nn.BCEWithLogitsLoss、nn.BatchNorm1d、nn.BatchNorm2d、nn.BatchNorm3d、nn.Bilinear 17个函数进行详解。
函数
nn.AdaptiveAvgPool1d
原理
AdaptiveAvgPool1d执行一维自适应平均池化,它根据指定的输出尺寸自动调整池化窗口大小,对每个池化区域内的元素取平均值。
原型
torch.nn.AdaptiveAvgPool1d(output_size)
output_size:期望的输出尺寸,可以是单个整数或整数元组(对于AdaptiveAvgPool1d,通常是单个整数)。
示例
import torch
import torch.nn as nn
# 创建一个AdaptiveAvgPool1d层,输出尺寸为5
m = nn.AdaptiveAvgPool1d(5)
input = torch.randn(1, 64, 8) # (batch_size, channels, length)
output = m(input)
print(output.shape) # torch.Size([1, 64, 5])
nn.AdaptiveAvgPool2d
原理
AdaptiveAvgPool2d执行二维自适应平均池化,适用于图像等二维数据。它根据指定的输出尺寸自动调整池化窗口大小。
原型
torch.nn.AdaptiveAvgPool2d(output_size)
output_size:期望的输出尺寸,可以是单个整数(此时高度和宽度相同)或整数元组(H, W)。
示例
import torch
import torch.nn as nn
# 创建一个AdaptiveAvgPool2d层,输出尺寸为5x7
m = nn.AdaptiveAvgPool2d((5, 7))
input = torch.randn(1, 64, 8, 9) # (batch_size, channels, height, width)
output = m(input)
print(output.shape) # torch.Size([1, 64, 5, 7])
nn.AdaptiveAvgPool3d
原理
AdaptiveAvgPool3d执行三维自适应平均池化,适用于3D图像或视频帧等三维数据。
原型
torch.nn.AdaptiveAvgPool3d(output_size)
output_size:期望的输出尺寸,可以是单个整数(此时深度、高度和宽度相同)或整数元组(D, H, W)。
示例
import torch
import torch.nn as nn
m = nn.AdaptiveAvgPool3d((2, 2, 2))
input = torch.randn(1, 1, 4, 4, 4) # (batch_size, channels, depth, height, width)
output = m(input)
print(output.shape) # torch.Size([1, 1, 2, 2, 2])
nn.AdaptiveLogSoftmaxWithLoss
原理
nn.AdaptiveLogSoftmaxWithLoss 是 PyTorch 中的一个特殊损失函数,它结合了自适应的对数 Softmax 激活和负对数似然损失(NLLLoss),专门设计用于处理具有大量类别的分类问题。这种函数在处理大规模词汇量的自然语言处理(NLP)任务时特别有用,因为它能够显著减少内存消耗并加速计算。
nn.AdaptiveLogSoftmaxWithLoss 的核心思想是将类别分成多个块(partitions),并对每个块独立地应用 Softmax 和计算损失。这样,对于每个输入,它只需要计算一小部分类别(即当前输入所属的块中的类别)的 Softmax 值,而不是整个类别集合的 Softmax 值。这大大减少了计算量和内存使用。
具体来说,该函数接受一个整数列表 cutoffs 作为参数,该列表定义了不同块之间的边界。根据这些边界,输入类别的索引被分配到不同的块中。然后,对于每个块,都会应用一个独立的线性层(或称为“头”和“尾”),并将结果传递给 Softmax 激活函数和 NLLLoss。
原型
torch.nn.AdaptiveLogSoftmaxWithLoss(in_features, n_classes, cutoffs, div_value=4.0, head_bias=None)
参数说明:
in_features:输入特征的数量。
n_classes:类别总数。
cutoffs:一个整数列表,定义了类别分块的边界。
div_value:用于调整分块内类别数的对数比例,默认为 4.0。
head_bias:可选,用于初始化头部(即第一个分块)的偏置项。
示例
import torch
import torch.nn as nn
# 假设有1000个输入特征和200个类别
in_features = 1000
n_classes = 200
# 设置cutoffs,这里简单地将类别分为几个簇
cutoffs = [20, 100, 150]
# 初始化AdaptiveLogSoftmaxWithLoss
adaptive_softmax = nn.AdaptiveLogSoftmaxWithLoss(in_features, n_classes, cutoffs)
# 创建一个随机批次的输入数据
batch_size = 15
input = torch.randn(batch_size, in_features)
# 生成目标类别索引
target = torch.randint(n_classes, (batch_size,), dtype=torch.long)
# 计算损失
loss_output = adaptive_softmax(input, target)
loss = loss_output.loss # 获取损失值 Tensor
print("Loss:", loss.item())
nn.AdaptiveMaxPool1、2、3d
本部分为了更直观的对比 nn.AdaptiveMaxPool1d、 nn.AdaptiveMaxPooll2d和 nn.AdaptiveMaxPool3d三个函数,将其放在一起进行详解和示例。
原理
自适应最大池化(Adaptive Max