Я реализовал следующий 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 Производительность с остаточными соединениями хуже, чем без. Интересно:
- может быть, я не использовал это правильно (я должен использовать nn.Identity () или какой-то другой класс pytorch?)
- Каковы лучшие практики для числа фильтры (я пробовал [32,32,32] и [64,64,64]) и для пропусков (сколько прыжков? я сделал один, но, возможно, в этом проблема?)
- Как я могу изменить размерность тождества для соответствия разным измерениям сверточной сети (например, [16, 32, 64] фильтры)