【已解决】RuntimeError: Expected 3D (unbatched) or 4D (batched) input to conv2d, but got input of size

文章讲述了在使用SimCLR框架时遇到的维度问题,涉及ResNet模型的conv2d层。原因是输入特征的维度不符合预期,通过分析官方文档和网络结构,发现是由于reshape操作导致。解决方案是将中间变量的reshape操作还原,确保输入保持原始特征格式。

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

问题描述

Traceback (most recent call last):
  File "/home/visionx/EXT-3/qfy/project_tar/temp1/SimCLR/main.py", line 384, in <module>
    main(0, args)
  File "/home/visionx/EXT-3/qfy/project_tar/temp1/SimCLR/main.py", line 338, in main
    loss_epoch = train(args, train_loader, model, criterion, optimizer, writer)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/visionx/EXT-3/qfy/project_tar/temp1/SimCLR/main.py", line 233, in train
    h_1, h_2, z_1, z_2 = model(x, x)
                         ^^^^^^^^^^^

  File "/home/visionx/EXT-3/qfy/anaconda3/envs/simclr-pt/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
    return forward_call(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/visionx/EXT-3/qfy/project_tar/temp1/SimCLR/simclr/simclr.py", line 30, in forward
    h_i = self.encoder(x_i)
          ^^^^^^^^^^^^^^^^^
  File "/home/visionx/EXT-3/qfy/anaconda3/envs/simclr-pt/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
    return forward_call(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/visionx/EXT-3/qfy/anaconda3/envs/simclr-pt/lib/python3.11/site-packages/torchvision/models/resnet.py", line 285, in forward
    return self._forward_impl(x)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/visionx/EXT-3/qfy/anaconda3/envs/simclr-pt/lib/python3.11/site-packages/torchvision/models/resnet.py", line 268, in _forward_impl
    x = self.conv1(x)
        ^^^^^^^^^^^^^
  File "/home/visionx/EXT-3/qfy/anaconda3/envs/simclr-pt/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
    return forward_call(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/visionx/EXT-3/qfy/anaconda3/envs/simclr-pt/lib/python3.11/site-packages/torch/nn/modules/conv.py", line 463, in forward
    return self._conv_forward(input, self.weight, self.bias)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/visionx/EXT-3/qfy/anaconda3/envs/simclr-pt/lib/python3.11/site-packages/torch/nn/modules/conv.py", line 459, in _conv_forward
    return F.conv2d(input, weight, bias, self.stride,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: Expected 3D (unbatched) or 4D (batched) input to conv2d, but got input of size: [128, 3072]

原因分析及解决

        第一步、原因分析

        很明显,维度不对,但是为什么之前都好,但是到这了维度不对了呢?

        1.1、官方文档

        我们可以看到官方文档对于conv1d和conv2d的解释,也就是输入和输出是有限制的,自然而然的也应该有两种办法:1、改输入;2、改函数(可能要到引用的库函数中修改,有点麻烦)

        1.1.1、1d

        1.1.2、2d

        很简单,添加了较为隐秘的操作,让马大哈给忽略了,这个问题的根源就在于最上边,首先说明为什么要这样做:网络训练完成之后,想要使用网络对特征进行编码和储存。

        再说一下这样做的问题:对于cv的网络来说,至少在这个网络中输入的是x,也就是初始特征,对于图来说初始特征一般是这样的【个数,通道,长,宽】,一般的是像素表示长和宽,不过这不重要,重要的是我们在这里可以和明显的看到是需要四个维度的,但是为什么说三个也可以呢?就是把后面两个看成一个,这个时候就需要长=宽。

        第二步,继续探索

        ok,理解完这部分之后我们就会发现不管我们怎么decode都无法得到相应的参数,如果按照我们所给出的x来进行操作的话,x已经是【个数,features】了嘛,所以到这就明白问题所在了

        但是想想,我们是怎么得到这x的呢?因为输入的时候肯定是符合初始的特征格式【个数,通道,长,宽】的呀,哦,我们发现,我们为了方便中间的处理做了这样一个操作

x = x.reshape(128, -1)
        第三步、问题解决 

        那就不难理解了,我们给他改回来不就行了嘛,但据我所知还没有逆向的,但是不用担心,我们可以把中间变量用一个x1表示操作呀,这样x还是x,就不需要改变了 

x1 = x.reshape(128, -1)

        坚定的改了,像是下定了某种决心,完美!

延伸阅读

        以下内容来自https://wenku.csdn.net/answer/00518b74e69346c7ba92ca6134b1e6e2

完结撒花

        我好怕,离开世界的时候只能说:我走了,什么都没留下

         

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值