深度学习,torch.cat的时候出现typeerror错误

最近再学习深度学习,尝试着自己打了一下出现了这样的·错误,有没有人可以解释一下是什么错误。需要怎么改

import torch
from torch import nn
class conv_1(nn.Module):
    def __init__(self,C_in):
        super(conv_1,self).__init__()
        self.Conv_1=nn.Conv2d(C_in,C_in,kernel_size=3,padding=1,stride=1,bias=False)
        self.relu=nn.ReLU()
    def forward(self,x):
        return self.relu(self.Conv_1(x))


class conv_2(nn.Module):
    def __init__(self, C_in):
        super(conv_2,self).__init__()
        self.Conv_1 = nn.Conv2d(C_in, C_in, kernel_size=3,padding=1, stride=1, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        return self.sigmoid(self.Conv_1(x))
class cat(nn.Module):
    def __init__(self,C_in):
        super().__init__()
        self.conv_1=conv_1(C_in)
        self.conv_2=conv_2(C_in)
    def forward(self,x):
        return torch.cat((self.conv_1(x),self.conv_2(x)),dim=1)
        #return self.conv_2(x)+self.conv_1(x)
if __name__=='__main__':
    print("start")
    conv_1=conv_1(64)
    data_in = torch.randn(8, 64, 300, 300)
    at=cat(64)

    data_out=cat(data_in)
    data_out=conv_1(data_in)
    data_out=cat(data_in)
    print(data_out.shape)

错误提示
raceback (most recent call last):
  File "E:\Pycharm\Anaconda_Obj\test2.py", line 32, in <module>
    at=cat(64)
  File "E:\Pycharm\Anaconda_Obj\test2.py", line 23, in __init__
    self.conv_1=conv_1(C_in)
  File "E:\Anaconda\lib\site-packages\torch\nn\modules\module.py", line 1110, in _call_impl
    return forward_call(*input, **kwargs)
  File "E:\Pycharm\Anaconda_Obj\test2.py", line 9, in forward
    return self.relu(self.Conv_1(x))
  File "E:\Anaconda\lib\site-packages\torch\nn\modules\module.py", line 1110, in _call_impl
    return forward_call(*input, **kwargs)
  File "E:\Anaconda\lib\site-packages\torch\nn\modules\conv.py", line 447, in forward
    return self._conv_forward(input, self.weight, self.bias)
  File "E:\Anaconda\lib\site-packages\torch\nn\modules\conv.py", line 443, in _conv_forward
    return F.conv2d(input, weight, bias, self.stride,
TypeError: conv2d() received an invalid combination of arguments - got (int, Parameter, NoneType, tuple, tuple, tuple, int), but expected one of:
 * (Tensor input, Tensor weight, Tensor bias, tuple of ints stride, tuple of ints padding, tuple of ints dilation, int groups)
      didn't match because some of the arguments have invalid types: (!int!, !Parameter!, !NoneType!, !tuple!, !tuple!, !tuple!, int)
 * (Tensor input, Tensor weight, Tensor bias, tuple of ints stride, str padding, tuple of ints dilation, int groups)
      didn't match because some of the arguments have invalid types: (!int!, !Parameter!, !NoneType!, !tuple!, !tuple!, !tuple!, int)

你的问题是在创建cat类的实例时遇到了错误。这是因为你在cat类的forward函数中,尝试将conv_1conv_2的输出进行连接,但是你在实例化cat类时,又将conv_1conv_2作为参数传入,这就造成了混淆。

更具体地说,在cat类的__init__方法中,你已经实例化了conv_1conv_2,而在创建cat类的实例时,你又尝试将conv_1conv_2作为参数传入,这实际上是尝试将这两个已经实例化的模块作为输入数据进行处理,这就引发了错误。

解决这个问题的方法是将cat类的实例化过程中的参数修改为你想要的输入通道数(例如64),然后在cat类的forward函数中使用已经实例化的conv_1conv_2。修改后的代码如下:

import torch
from torch import nn

class Conv1(nn.Module):
    def __init__(self, C_in):
        super(Conv1, self).__init__()
        self.Conv_1 = nn.Conv2d(C_in, C_in, kernel_size=3, padding=1, stride=1, bias=False)
        self.relu = nn.ReLU()

    def forward(self, x):
        return self.relu(self.Conv_1(x))

class Conv2(nn.Module):
    def __init__(self, C_in):
        super(Conv2, self).__init__()
        self.Conv_1 = nn.Conv2d(C_in, C_in, kernel_size=3, padding=1, stride=1, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        return self.sigmoid(self.Conv_1(x))

class Cat(nn.Module):
    def __init__(self, C_in):
        super().__init__()
        self.conv_1 = Conv1(C_in)
        self.conv_2 = Conv2(C_in)

    def forward(self, x):
        return torch.cat((self.conv_1(x), self.conv_2(x)), dim=1)

if __name__ == '__main__':
    print("start")
    cat_model = Cat(64)  # 修改了这里,将64作为输入通道数传入
    data_in = torch.randn(8, 64, 300, 300)
    data_out = cat_model(data_in)  # 使用已经实例化的cat模型处理输入数据
    print(data_out.shape)

此外,我还对你的类名进行了修改,使其遵循Python的命名规范。

援引文心一言:
我可以看到你的代码中存在一些问题,它们可能导致错误。

首先,你在cat类的forward函数中使用了torch.cat,但是你的两个输入(即self.conv_1(x)和self.conv_2(x))可能在维度1上的大小不同,这可能导致错误。你需要确保你想要连接的两个张量在连接的维度上具有相同的大小。

其次,你的cat类中的__init__函数在实例化conv_1和conv_2时,没有将self作为参数传递给它们。在PyTorch中,当你定义一个模型类时,你需要在实例化任何子模块时将self作为参数传递,这样PyTorch就可以正确地跟踪模型中的所有参数。

你的代码应该修改为:





python
class cat(nn.Module):  
    def __init__(self,C_in):  
        super().__init__()  
        self.conv_1=conv_1(C_in)  
        self.conv_2=conv_2(C_in)  
    def forward(self,x):  
        # Ensure that the dimensions match along dim=1  
        output_1 = self.conv_1(x)  
        output_2 = self.conv_2(x)  
        output_2 = torch.mean(output_2, dim=1, keepdim=True)  # Or any other operation to match the dimensions  
        return torch.cat((output_1, output_2),dim=1)


上面的修改确保了你想要连接的两个张量在维度1上具有相同的大小。我使用了torch.mean来减小output_2在维度1上的大小,这样它就可以与output_1匹配。你可能需要根据你的具体需求来选择适当的操作。

最后,请注意,在你的代码中,你创建了一个名为cat的类,它与Python的内置函数cat重名,这可能会导致一些混淆。建议你为你的类选择一个独特的名字。

【以下回答由 GPT 生成】

这个错误是因为在定义cat类时,你给一个属性命名为conv_1,而这个名称与conv_1类相同,导致了命名冲突。这应该是一个错误。

要解决这个问题,你需要修改cat类中的属性命名,将其和类名conv_1区分开来。

以下是修改后的代码:

import torch
from torch import nn

class Conv1(nn.Module):
    def __init__(self, C_in):
        super(Conv1, self).__init__()
        self.Conv_1 = nn.Conv2d(C_in, C_in, kernel_size=3, padding=1, stride=1, bias=False)
        self.relu = nn.ReLU()

    def forward(self, x):
        return self.relu(self.Conv_1(x))


class Conv2(nn.Module):
    def __init__(self, C_in):
        super(Conv2, self).__init__()
        self.Conv_1 = nn.Conv2d(C_in, C_in, kernel_size=3, padding=1, stride=1, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        return self.sigmoid(self.Conv_1(x))


class Cat(nn.Module):
    def __init__(self, C_in):
        super().__init__()
        self.conv1 = Conv1(C_in)
        self.conv2 = Conv2(C_in)

    def forward(self, x):
        return torch.cat((self.conv1(x), self.conv2(x)), dim=1)

if __name__ == '__main__':
    print("start")
    conv1 = Conv1(64)
    data_in = torch.randn(8, 64, 300, 300)
    at = Cat(64)

    data_out = at(data_in)
    data_out = conv1(data_in)
    data_out = at(data_in)
    print(data_out.shape)

在修改后的代码中,我们将conv_1改为conv1,并将conv_2改为conv2,这样就避免了命名冲突。运行代码将不再出现TypeError错误。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^