有关shape的runtimeerror

关于不同尺寸的输入,导致的报错问题,想问下可能是由什么造成的,该怎么解决。
RuntimeError: shape '[1, 96, 13, 7, 13, 7]' is invalid for input of size 884736
更详细的见下面说明

当输入为224*224时,正常输出

input = torch.rand(1, 3, 224, 224)
print(m1.max_vit_base_224().forward(input)[0].shape)
print(m1.max_vit_base_224().forward(input)[1].shape)
print(m1.max_vit_base_224().forward(input)[2].shape)
print(m1.max_vit_base_224().forward(input)[3].shape)

#结果为:
#torch.Size([1, 96, 56, 56])
#torch.Size([1, 192, 28, 28])
#torch.Size([1, 384, 14, 14])
#torch.Size([1, 768, 7, 7])

但是当输入换成别的尺寸,比如384*384,就会报如下错误:

Traceback (most recent call last):
  File "G:/swinmask/Swin-Transformer-Object-Detection/somettttrrrryy.py", line 10, in <module>
    print(m1.max_vit_base_224().forward(input)[0].shape)
  File "G:\swinmask\Swin-Transformer-Object-Detection\mmdet\models\backbones\maxvit.py", line 688, in forward
    output = stage(output)
  File "D:\Program\anaconda3\envs\swin_det\lib\site-packages\torch\nn\modules\module.py", line 889, in _call_impl
    result = self.forward(*input, **kwargs)
  File "G:\swinmask\Swin-Transformer-Object-Detection\mmdet\models\backbones\maxvit.py", line 560, in forward
    output = self.blocks(input)
  File "D:\Program\anaconda3\envs\swin_det\lib\site-packages\torch\nn\modules\module.py", line 889, in _call_impl
    result = self.forward(*input, **kwargs)
  File "D:\Program\anaconda3\envs\swin_det\lib\site-packages\torch\nn\modules\container.py", line 119, in forward
    input = module(input)
  File "D:\Program\anaconda3\envs\swin_det\lib\site-packages\torch\nn\modules\module.py", line 889, in _call_impl
    result = self.forward(*input, **kwargs)
  File "G:\swinmask\Swin-Transformer-Object-Detection\mmdet\models\backbones\maxvit.py", line 492, in forward
    output = self.grid_transformer(self.block_transformer(self.mb_conv(input)))
  File "D:\Program\anaconda3\envs\swin_det\lib\site-packages\torch\nn\modules\module.py", line 889, in _call_impl
    result = self.forward(*input, **kwargs)
  File "G:\swinmask\Swin-Transformer-Object-Detection\mmdet\models\backbones\maxvit.py", line 399, in forward
    input_partitioned = self.partition_function(input, self.grid_window_size)
  File "G:\swinmask\Swin-Transformer-Object-Detection\mmdet\models\backbones\maxvit.py", line 133, in window_partition
    windows = input.view(B, C, H // window_size[0], window_size[0], W // window_size[1], window_size[1])
RuntimeError: shape '[1, 96, 13, 7, 13, 7]' is invalid for input of size 884736

和你做window划分时的操作有关,私信你了,有不懂的赶紧问

引用chatgpt内容作答:
根据你提供的代码和错误信息,有几个可能引起问题的地方:

多次调用 m1.max_vit_base_224().forward(input):在你的代码中,多次调用了 m1.max_vit_base_224().forward(input),这可能导致计算图的重复构建和内存消耗。建议将其调用结果保存在一个变量中,然后多次使用该变量,而不是多次调用该函数。

model = m1.max_vit_base_224()
output = model.forward(input)
print(output[0].shape)
print(output[1].shape)
print(output[2].shape)
print(output[3].shape)

输入尺寸的变化:你提到当输入尺寸从224x224更改为384x384时出现错误。这可能是因为模型中的某些部分对输入尺寸有硬编码的要求,导致输入尺寸变化时发生错误。你可以查看模型代码中的注释或文档,确认模型对输入尺寸的要求,并相应地调整输入大小。

window_partition 函数的使用:根据错误信息,问题似乎出现在 window_partition 函数中。这个函数期望输入的形状为 [B, C, H, W],但你提供的输入形状为 [1, 96, 13, 7, 13, 7]。这可能是由于在调用该函数之前对输入进行了不正确的处理。你需要检查代码中调用该函数的地方,确保输入的形状正确。

如果你能提供更多相关代码,特别是与模型、window_partition 函数和输入处理相关的代码,将有助于更详细地分析问题并给出更具体的解决方案。
根据报错信息,可以看出出现了一个RuntimeError,错误信息显示输入的形状(shape)为[1, 96, 13, 7, 13, 7],但是输入的大小(size)为884,736。这表明在代码的某个地方,期望的输入形状与实际的输入形状不匹配,导致了错误。

具体来说,在你的代码中,使用了一个名为window_partition的函数,这个函数将输入按照指定的窗口大小进行划分。然而,在尝试将输入进行划分时,出现了形状不匹配的问题。这个函数期望输入的形状为[B, C, H, W],其中B是批次大小(batch size),C是通道数(channel),H是高度(height),W是宽度(width)。然而,实际输入的形状是[1, 96, 13, 7, 13, 7],其中包含了额外的维度。

解决这个问题的方法取决于你的具体需求和代码实现。你可以检查输入的形状和大小是否正确,确保与模型或函数期望的形状一致。如果你想使用不同尺寸的输入,你可能需要调整相关的代码以适应不同的输入尺寸,或者查看模型的文档以了解其对输入形状的要求。

此外,还可以考虑使用调整大小(resize)或填充(padding)等预处理步骤,将输入统一为模型期望的形状。这样可以确保输入的一致性,并避免形状不匹配的错误。

总结起来,要解决这个问题,你可以尝试以下几个步骤:

1、检查模型或函数对输入形状的要求,确保输入的形状与其期望的形状一致。
2、检查输入的大小是否正确,特别是在使用不同尺寸的输入时。
3、调整代码以适应不同尺寸的输入,或查阅模型文档了解如何处理不同尺寸的输入。
4、考虑使用预处理步骤,如调整大小或填充,以使输入具有一致的形状。
希望这些信息对你有所帮助!

  • 这篇文章:RuntimeError: shape ‘[4]‘ is invalid for input of size 6 也许能够解决你的问题,你可以看下
  • 除此之外, 这篇博客: RuntimeError: shape '[64, 1, 1, 1]' is invalid for input of size 6400中的 修改 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 把后面的samples -> samples1 即可

  • 以下回答由chatgpt基于相关博客总结生成:

    该问题的原因是因为修改了输入的尺寸导致了形状不匹配的错误。当你改变输入尺寸后,模型中的某些层的输出形状也会发生相应的改变。这可能会导致之后的层无法处理这个新的形状,从而导致错误的发生。

    要解决这个问题,你可以采取以下步骤:

    1.检查代码中对输入尺寸的修改部分,确认是否存在对应的reshape操作或相关操作。

    2.在改变输入尺寸后,确保模型中的每一层都能够处理新的形状。你可以通过查看模型的结构和每一层的输入输出形状来确定。

    3.如果发现某些层无法处理新的形状,你可以修改模型的定义或使用合适的操作来适应新的输入尺寸。比如可以通过添加适当的池化层、卷积层等来调整形状。

    4.另外,你还可以尝试使用其他的方法来改变输入尺寸,如使用插值算法来调整图像的大小。

    以下是一个示例代码,用于演示如何解决这个问题的方法:

    import torch
    
    # 定义模型
    class MyModel(torch.nn.Module):
        def __init__(self):
            super(MyModel, self).__init__()
            self.conv = torch.nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3)
            self.fc = torch.nn.Linear(64 * 224 * 224, 100)
    
        def forward(self, x):
            x = self.conv(x)
            x = x.view(-1, 64 * 224 * 224)  # 根据输入尺寸调整形状
            x = self.fc(x)
            return x
    
    # 创建模型实例
    model = MyModel()
    
    # 创建输入张量
    input_size = (3, 384, 384)
    input_tensor = torch.randn(1, *input_size)
    
    # 模型前向传播
    output_tensor = model(input_tensor)
    
    print(output_tensor.shape)
    

    请注意,这只是一个示例代码,具体的解决方法可能因为你的模型和代码而有所不同。你需要自行检查模型和代码,根据你的需求和情况来进行修改和调整。如果在解决问题时遇到了困难,请提供更多的细节和代码,以便我能够更好地帮助你解决问题。

你这是针对224输入的设置,当输入变为384*384时,H和W的值变大,在这个view操作中无法被window_size整除,导致最终的tensor大小变为[1, 96, 13, 7, 13, 7],这是一个无效的大小,你调整window_size大小,使其可以被输入长宽整除

给你举个例子

计算10816
x = x.view(-1, 16 * 5 * 5)
10816=163737
修改
x = x.view(x.size(0), 163737)
x = x.view(-1, 16 * 37* 37)

还要改一句
nn.Linear(16 * 37* 37, 120)