Kernel size can't greater than actual input size (1017 x 1):逐层追踪被池化压扁的宽度

简介: 该问题源于编码器中宽向尺寸坍缩至1后,仍尝试执行3×3卷积导致PyTorch报错。通过逐层尺寸追踪(15→13→9→7→3→1)可精确定位失败层。解决方案需按任务需求选择:若宽向特征已汇聚完成,可将末层卷积改为(3,1);否则应调整前置池化或添加合理padding,确保尺寸链与解码器上采样严格匹配,保障端到端重建正确性。(239字)

原帖输入为 [1,1,1025,15],编码器的多次卷积与宽方向池化后,3×3 卷积遇到了宽度 1:

RuntimeError: Calculated padded input size per channel: (1017 x 1). 
Kernel size: (3 x 3). 
Kernel size can't greater than actual input size at /opt/conda/conda-bld/pytorch_1524584710464/work/aten/src/THNN/generic/SpatialConvolutionMM.c:48

用逐层尺寸算出失败层

原题宽度只有 15,却经过两次宽向池化与多次无 padding 的 3×3 卷积。到 [1017,1] 时,最后一个 3×3 卷积的宽度要求已无法满足。这里有具体尺寸链,优先验证它,而不是改 batch 或 CUDA 设置。

按原配置,无 padding、stride=1 时,宽度依次为 15→13→9→7→3→1;最后一个 3×3 卷积已放不下。这不是 batch 或 dtype 问题。

在 forward 中逐层执行编码器前,给相关层加输入检查。model 是原题 MeeAutoEncoder,inputs 是实际批次:

import torch.nn as nn
handles = []
def show_input(layer, args):
    print(type(layer).__name__, tuple(args[0].shape), layer.kernel_size)
print("josh050608")
print("input:", inputs.shape)
for layer in model.encoder.modules():
    if isinstance(layer, (nn.Conv2d, nn.MaxPool2d)):
        handles.append(layer.register_forward_pre_hook(show_input))
try:
    model(inputs)
finally:
    for handle in handles:
        handle.remove()

确认失败层收到 [1,30,1017,1] 后,按任务修改结构:如果宽轴已完成汇聚,可把该层卷积核改为 (3,1);如果还需要宽方向邻域,应减少之前的宽向池化或使用有依据的 padding,保留足够宽度。不要仅因为报错就随意把输入拉伸成更宽。

这些改法会影响感受野和解码器尺寸。自编码器还需逐层核对上采样顺序;Upsample 的二维 size 是 (H,W),原题 (5,205) 等设置不能只凭数字猜对。

验证从原输入完整经过编码器与解码器,检查最终重建与目标尺寸一致,再计算损失并反向。只修最后一层后能跑到下一层,不代表整个自编码器尺寸链已经正确。

在 CPU 重现尺寸链,再验证一种结构改法

下面保留原编码器的卷积、池化参数,打印到失败前的形状。随后示范把最后一层改成 (3,1);这仅适合任务允许宽轴已汇聚完的设计,不是整个自编码器的完整替代:

import torch
from torch import nn
layers = nn.ModuleList([
    nn.Conv2d(1, 12, 3), nn.MaxPool2d((3, 5), stride=1),
    nn.Conv2d(12, 20, 3), nn.MaxPool2d((1, 5), stride=1),
    nn.Conv2d(20, 30, 3),
])
x = torch.randn(1, 1, 1025, 15)
widths = [x.shape[-1]]
for layer in layers:
    x = layer(x)
    widths.append(x.shape[-1])
assert widths == [15, 13, 9, 7, 3, 1]
assert x.shape == (1, 30, 1017, 1)
last = nn.Conv2d(30, 40, kernel_size=(3, 1))
encoded = last(x)
assert encoded.shape == (1, 40, 1015, 1)
encoded.square().mean().backward()
assert last.weight.grad is not None
print("width chain/encoded:", widths, encoded.shape)

若需要保留宽向邻域,应回到之前的池化核、stride 或 padding 设计,而非仅把最后卷积改窄。每一种方案改变的信息压缩与感受野不同,要与解码器的上采样顺序一起评估。

自编码器最终还要与目标重建尺寸一致。不要用广播或随意 view 让 loss 暂时能算;检查输出的 H、W 和通道数,使用任务定义的恢复方式。编码器前向成功、解码器尺寸正确、重建 loss 可反向是三个连续验收点。

参考:原始求助帖;技术依据:Conv2d(2.5)、MaxPool2d(2.5)、nn.Module(2.5)。

相关文章
|
2天前
|
PyTorch 算法框架/工具 索引
RuntimeError: Couldn't install torch.:Stable Diffusion 先查启动器实际使用的 Python
该问题源于虚拟环境使用不兼容的Python 3.6.1,而torch 1.12.1要求Python ≥3.7。需先确认解释器版本与架构,备份旧venv,改用项目支持的Python(如3.10.6)重建环境,并在webui-user.bat中指定路径,再验证torch导入成功。
|
2天前
|
PyTorch 算法框架/工具 Python
RuntimeError: Numpy is not available:树莓派先检查 NumPy 导入与二进制接口
本文详解树莓派4(ARM)上PyTorch调用`torch.from_numpy()`报“Numpy is not available”错误的三层排查法:先验NumPy导入,再测最小数组桥接,最后查真实频谱;强调版本兼容性(尤其NumPy 1.x/2.x ABI)、架构匹配(aarch64)与依赖交集验证,拒绝盲目升级。
|
2天前
|
并行计算 PyTorch 算法框架/工具
CUBLAS_STATUS_ALLOC_FAILED when calling cublasCreate(handle):先区分显存不足和已有 CUDA 错误
Colab中`cublasCreate`失败非单纯batch过大所致,需区分环境异常与资源不足:重启运行时、验证CUDA可用性、用小矩阵测试基础算力,并对比`nvidia-smi`与`memory_summary`定位真实瓶颈。(239字)
|
2天前
|
PyTorch 算法框架/工具 Python
RuntimeError: 1D tensors expected, but got 2D and 2D tensors:矩阵乘法用 @ 或 matmul
NumPy的`a.dot(b)`是矩阵乘法,而PyTorch的`torch.dot()`仅支持一维向量内积。二维矩阵乘法应改用`a @ b`、`torch.mm()`或`torch.matmul()`,确保内维匹配(如`(3,2)@(2,1)`→`(3,1)`),避免错误展平或转置。
|
2天前
|
机器学习/深度学习 PyTorch 算法框架/工具
Expected scalar type Long for argument #2 'target':单输出二分类别只改标签类型
该帖解析 PyTorch 中 `CrossEntropyLoss` 报错“expected scalar type Long but got Float”的根本原因:末层单输出(`Linear(…,1)`)却误用交叉熵——它要求标签为 `long` 且输出通道数≥类别数。正确方案二选一:① 改用 `BCEWithLogitsLoss`(单输出+浮点标签);② 改末层为 `Linear(…,2)` 并确保标签∈{0,1}。需同步校验形状、类型与类别映射。(239字)
|
2天前
|
存储 PyTorch 算法框架/工具
TypeError: Invalid dimensions for image data:把 PyTorch 的 CHW 图像转成 HWC 再显示
PyTorch图像常为`[C,H,W]`格式,而`plt.imshow()`要求`[H,W,C]`,直接传入会报`Invalid dimensions`错。需用`.permute(1,2,0)`换轴,并注意反归一化、数据范围及灰度/彩色区分,确保显示正确。(239字)
|
2天前
|
PyTorch 算法框架/工具
Expected more than 1 value per channel when training:先分清单样本推理、尾批和 BatchNorm 统计量
PyTorch中`Expected more than 1 value per channel`错误,主因是BatchNorm在训练模式下某层输入每通道仅1个值(如`[1,C,1,1]`),非单纯batch_size=1所致。需定位具体BN层、区分train/eval模式、检查尾批样本数或改用LayerNorm等替代方案。(239字)
|
2天前
|
并行计算 PyTorch 算法框架/工具
RuntimeError: operator torchvision::nms does not exist:先核对 torch 与 torchvision 的构建组合
该错误源于 `torch`(CPU版)与 `torchvision`(CUDA版)混装导致算子未注册。`+cpu` 与 `+cu118` 构建不兼容,`nms` 算子无法加载。应统一安装渠道(如全CPU或全CUDA),验证版本匹配并重启解释器。(239字)
|
2天前
|
PyTorch 算法框架/工具
stack expects equal size [3,224,224] and [3,224,336]:Resize(224) 不会固定两条边
该错误源于`Resize(224)`仅缩放短边、保留长宽比,导致同batch内图像尺寸不一(如[3,224,224]与[3,224,336]),`collate_fn`调用`torch.stack`时因张量尺寸不等而失败。需统一尺寸:改用`Resize((224,224))`或`Resize(256)+CenterCrop(224)`,并确保训练/验证数据集独立构建、变换生效。(239字)
|
2天前
|
存储 运维 算法
one of the variables needed for gradient computation has been modified:先找循环中的切片回写
该问题源于循环中对张量视图(如`u_i[:,j,:]`)的原地赋值,破坏了反向传播所需的计算图完整性。`clone()`无法解决视图共享存储导致的版本冲突。正确做法是:避免原地修改,将各步更新独立计算后`torch.stack`组合;启用`torch.autograd.detect_anomaly()`精准定位异常位置;验证前向数值一致性及梯度存在性与有限性。(239字)

热门文章

最新文章