Добавление остаточных соединений к простому CNN - PullRequest
2 голосов
/ 03 мая 2020

Я реализовал следующий CNN с остаточными соединениями для классификации 10 классов на CIFAR10:

class ConvolutionalNetwork(nn.Module):  

  def __init__(self, filters=[32, 32, 32]):

    super(ConvolutionalNetwork, self).__init__()

    self.conv = []
    self.filters = filters
    in_channels = 3

    for out_channels in self.filters:
      self.conv.append(nn.Conv2d(in_channels, out_channels, 5, padding=2))
      in_channels = out_channels

    self.conv = nn.ModuleList(self.conv)
    self.fc = nn.Linear(self.filters[-1] * 32 * 32, 10)

  def forward(self, X):
    X = X.contiguous()

    for i, conv in enumerate(self.conv):
      res = X
      X = F.relu(conv(X))
      X += res

    X = X.reshape(-1,self.filters[-1]*self.size*self.size)

    X = self.fc(X)
    return F.log_softmax(X, dim=1)

В основном: Conv2d (5x5) -> ReLU -> Conv2d (5x5 ) -> ReLU -> Conv2d (5x5) -> ReLU -> Полностью подключенный слой -> SoftMax Производительность с остаточными соединениями хуже, чем без. Интересно:

  1. может быть, я не использовал это правильно (я должен использовать nn.Identity () или какой-то другой класс pytorch?)
  2. Каковы лучшие практики для числа фильтры (я пробовал [32,32,32] и [64,64,64]) и для пропусков (сколько прыжков? я сделал один, но, возможно, в этом проблема?)
  3. Как я могу изменить размерность тождества для соответствия разным измерениям сверточной сети (например, [16, 32, 64] фильтры)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...