当前位置: 首页 > article >正文

【无标题】特征降维的常见方法

x_1.shape torch.Size([32, 96, 1000])怎么在1000的维度上降维,1000是seq_len

要在形状 [32, 96, 1000] 的张量上对序列长度(seq_len = 1000)进行降维,可以采用多种方法。以下是几种常见的降维方法,可以根据任务需求选择:

1. 全局池化 (Global Pooling)

全局平均池化和全局最大池化可以将序列长度直接缩减为 1,将所有时间步的特征压缩成一个向量。这种方法计算效率高,且能有效地降低维度。

python
复制代码
import torch.nn.functional as F

全局平均池化
x_1 = F.avg_pool1d(x_1, kernel_size=x_1.size(2)) # shape: [32, 96, 1]
x_1 = x_1.squeeze(-1) # shape: [32, 96]

或者使用全局最大池化
x_1 = F.max_pool1d(x_1, kernel_size=x_1.size(2)) # shape: [32, 96, 1]
x_1 = x_1.squeeze(-1) # shape: [32, 96]

2. 卷积降采样 (Convolutional Downsampling)

可以使用 Conv1d 层在时间维度上进行降采样。设定一个较大的步幅(stride)和卷积核大小,可以有效地减少序列长度。

python
复制代码
import torch.nn as nn

定义卷积层
conv_downsample = nn.Conv1d(in_channels=96, out_channels=96, kernel_size=5, stride=5, padding=2)

在时间维度上应用卷积降采样
x_1 = conv_downsample(x_1) # shape: [32, 96, 200](假设stride为5)

3. RNN编码 (RNN Encoding)

使用 RNN(如 LSTM 或 GRU)层来编码序列,然后只保留最后一个时间步的隐藏状态或所有时间步的平均池化。这种方法可以捕获序列中的时序依赖。

python
复制代码
rnn = nn.GRU(input_size=96, hidden_size=64, batch_first=True, bidirectional=True)

调整形状以适应 RNN
x_1 = x_1.permute(0, 2, 1) # shape: [32, 1000, 96]

获取 RNN 输出
_, h_n = rnn(x_1) # h_n: [2, 32, 64](双向的最后状态)

拼接双向的隐藏状态
x_1 = torch.cat((h_n[-2], h_n[-1]), dim=1) # shape: [32, 128]

4. 注意力加权池化 (Attention Weighted Pooling)

可以通过注意力机制计算序列的加权平均,使模型能够关注重要的时间步。注意力加权池化可以通过自适应的方式降维。

python
复制代码
attention_weights = nn.Parameter(torch.randn(96, 1)) # 注意力权重
attention_score = torch.matmul(x_1.permute(0, 2, 1), attention_weights).squeeze(-1) # shape: [32, 1000]
attention_score = F.softmax(attention_score, dim=1) # 归一化权重

应用注意力权重
x_1 = torch.bmm(x_1, attention_score.unsqueeze(2)).squeeze(-1) # shape: [32, 96]

5. 可学习的线性层降维

使用一个 Linear 层(或称为 Dense 层)将序列长度从 1000 降到更小的维度。此方法适合需要学习一个投影矩阵的情况。

python
复制代码
linear_proj = nn.Linear(1000, 200) # 将序列长度从1000降到200

使用线性层进行降维
x_1 = linear_proj(x_1) # shape: [32, 96, 200]

6. 平均池化或最大池化分块

如果需要将序列长度从 1000 降到一个特定长度(如 100),可以分块平均或最大池化。

python
复制代码
平均池化分块
x_1 = F.adaptive_avg_pool1d(x_1, output_size=100) # shape: [32, 96, 100]
总结
这些方法中,全局池化 和 分块池化 是计算效率较高的降维方法,适合不需要时序依赖的情况;而 卷积降采样 和 RNN 则更适合保留序列信息和时序特征。如果你希望自动学习降维,可以考虑 线性层 或 注意力加权池化。


http://www.kler.cn/a/382687.html

相关文章:

  • Linux基础(二):用户管理、文件权限与系统日志
  • electron 中 webFrame 作用
  • 大模型微调:Adapter;在大模型基础上增加低秩矩阵或者adapter有什么用,这样还增加运算
  • 利用P2link智能组网工具实现外网访问局域网中的Linux主机
  • 太速科技-634-基于3U PXIe的VU3P FMC+数据接口板
  • 【google play】使用Java接入谷歌支付流程
  • 3D互动+AR试戴,重塑线上珠宝营销新体验!
  • 【题解】—— LeetCode一周小结44
  • 效果框架(效果ID3DXEffect)
  • ML 系列:机器学习和深度学习的深层次总结( 19)— PMF、PDF、平均值、方差、标准差
  • 浮动路由:实现出口线路的负载均衡冗余备份。
  • 【软考】错题分析1105
  • ONLYOFFICE 8.2深度测评——助力自动化办公
  • 2024系统架构师---论软件系统架构风格论文
  • Linux grep命令详解(多图、多示例)
  • 大数据新视界 -- 大数据大厂之 Impala 性能优化:数据存储分区的艺术与实践(下)(2/30)
  • HarmonyOS使用arkTS拉起指定第三方应用程序
  • 基于机器学习算法的中风患者数据分析与可视化预测设计与实现
  • 网络学习/复习4传输层UDP/TCP(协议属性详解、主机间连接状态详解)
  • Fsm serialdata
  • 练习LabVIEW第三十七题
  • 十二:java web(4)-- Spring核心基础
  • VS 中使用c#高版本语言方法
  • fs 中 rmSync 作用
  • 石墨舟氮气柜:半导体制造中的关键保护设备
  • 责任链模式 Chain of Responsibility