shape ‘[-1, 400]’ is invalid for input of size 87616:别照搬 CIFAR10 的展平特征数

简介: 该帖探讨PyTorch中CNN输入尺寸变更导致的view形状错误(87616≠400×n)。核心是:**不可硬猜尺寸,须打印真实激活形状**;应同步修改`flatten(1)`与`Linear`输入维,或改用`AdaptiveAvgPool2d((5,5))`适配原结构。强调以运行时输出为准,验证batch一致性与梯度完整性。(239字)

原帖把 CIFAR10 教程改成自己的 ImageFolder,仍使用 view(-1,1655) 和 Linear(400,120):

RuntimeError: shape ‘[-1, 400]’ is invalid for input of size 87616

87616 与贴出的 224 变换并不完全对应

错误给的是实际运行张量的元素数,而代码还写着 RandomResizedCrop(224)。这两份证据不能强行凑成唯一形状:先在 view 前打印真实 batch 和卷积激活,再核对 loader 实际使用的 transform。内存连续性问题对应另一种 view 报错,.contiguous() 不会让元素数变成 400 的倍数。

87616 不能按每份 400 个元素重排,说明卷积输出不再是教程预设的 16×5×5。应先保留 batch 维,查看真实激活,而不是猜一个可整除的数字。

在原 forward 的第二次卷积池化后、view 之前加:

print("josh050608")
print("activation:", x.shape, "elements:", x.numel())
print("per sample:", x[0].numel(), "fc expects:", self.fc1.in_features)

如果打印确认为 [4,16,37,37],每样本就是 21904 个特征,应同时修改两处:x = x.flatten(1),并把构造函数改为 self.fc1 = nn.Linear(16*37*37,120)。只改 view 不改 Linear,下一步仍会矩阵维数不匹配。

但原帖还写了 RandomResizedCrop(224),它与上述 37×37 激活不一致:按贴出的两层 5×5 卷积和 2×2 池化,224 输入会得到 53×53。说明实际运行变换或代码可能与粘贴内容不同,必须以运行时打印为准,不能直接固定 21904。

若希望维持教程网络,可以把输入明确变为 32×32,或在卷积后使用有设计依据的自适应池化到 5×5,再接 Linear(400,120);这些都会改变输入/特征处理,应重新训练。尺寸固定后再创建优化器。

验证普通 batch 与尾批 N=1 的输出第一维都保持 N,且类别通道数与数据集一致。

保留 batch 维,完整验证一种可变输入设计

如果任务允许把卷积特征统一汇聚为 5×5,可以保留教程的 Linear(400,120)。下面是合成分类网络,演示这一有意结构选择;它不是原题已经证实的修复,需重新训练:

import torch
from torch import nn
class Classifier(nn.Module):
    def __init__(self):
        super().__init__()
        self.features = nn.Sequential(nn.Conv2d(3, 6, 5), nn.ReLU(), nn.MaxPool2d(2),
                                      nn.Conv2d(6, 16, 5), nn.ReLU(), nn.MaxPool2d(2))
        self.pool = nn.AdaptiveAvgPool2d((5, 5))
        self.head = nn.Linear(400, 3)
    def forward(self, x):
        return self.head(self.pool(self.features(x)).flatten(1))
model = Classifier()
for size, batch_size in ((32, 4), (224, 1)):
    image = torch.randn(batch_size, 3, size, size)
    output = model(image)
    assert output.shape == (batch_size, 3)
    model.zero_grad()
    output.square().mean().backward()
    assert model.head.weight.grad is not None
    print("input/output:", image.shape, output.shape)

若不采用自适应池化,就按实际每样本激活宽度修改 fc1,并用 flatten(1) 保留 batch。两处要同步修改;随便找一个能整除总元素数的 view 参数可能把样本数也改掉。

核对真实 transform 时打印 trainloader.dataset 持有的变换,重启旧 Notebook 单元和 worker,避免只改了一份未使用的变量。修复完成后使用正常 batch 与尾批 N=1 验证输出数量、类别数和 loss/backward,再恢复完整训练。

参考:原始求助帖;技术依据:Tensor.view(2.5)、Linear(2.5)、MaxPool2d(2.5)、AdaptiveAvgPool2d(2.5)。

相关文章
|
2天前
|
缓存 Unix PyTorch
OSError: [Errno 24] Too many open files:两个 DataLoader 可以 zip,先查文件描述符
原帖双Loader并发读取ZIP导致“Too many open files”(Errno 24),实为文件描述符泄漏或生命周期管理不当,非ZIP不支持DataLoader。需排查Dataset中图像/HDF5/ZIP句柄是否及时释放,并优先采用单Loader配对Dataset保障数据一致性与资源可控性。(239字)
|
2天前
|
并行计算 PyTorch 算法框架/工具
Expected all tensors to be on the same device, cuda:0 and cpu:恢复训练时检查 SGD 动量
该问题源于断点续训时优化器状态(如SGD动量缓冲区)未与模型参数同设备,导致`optimizer.step()`中跨设备张量运算失败。前向/反向可正常执行,但动量更新报错“cuda:0 and cpu”。需检查并统一`param`、`grad`及`optimizer.state`中所有Tensor的设备。
|
2天前
|
并行计算 PyTorch Linux
libtorch_python.so: cannot open shared object file:文件缺失时先修复 torch 安装
该问题核心是 PyTorch 1.0.1.post2 安装不完整,`torch/lib/` 下缺失关键文件 `libtorch_python.so`,非环境变量(LD_LIBRARY_PATH)可解决。需先用 `importlib.util.find_spec` 定位真实安装路径,核对文件存在性;再通过 `pip show -f torch` 验证分发完整性。切勿混用版本或复制库文件。
|
2天前
|
并行计算 PyTorch Linux
RuntimeError: CUDA error: device-side assert triggered:Colab 先重启,再找首次断言
该文详解CUDA断言错误调试策略:强调先重启运行时、启用`CUDA_LAUNCH_BLOCKING=1`,用最小张量验证环境;区分“会话已坏”与新操作触发,主张逐段定位而非臆测标签越界,提供实用边界检查函数与验证流程。(239字)
|
2天前
|
并行计算 PyTorch 异构计算
can’t convert CUDA tensor to numpy:只取分类索引时直接用 torch.argmax
原帖因直接对CUDA张量调用`.data.numpy().argmax()`报错:“无法将CUDA张量转为NumPy”。正确做法是:在GPU上用`output.argmax(dim=1).item()`获取单图预测索引,避免全量拷贝,仅传回标量,高效且安全。(239字)
|
2天前
|
PyTorch 算法框架/工具 索引
ValueError: only one element tensors can be converted to Python scalars:张量列表先检查形状,再 stack
该文解析PyTorch中`list(tensor)`引发的`ValueError`根源:列表含多元素张量时,不可直接转Python标量。强调应通过`tensor.shape`或遍历打印各张量尺寸来查形状;同形张量用`torch.stack`(增维)而非`cat`或`item`;异形则保留原结构,避免强行转换。
|
2天前
|
数据可视化 PyTorch 算法框架/工具
only batches of spatial targets supported:三通道分割 one-hot 转为每像素类别编号
该报错源于PyTorch交叉熵要求标签为`[N, H, W]`(3D),但输入了`[N, 3, H, W]`(4D)掩码。需先验证三通道是否为互斥one-hot,再用`argmax(dim=1)`转为整型标签,并妥善处理全零未标注像素(设`ignore_index`),避免误判为背景类。(239字)
|
2天前
|
PyTorch 算法框架/工具 异构计算
Expected object of scalar type Float but got scalar type Double for argument #4 'mat1':NumPy 输入与 Linear 权重怎样统一类型
PyTorch中`RuntimeError: Expected Float but got Double`常因输入Tensor(float64)与模型权重(float32)类型不一致导致。关键在第一层Linear的输入与权重dtype需统一:可将数据转为float32(推荐),或模型整体升为float64。务必检查`tensor.dtype`而非数值显示,并确保`loss.backward()`前类型已对齐。(239字)
|
2天前
|
机器学习/深度学习 索引
The size of tensor a (133) must match tensor b (10):分类任务换 MSELoss 后先查标签含义
原帖网络输出133类logits,CrossEntropyLoss支持类别索引输入(如`[10]`),而MSELoss要求`outputs`与`target`形状严格匹配(如`[10,133]`)。报错因`target`为`[10]`,无法广播匹配`[10,133]`输出,本质是两类损失对标签格式约定不同。
|
2天前
|
PyTorch 算法框架/工具 索引
RuntimeError: expected scalar type Long but found Float:NLLLoss 要改 labels,不要把 images 转 long
该问题源于`NLLLoss`要求标签为`torch.long`类型(类别索引),但输入为`float`。需确保标签是整数编号(非概率/小数),并在`DataLoader`中统一配对图像与标签,避免双Loader错位;推荐改用`CrossEntropyLoss`配原始logits,或`LogSoftmax+NLLLoss`组合。(239字)

热门文章

最新文章