Как рассчитать размеры ядра из исходных размеров изображения? - PullRequest
0 голосов
/ 27 августа 2018

https://github.com/kuangliu/pytorch-cifar/blob/master/models/resnet.py

Из чтения https://www.cs.toronto.edu/~kriz/cifar.html набор данных cifar состоит из изображений, каждое из которых имеет размер 32x32.

Мое понимание кода:

self.conv1 = nn.Conv2d(3, 6, 5)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1   = nn.Linear(16*5*5, 120)

Is:

self.conv1 = nn.Conv2d(3, 6, 5) # 3 channels in, 6 channels out ,  kernel size of 5
self.conv2 = nn.Conv2d(6, 16, 5) # 6 channels in, 16 channels out ,  kernel size of 5
self.fc1   = nn.Linear(16*5*5, 120) # 16*5*5 in features , 120 ouot feature

Из resnet.py следующее:

self.fc1   = nn.Linear(16*5*5, 120)

С http://cs231n.github.io/convolutional-networks/ указано следующее:

Резюме. Подводя итог, Conv Layer:

Принимает объем размером W1 × H1 × D1 Требуется четыре гиперпараметра: Количество фильтров K, их пространственная протяженность F, шаг S, количество заполнения нулями P. Производит объем размером W2 × H2 × D2, где: W2 = (W1-F + 2P) / S + 1 H2 = (H1-F + 2P) / S + 1 (то есть ширина и высота вычисляются по симметрии) D2 = K При совместном использовании параметров вводится F⋅F⋅D1 весов на фильтр, в общей сложности (F⋅F⋅D1) ⋅K весов и K смещений. В выходной объем, срез d-й глубины (размером W2 × H2) является результатом выполнения действительной свертки d-го фильтра на входе объем с шагом S, а затем смещен на d-й уклон.

Исходя из этого, я пытаюсь понять, как размер тренировочного образа 32x32 (1024 пикселя) преобразуется в карту объектов (16 * 5 * 5 -> 400) в виде nn.Linear(16*5*5, 120)

Начиная с https://pytorch.org/docs/stable/nn.html#torch.nn.Conv2d видно, что шаг по умолчанию равен 1, а отступ - 0.

Каковы шаги, чтобы прийти к 16 * 5 * 5 с размером изображения 32 * 32, и можно ли 16 * 5 * 5 получить из вышеописанных шагов?

Из вышеперечисленных шагов, как рассчитать spatial extent?

Обновление:

Исходный код:

'''LeNet in PyTorch.'''
import torch.nn as nn
import torch.nn.functional as F

class LeNet(nn.Module):
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1   = nn.Linear(16*5*5, 120)
        self.fc2   = nn.Linear(120, 84)
        self.fc3   = nn.Linear(84, 10)

    def forward(self, x):
        out = F.relu(self.conv1(x))
        out = F.max_pool2d(out, 2)
        out = F.relu(self.conv2(out))
        out = F.max_pool2d(out, 2)
        out = out.view(out.size(0), -1)
        out = F.relu(self.fc1(out))
        out = F.relu(self.fc2(out))
        out = self.fc3(out)
        return out

Взято из https://github.com/kuangliu/pytorch-cifar/blob/master/models/lenet.py

Насколько я понимаю, операция свертки применяется к данным изображения на ядро. Таким образом, если установлено 5 ядер, то к данным применяются 5 сверток, которые генерируют 5-мерное представление изображения.

1 Ответ

0 голосов
/ 30 августа 2018

Вы не предоставили достаточно информации в своем вопросе (см. мой комментарий ).

Однако, если мне нужно угадать, у вас есть два пула (с шагом 2) между слоями свертки:

  • входной размер 32x32 (3 канала)
  • conv1 выходной размер 28x28 (6 каналов): конвер без заполнения и размер ядра 5, уменьшает входной размер на 4.
  • Слой пула с шагом 2, выходной размер 14x14 (6 каналов).
  • conv2 выходной размер 10x10 (16 каналов)
  • Еще один слой пула с шагом 2, размер вывода 5x5 (16 каналов)
  • Полностью подключенный слой (nn.Linear), соединяющий все входы 5x5x16 со всеми 120 выходами.

Более подробное руководство по оценке восприимчивого поля можно найти здесь .

...