AdaptiveAvgPool1D内部实现

该博客介绍了如何使用PyTorch实现1D自适应平均池化操作。通过示例代码展示了 AdaptiveAvgPool1d 模块的工作原理,解释了其将输入数据按比例分割并进行平均池化的计算过程。示例中,输入数据为形状[N,C,L]的一维张量,输出形状为[N,C,m],其中m为指定的输出尺寸。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公式:

# average adaptive pool1d
# suppose input data in shape of [N, C, L], `output_size` is m or [m],
# output shape is [N, C, m], adaptive pool divide L dimension
# of input data into m grids averagely and performs poolings in each
# grid to get output.
# adaptive avg pool performs calculations as follow:
#
#     for i in range(m):
#         lstart = floor(i * L / m)
#         lend = ceil((i + 1) * L / m)
#         output[:, :, i] = sum(input[:, :, lstart: lend])/(lstart - lend)
#

import torch
import numpy as np
L = 4
M = 5

input = torch.ones(1, 1, L)
input[0, 0 , 2] = 0
print(input)

AdaptiveAvgPool1D = torch.nn.AdaptiveAvgPool1d(M)
output1 = AdaptiveAvgPool1D(input)
print(output1)

input = np.array(input)
for i in range(M):
    lstart = math.floor(i * L / M)
    lend = math.ceil((i + 1) * L / M)
    print(np.sum(input[:, :, lstart: lend], axis=2) / (lend - lstart))

输出:

tensor([[[1., 1., 0., 1.]]])
tensor([[[1.0000, 1.0000, 0.5000, 0.5000, 1.0000]]])
[[1.]]
[[1.]]
[[0.5]]
[[0.5]]
[[1.]]

参考:

paddle.nn - AdaptiveAvgPool1D - 《百度飞桨 PaddlePaddle v2.0 深度学习教程》 - 书栈网 · BookStack

### SE注意力机制在网络序列中的具体应用 #### Squeeze-and-Excitation (SE) 结构概述 Squeeze-and-Excitation 网络通过引入通道间的依赖关系来改进卷积神经网络的表现。这种结构允许模型自适应地重新校准通道特征响应,从而提高表示能力[^3]。 #### 序列模型中SE的应用原理 在序列模型中,SE模块可以通过以下方式集成: 1. **时间维度上的挤压操作** 对于给定的时间步长 \( t \),先执行常规的前向传播计算得到隐藏状态 \( h_t \) 。接着,在每个时间步上对所有通道进行全局平均池化(squeeze),这一步骤旨在捕捉整个时间窗口内的上下文信息。 2. **兴奋操作** 基于上述获得的信息,构建一个全连接层用于生成各个通道的重要性分数。这些分数经过激活函数处理后乘回到原始输入张量对应的各通道上去,实现对不同通道重要性的加权调整(excite)。此过程有助于突出那些对于当前任务更为重要的特征而抑制不那么有用的信号。 ```python import torch.nn as nn class SELayer(nn.Module): def __init__(self, channel, reduction=16): super(SELayer, self).__init__() self.avg_pool = nn.AdaptiveAvgPool1d(1) self.fc = nn.Sequential( nn.Linear(channel, channel // reduction), nn.ReLU(inplace=True), nn.Linear(channel // reduction, channel), nn.Sigmoid() ) def forward(self, x): # 输入形状为(batch_size, channels, seq_len) b, c, _ = x.size() y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1) return x * y.expand_as(x) # 将SE层应用于LSTM单元之后 lstm_output = lstm(input_sequence)[0] # LSTM输出形状为(seq_len, batch, hidden_dim) se_layer = SELayer(hidden_dim) enhanced_lstm_out = se_layer(lstm_output.permute(1, 2, 0)) # 调整维度顺序以匹配SE期望输入格式 ``` 该代码片段展示了如何在一个简单的循环神经网络架构里加入SE模块,其中`hidden_dim`代表LSTM单元内部的状态尺寸大小。注意这里为了方便说明采用了PyTorch框架下的实现;实际部署时可根据需求选用其他深度学习库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

理心炼丹

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

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

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

打赏作者

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

抵扣说明:

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

余额充值