问题描述
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
完结撒花
我好怕,离开世界的时候只能说:我走了,什么都没留下