【Pytorch】9.torch.nn.MaxPool2d

什么是MaxPool2d

是对二维矩阵进行池化层下采样的方法

MaxPool2d的用法

在这里插入图片描述
在这里插入图片描述
相较于卷积层,多出来的参数为ceil_mode
这个参数代表,如果所剩的部分不够卷积核的大小,要不要进行池化操作

具体代码为

import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10(ro
<think>我们正在讨论的是`torch.nn.MaxPool2d`的返回值类型和结构。根据用户提供的引用片段,我们知道`torch.nn.MaxPool2d`是一个类,它的`forward`方法调用了`F.max_pool2d`函数,并返回一个张量(Tensor)。下面将详细说明。 ### 1. **返回值类型** - **数据类型**: `torch.Tensor` - **设备位置**: 与输入张量相同(CPU或GPU) - **梯度属性**: 可自动参与反向传播(若输入张量`requires_grad=True`) ### 2. **返回值结构(形状)** 输出张量形状为: $$(N, C, H_{\text{out}}, W_{\text{out}})$$ | 维度 | 说明 | 计算公式 | |------|------|----------| | $N$ | Batch size(批大小) | 与输入张量第一维相同 | | $C$ | 通道数 | 与输入张量通道数相同(池化不改变通道数) | | $H_{\text{out}}$ | 输出特征图高度 | $$H_{\text{out}} = \left\lfloor \frac{H_{\text{in}} + 2 \times \text{padding}[0] - \text{dilation}[0] \times (\text{kernel\_size}[0] - 1) - 1}{\text{stride}[0]} + 1 \right\rfloor$$ | | $W_{\text{out}}$ | 输出特征图宽度 | $$W_{\text{out}} = \left\lfloor \frac{W_{\text{in}} + 2 \times \text{padding}[1] - \text{dilation}[1] \times (\text{kernel\_size}[1] - 1) - 1}{\text{stride}[1]} + 1 \right\rfloor$$ | 注意:最大池化操作不改变通道数,因此输出通道数$C$与输入通道数相同。 ### 3. **示例代码验证** ```python import torch import torch.nn as nn # 输入张量: [batch=2, channels=3, height=32, width=32] input_tensor = torch.randn(2, 3, 32, 32) # 最大池化层: 池化核大小为2x2, 步长为2 maxpool = nn.MaxPool2d(kernel_size=2, stride=2) # 前向传播 output = maxpool(input_tensor) print("输出类型:", type(output)) # <class &#39;torch.Tensor&#39;> print("输出形状:", output.shape) # torch.Size([2, 3, 16, 16]) print("梯度属性:", output.requires_grad) # True (若输入有梯度) ``` ### 4. **关键特性说明** 1. **通道不变性** 最大池化操作在每一个通道上独立进行,因此输出通道数$C$与输入通道数相同。 2. **空间下采样** 输出尺寸$H_{\text{out}} \times W_{\text{out}}$通常小于输入尺寸(除非`stride=1`且`kernel_size=1`),这是池化操作的主要目的:减少空间尺寸,降低计算量。 3. **梯度传播** 当输入张量启用梯度时,输出张量会自动加入计算图。在反向传播过程中,梯度仅通过最大值位置传播(其他位置梯度为0)[^1]。 ### 5. **与 `nn.functional.max_pool2d` 的区别** | 特性 | `nn.MaxPool2d` | `nn.functional.max_pool2d` | |------|-------------|------------------------| | 返回值 | 张量 | 张量 | | 封装级别 | 高级封装(类) | 低级函数 | | 参数管理 | 类属性维护 | 需手动传入参数 | | 额外功能 | 支持`return_indices`(用于上采样) | 支持`return_indices` | ```python # 两种实现对比 maxpool_layer = nn.MaxPool2d(kernel_size=2, stride=2) # 类形式 output1 = maxpool_layer(input_tensor) # 函数形式 output2 = F.max_pool2d(input_tensor, kernel_size=2, stride=2) ``` §§相关问题§§ 1. 最大池化操作如何影响梯度反向传播? 2. 如何计算最大池化层输出特征图的精确尺寸? 3. `return_indices`参数的作用是什么? 4. 最大池化与平均池化在输出结构和梯度传播上有何区别? 5. 池化层在卷积神经网络中的主要作用是什么?[^1][^2] [^1]: PyTorch 官方文档: [torch.nn.MaxPool2d](https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html) [^2]: PyTorch 官方文档: [torch.nn.functional.max_pool2d](https://pytorch.org/docs/stable/generated/torch.nn.functional.max_pool2d.html)</think>### `torch.nn.MaxPool2d` 返回值详解 `torpool2d` 的返回值是一个**四维张量**(`torch.Tensor`),其结构和特性如下: #### 1. **返回值类型** - **数据类型**:`torch.Tensor` - **设备位置**:与输入张量相同(CPU 或 GPU) - **梯度属性**:可自动参与反向传播(若输入张量 `requires_grad=True`) - **特殊特性**:梯度仅通过最大值位置传播(其他位置梯度为 0)[^1] #### 2. **返回值结构(形状)** 输出张量形状为: $$(N, C, H_{\text{out}}, W_{\text{out}})$$ | 维度 | 说明 | 计算公式 | |------|------|----------| | $N$ | Batch size(批大小) | 与输入张量第一维相同 | | $C$ | 通道数 | 与输入通道数相同(池化不改变通道数) | | $H_{\text{out}}$ | 输出特征图高度 | $$H_{\text{out}} = \left\lfloor \frac{H_{\text{in}} + 2 \times \text{padding} - \text{dilation} \times (\text{kernel\_size} - 1) - 1}{\text{stride}} + 1 \right\rfloor$$ | | $W_{\text{out}}$ | 输出特征图宽度 | 同上公式(宽度维度计算方式相同) | #### 3. **示例代码验证 ```python import torch import torch.nn as nn # 输入张量: [batch=2, channels=3, height=32, width=32] input_tensor = torch.randn(2, 3, 32, 32) # 最大池化层: 池化核大小为2x2, 步长为2 maxpool = nn.MaxPool2d(kernel_size=2, stride=2) # 前向传播 output = maxpool(input_tensor) print("输出类型:", type(output)) # <class &#39;torch.Tensor&#39;> print("输出形状:", output.shape) # torch.Size([2, 3, 16, 16]) print("梯度属性:", output.requires_grad) # True (若输入有梯度) ``` #### 4. **关键特性说明 1. **通道不变性** 最大池化操作在每一个通道上独立进行,因此输出通道数 $C$ 与输入通道数相同。 2. **空间下采样** 输出尺寸 $H_{\text{out}} \times W_{\text{out}}$ 必然小于输入尺寸: ```python # 输入尺寸32x32 → 输出尺寸16x16 (kernel_size=2, stride=2) ``` 3. **梯度传播特性** 反向传播时,梯度仅通过前向传播中选中的最大值位置传播: ```python input_tensor.requires_grad_(True) output = maxpool(input_tensor) loss = output.sum() loss.backward() # 检查梯度:非最大值位置梯度为0 print(input_tensor.grad) ``` #### 5. **可选参数 `return_indices`** 当设置 `return_indices=True` 时,返回值变为**元组**: ```python maxpool = nn.MaxPool2d(2, stride=2, return_indices=True) output, indices = maxpool(input_tensor) print("输出张量形状:", output.shape) # [2, 3, 16, 16] print("索引张量形状:", indices.shape) # [2, 3, 16, 16] (dtype=torch.int64) ``` 索引张量记录了每个池化窗口中最大值的位置,常用于后续的 `nn.MaxUnpool2d` 操作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值