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-мерное представление изображения.