Я бы хотел обучить небольшую нейронную сеть в Pytorch , которая принимает в качестве входа 8-мерный вектор и предсказывает одну из трех возможных категорий. Первый скрытый слой должен содержать 6 нейронов, где каждый нейрон принимает активации только 3 последовательных измерений во входном слое. Второй скрытый слой также должен содержать 6 узлов и быть полностью соединенным, а последний слой должен быть выходным слоем с 3 нейронами. Таким образом, топология:
топология сети
Допустим, мини-пакет состоит из 64 (8-мерных) точек данных.
Я пытался реализовать первый слой с использованием 1D свертки. Поскольку 1-мерный сверточный фильтр предполагает, что входные данные представляют собой последовательность точек, я подумал, что хорошим подходом является определение 6 фильтров, работающих на 8 одномерных точках:
import torch.nn as nn
import torch.nn.functional as functional
class ExampleNet(nn.Module):
def __init__(self, batch_size, input_channels, output_channels):
super(ExampleNet, self).__init__()
self._layer1 = nn.Conv1d(in_channels=1, out_channels=input_channels - 2, kernel_size=3, stride=1)
self._layer2 = nn.Linear(in_features=input_channels - 2, out_features=input_channels - 2)
self._layer3 = nn.Linear(in_features=input_channels - 2, out_features=output_channels)
def forward(self, x):
x = functional.relu(self._layer1(x))
x = functional.relu(self._layer2(x))
x = functional.softmax(self._layer3(x))
return x
net = ExampleNet(64, 8, 3)
Я знаю, что Pytorch ожидает последовательность массивов размером 64 х 8 х 1 каждый при обучении в сети. Однако, поскольку я применяю 1D сверточные фильтры нетрадиционным способом, я думаю, что у меня должны быть входные массивы размером 64 x 1 x 8, и я ожидаю вывода размером 64 x 3. Я использую следующую мини-партию случайных точек для запуска по сети:
# Generate a mini-batch of 64 samples
input = torch.randn(64, 1, 8)
out = net(input)
print(out.size())
И вывод, который я получаю, говорит мне, что я определил неправильную топологию. Как бы вы посоветовали мне определить слои, которые мне нужны? Является ли использование Conv1d
хорошим подходом в моем случае? Я видел, что другой подход заключается в использовании маскированного слоя, но я не знаю, как его определить.