【已解决】RuntimeError: The size of tensor a (32) must match the size of tensor b (128) at non-singleton
上述使用sim这个矩阵和adj1这个矩阵需要进行相乘,上面报错的原因就是因为对应维度不对,所以没有办法运算,那就把对应的改一下就可以了。这个就是训练用到的维度和其中参与计算的维度是不一致的,拿我本身的来说。这里边是128,也就是和上面问题是一致的,那改为32就可以了也即。发现了这个得到的维度不对,只需要改一下对应的就可以了。
问题描述
具体信息如下:
Traceback (most recent call last):
File "/home/visionx/nickle/temp/SimCLR/main.py", line 382, in <module>
main(0, args)
File "/home/visionx/nickle/temp/SimCLR/main.py", line 336, in main
loss_epoch = train(args, train_loader, model, criterion, optimizer, writer)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/visionx/nickle/temp/SimCLR/main.py", line 221, in train
loss = criterion(z_i, z_j,adj1)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/visionx/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/nickle/temp/SimCLR/simclr/modules/nt_xent.py", line 116, in forward
return _neighbor(z_i,z_j,tau=0.1,adj1=adj1)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/visionx/nickle/temp/SimCLR/simclr/modules/nt_xent.py", line 60, in _neighbor
pos = sim.diag() + isim.mul(adj1).sum(1) + inter_view_sim.mul(adj1).sum(1)
^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: The size of tensor a (32) must match the size of tensor b (128) at non-singleton dimension 1
原因分析与解决办法
这个就是训练用到的维度和其中参与计算的维度是不一致的,拿我本身的来说
sim.mul(adj1).sum(1) + sim.mul(adj1).sum(1)
上述使用sim这个矩阵和adj1这个矩阵需要进行相乘,上面报错的原因就是因为对应维度不对,所以没有办法运算,那就把对应的改一下就可以了
adj1 = Matrix(x,max_iter,ratio)
发现了这个得到的维度不对,只需要改一下对应的就可以了
x = x.reshape(128, -1)
这里边是128,也就是和上面问题是一致的,那改为32就可以了也即
x = x.reshape(32, -1)
再次运行,就解决了
扩展阅读
解决办法1:
这个错误主要是因为,数据的数量不能整除batch size的数量,改正方法有两种
1. 将batch size改称可以被 数据量整除即可。
2. 将dataloader 中的 drop_last改称False也可。
推荐使用第二种方法更加简单。
解决办法2:
使用view函数来进行改变,请注意,当使用 view 方法时,要确保变形后的张量的元素数量与原始张量的元素数量相同。
完结撒花
我不是不想落叶归根,而是生如浮萍,不知道根在哪里
更多推荐
所有评论(0)