Python 使用Pytorch与CNN的线性回归:输入和目标形状不匹配:输入[400 x 1],目标[200 x 1]

Python 使用Pytorch与CNN的线性回归:输入和目标形状不匹配:输入[400 x 1],目标[200 x 1],python,linear-regression,pytorch,Python,Linear Regression,Pytorch,让我先解释一下目的。假设我有1000张图片,每张图片都有一个相关的质量分数[在0-10范围内]。现在,我正在尝试使用CNN和回归(在PyTorch中)进行图像质量评估。我已将图像分割为大小相同的补丁。现在,为了进行线性回归,我创建了一个CNN网络 代码如下: class MultiLabelNN(nn.Module): def __init__(self): super(MultiLabelNN, self).__init__() self.conv1 =

让我先解释一下目的。假设我有1000张图片,每张图片都有一个相关的质量分数[在0-10范围内]。现在,我正在尝试使用CNN和回归(在PyTorch中)进行图像质量评估。我已将图像分割为大小相同的补丁。现在,为了进行线性回归,我创建了一个CNN网络

代码如下:

class MultiLabelNN(nn.Module):
    def __init__(self):
        super(MultiLabelNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(32, 64, 5)
        self.fc1 = nn.Linear(3200,1024)
        self.fc2 = nn.Linear(1024, 512)
        self.fc3 = nn.Linear(512, 1)

    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = self.pool(x)
        x = self.conv2(x)
        x = F.relu(x)
        x = x.view(-1, 3200)
        x = self.fc1(x)
        x = F.relu(x)
        x = self.fc2(x)
        x = F.relu(x)
        x = self.fc3(x)
        return x  
运行此网络代码时,我遇到以下错误

输入和目标形状不匹配:输入[400 x 1],目标[200 x 1]

目标形状是[200x1],因为我采用了200的批量大小。我发现了一个解决方案,如果我将“self.fc1=nn.Linear(3200124)”和“x=x.view(-13200)”从3200改为6400,我的代码运行时不会出现任何错误

类似地,它将抛出一个错误输入,并且目标形状不匹配:如果我输入12800而不是6400,则输入[100 x 1],目标[200 x 1]

现在我的疑问是我无法理解这背后的原因。如果我将200张图像作为网络的输入,那么当我从卷积层移动到完全连接层时,为什么在更改参数时输入形状会受到影响。我希望我已经清楚地提到了我的怀疑。即使我有任何疑问,请问我。这将是一个很大的帮助。提前谢谢

class MultiLabelNN(nn.Module):
    def __init__(self):
        super(MultiLabelNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(32, 64, 5)
        self.fc1 = nn.Linear(6400,1024)
        self.fc2 = nn.Linear(1024, 512)
        self.fc3 = nn.Linear(512, 1)

   def forward(self, x):
       #shape of x is (b_s, 32,32,1)
       x = self.conv1(x) #shape of x is (b_s, 28,28,132)
       x = F.relu(x)
       x = self.pool(x) #shape of x now becomes (b_s X 14 x 14 x 32)
       x = self.conv2(x) # shape(b_s, 10x10x64)
       x = F.relu(x)#size is (b_s x 10 x 10 x 64)
       x = x.view(-1, 3200) # shape of x is now(b_s*2, 3200)
       #this is the problem 
       #you can fc1 to be of shape (6400,1024) and that will work 
       x = self.fc1(x)
       x = F.relu(x)
       x = self.fc2(x)
       x = F.relu(x)
       x = self.fc3(x)
       return x  

我认为这应该行得通。如果仍有一些错误,请告诉我。

您能告诉我们第一个错误发生的行号吗。另外,请以表格(批次尺寸x高度x宽度x数量x通道)的形式向我们提供输入的形状,以便我们能够帮助您。这不是一个严重的错误。我们可以很容易地解决。谢谢你的回复。我的输入详细信息如下:感谢您的回复Akhilesh。我的输入细节如下:图像大小:32x32x1(即单通道)。批量大小不会影响问题。在这里,我采取了一个批量大小为200。问题是,如果批处理大小为“N”,则输入和目标形状应匹配:输入[N x 1],目标[N x 1]。我的问题是,我无法理解决定第一个“完全连接层”参数的重要性。由于双倒引号中的“self.fc1=nn.Linear(“3200”,1024)”参数,即3200,因此产生了大小不匹配的错误。如果更改此参数,则输入形状将发生更改。背后的原因我无法理解,您必须手动计算每个卷积层的输出大小,如下所示。我将尝试向您发送完全连接层的精确输入尺寸。同时,你试着用这个公式来计算。非常感谢你,Akhilesh。我已经得到了答案。请告诉我这里是什么欢迎你,阿迪蒂亚拉杰。我所说的b_是指批量大小。你的程序现在运行了吗?