Запутался в расчете форм сверточного слоя - PullRequest
0 голосов
/ 20 января 2020

Я новичок в этом форуме, и я начал изучать теорию CNN. Вероятно, это глупый вопрос, но я не совсем понимаю, как рассчитать форму выходов CNN. Я слежу за курсом по Udacity, и в одном из учебных пособий они предоставляют эту архитектуру CNN.

import torch.nn as nn
import torch.nn.functional as F

# define the CNN architecture
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # convolutional layer (sees 32x32x3 image tensor)
        self.conv1 = nn.Conv2d(3, 16, 3, padding=1)
        # convolutional layer (sees 16x16x16 tensor)
        self.conv2 = nn.Conv2d(16, 32, 3, padding=1)
        # convolutional layer (sees 8x8x32 tensor)
        self.conv3 = nn.Conv2d(32, 64, 3, padding=1)
        # max pooling layer
        self.pool = nn.MaxPool2d(2, 2)
        # linear layer (64 * 4 * 4 -> 500)
        self.fc1 = nn.Linear(64 * 4 * 4, 500)
        # linear layer (500 -> 10)
        self.fc2 = nn.Linear(500, 10)
        # dropout layer (p=0.25)
        self.dropout = nn.Dropout(0.25)

Не могли бы вы помочь понять, как они рассчитывают выходные данные слоев CNN? (Начальная форма изображений - 32x32x3) Более конкретно, как они закончились этим:

# linear layer (64 * 4 * 4 -> 500)
self.fc1 = nn.Linear(64 * 4 * 4, 500)

Большое спасибо

1 Ответ

1 голос
/ 20 января 2020

В нем отсутствует определение прямого прохода, и можно предположить, что после каждого слоя conv существует пул 2x2. Следовательно, пул подразумевает субдискретизацию каждый раз (см. Комментарии), и изображения размером 32x32 становятся 16x16 после conv1 (+ 2x2 пул), 8x8 после conv2 (+ 2x2 пул) и 4x4 после conv3 (+ 2x2 пул ). Поскольку conv3 имеет 64 фильтра, он выводит 64 карты характеристик размером 4х4. Затем fc1 отображает этот тензор на полностью связанный слой размером 500. Это именно то, что определяется линией

self.fc1 = nn.Linear(64 * 4 * 4, 500)
...