PyTorch для начинающих: RuntimeError: несоответствие размера, m1: [16 x 2304000], м2: [600 x 120] - PullRequest
0 голосов
/ 28 февраля 2020

Я новичок в PyTorch и строю NN в целом, и я немного застрял.

У меня есть эта архитектура CNN:

class ConvNet(nn.Module):

    def __init__(self, num_classes=10):
        super(ConvNet, self).__init__()

        self.conv1 = nn.Conv2d(
            in_channels=3, 
            out_channels=16, 
            kernel_size=3)

        self.conv2 = nn.Conv2d(
            in_channels=16, 
            out_channels=24, 
            kernel_size=4)

        self.conv3 = nn.Conv2d(
            in_channels=24, 
            out_channels=32, 
            kernel_size=4)

        self.dropout = nn.Dropout2d(p=0.3)

        self.pool = nn.MaxPool2d(2)

        self.fc1 = nn.Linear(600, 120)
        self.fc2 = nn.Linear(512, 10)

        self.final = nn.Softmax(dim=1)

    def forward(self, x):

        # conv 3 layers

        x = F.max_pool2d(F.relu(self.conv1(x)), 2)  # output of conv layers
        x = self.dropout(x)

        x = F.max_pool2d(F.relu(self.conv2(x)), 2)  # output of conv layers
        x = self.dropout(x)

        x = F.max_pool2d(F.relu(self.conv3(x)), 2)  # output of conv layers
        x = self.dropout(x)

        # linear layer

        x = F.interpolate(x, size=(600, 120))
        x = x.view(x.size(0), -1)

        x = self.fc1(x) 

        return x

Но когда я пытаюсь тренироваться с мои изображения, это не работает, и у меня есть эта ошибка:

RuntimeError: size mismatch, m1: [16 x 2304000], m2: [600 x 120]

Я хотел бы добавить второй линейный слой (self.fc2), а также окончательный слой SoftMax (self.final), но так как я застрял на первом линейном слое, я не могу добиться никакого прогресса.

1 Ответ

1 голос
/ 28 февраля 2020

Входной размер self.fc1 должен соответствовать элементному (второму) размеру вашего сплющенного тензора. Поэтому вместо self.fc1 = nn.Linear(600, 120) вы можете заменить это на self.fc1 = nn.Linear(2304000, 120).

Имейте в виду, что, поскольку вы используете полностью связанные слои, модель не может быть неизменной по размеру входного сигнала (в отличие от полностью сверточных сетей). Если вы измените размер канала или пространственные измерения до x = x.view(x.size(0), -1) (как вы делали переход от последнего вопроса к этому), входное измерение self.fc1 должно будет соответственно измениться.

...