Определите сеть в pytorch с неполными соединениями, например, сверткой - PullRequest
0 голосов
/ 24 февраля 2020

Я бы хотел обучить небольшую нейронную сеть в 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 хорошим подходом в моем случае? Я видел, что другой подход заключается в использовании маскированного слоя, но я не знаю, как его определить.

...