You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PyTorch中用Conv1d层实现3x1核从2D张量生成3D张量?

解决方案:用PyTorch实现论文中的3x1 Conv1d操作

首先明确:论文里的「3x1 Conv1d」表述是把输入的通道数×时间步长视为二维结构,其中3对应时间维度的卷积窗口大小,1对应通道维度的全覆盖(即每个卷积核会用到所有输入通道的时间步数据),这完全可以用PyTorch的nn.Conv1d实现,核心是参数的正确设置。

核心思路与代码实现

你的输入张量形状应为(batch_size, 11, 180)(batch数、11个输入通道、180时间步),目标是通过Conv+池化得到(batch_size, 64, 59)的输出(64个特征图、59时间步),具体步骤如下:

1. 直接用nn.Conv1d实现(推荐)

nn.Conv1d的kernel_size参数对应时间维度的窗口大小(即论文里的「3」),输入输出通道数分别设为11和64,搭配合适的池化参数即可得到目标形状:

import torch
import torch.nn as nn

# 构建首个Conv+池化模块
first_block = nn.Sequential(
    # in_channels=11(输入通道数),out_channels=64(特征图数量),kernel_size=3(时间维度核大小)
    nn.Conv1d(in_channels=11, out_channels=64, kernel_size=3),
    # 池化核大小3,步长3,确保输出时间步为59
    nn.MaxPool1d(kernel_size=3, stride=3)
)

# 测试输入
test_input = torch.randn(2, 11, 180)  # 2个样本,11通道,180时间步
output = first_block(test_input)
print(output.shape)  # 输出: torch.Size([2, 64, 59])

形状计算验证:

  • Conv1d输出时间步:180 - 3 + 1 = 178(无padding、stride=1时的公式:L_out = L_in - kernel_size + 1)
  • MaxPool1d输出时间步:(178 - 3) // 3 + 1 = 59(公式:L_out = floor((L_in - kernel_size)/stride) + 1)

2. 用nn.Conv2d模拟3x1卷积(可选)

如果想严格对应论文的「3x1」二维核表述,可以给输入增加一个维度,用nn.Conv2d实现,最终再压缩维度:

first_block_2d = nn.Sequential(
    nn.Conv2d(in_channels=11, out_channels=64, kernel_size=(3, 1)),
    nn.MaxPool2d(kernel_size=(3, 1), stride=(3, 1))
)

test_input_2d = test_input.unsqueeze(-1)  # 新增维度,形状变为(2,11,180,1)
output_2d = first_block_2d(test_input_2d)
print(output_2d.squeeze(-1).shape)  # 压缩后同样得到(2,64,59)

这种方式完全等效,但nn.Conv1d的计算效率更高,更适合时序数据处理。

关键说明

论文里的「3x1 Conv1d」本质是在时间维度取3个连续步长,对所有输入通道做加权求和,这正是nn.Conv1d的默认行为——每个卷积核的形状为(in_channels, kernel_size),会覆盖所有输入通道的指定时间窗口,无需额外设置分组或特殊参数。

内容的提问来源于stack exchange,提问作者Victor L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 03:37:24