Линейная регрессия с использованием CNN с использованием Pytorch: формы ввода и цели не совпадают: input [400 x 1], target [200 x 1] - PullRequest
0 голосов
/ 14 сентября 2018

Позвольте мне сначала объяснить цель.Допустим, у меня есть 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  

При запуске этого кода сети я получаю следующую ошибку

формы ввода и цели не совпадают: input [400 x 1], target [200 x 1]

цель target [200x1], потому что я выбрал размер пакета 200. Я нашелрешение, которое, если я изменю «self.fc1 = nn.Linear (3200,1024)» и «x = x.view (-1, 3200)» здесь с 3200 на 6400, мой код выполняется без ошибок.

Точно так же он выдаст ошибку ввода, и целевые фигуры не совпадают: input [100 x 1], target [200 x 1], если я поставлю 12800 вместо 6400

Теперь я сомневаюсь, что яне в состоянии понять причину этого.Если я даю 200 изображений в качестве входных данных для моей сети, то почему меняется форма ввода при изменении параметров при переходе от сверточного слоя к полностью подключенному слою.Я надеюсь, что я ясно упомянул свое сомнение.Даже если у меня есть сомнения, спросите меня.Это будет отличная помощь.Заранее спасибо.

1 Ответ

0 голосов
/ 14 сентября 2018
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  

Я думаю, что это должно работать.Дайте мне знать, если некоторые ошибки все еще остаются.

...