【Python】torch.nn模块中函数详解和示例(一)

前言

在深度学习日益成为解决复杂问题重要工具的今天,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木彳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值