Автоэнкодер для кодирования функций / категорий данных

У меня вопрос по поводу использования автоэнкодеров (в PyTorch). У меня есть табличный набор данных с категориальной функцией, который имеет 10 разных категорий. Названия у этих категорий очень разные - некоторые имена состоят из одного слова, некоторые - из двух или трех слов. Но всего у меня есть 10 уникальных названий категорий. Я пытаюсь создать автоэнкодер, который будет кодировать имена этих категорий - например, если у меня есть категория с именем 'Medium size class', я хочу посмотреть, можно ли обучить автоэнкодер кодировать это имя как что-то вроде 'mdmsc' или что-то подобное. Его использование заключалось бы в том, чтобы выяснить, какие точки данных трудно кодировать, а какие нетипичные, или что-то в этом роде. Я пытался адаптировать архитектуру автоэнкодера из различных онлайн-руководств, но, похоже, у меня ничего не работает, или я просто не знаю, как их использовать, поскольку все они связаны с изображениями. Может быть, кто-нибудь знает, как можно реализовать этот тип автокодировщика, если это вообще возможно?

Изменить: вот модель, которая у меня есть (я просто пытался адаптировать некоторые архитектуры, которые нашел в Интернете):

class Autoencoder(nn.Module):

def __init__(self, input_shape, encoding_dim):
    super(Autoencoder, self).__init__()

    self.encode = nn.Sequential(
        nn.Linear(input_shape, 128),
        nn.ReLU(True),
        nn.Linear(128, 64),
        nn.ReLU(True),
        nn.Linear(64, encoding_dim),
    )

    self.decode = nn.Sequential(
        nn.Linear(encoding_dim, 64),
        nn.ReLU(True),
        nn.Linear(64, 128),
        nn.ReLU(True),
        nn.Linear(128, input_shape)
    )

def forward(self, x):
    x = self.encode(x)
    x = self.decode(x)
    return x

model = Autoencoder(input_shape=10, encoding_dim=5)

Также я использую LabelEncoder(), а затем OneHotEncoder(), чтобы дать этим функциям / категориям, о которых я упоминал, числовую форму. Однако после обучения вывод такой же, как и ввод (без изменений в названии категории), но когда я пытаюсь использовать только часть кодировщика, я не могу применить LabelEncoder(), а затем OneHotEncoder() из-за проблем с размером. Я чувствую, что, может быть, я могу сделать что-то по-другому вначале, затем я пытаюсь придать этим функциям числовую форму, однако я не уверен, что мне делать.


person Ayn    schedule 21.05.2020    source источник
comment
Можете поделиться тем, что пробовали до сих пор?   -  person jayveesea    schedule 21.05.2020
comment
@jayveesea Я отредактировал свой исходный пост некоторым кодом.   -  person Ayn    schedule 22.05.2020


Ответы (1)


Сначала вам нужно будет настроить train_loader в зависимости от ваших данных, который будет перебирать ваши точки данных.

Затем вам нужно выяснить, какие потери вы собираетесь использовать и оптимизатор:

# mean-squared error loss
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=.001)  #learning rate depend on your task

Как только вы это сделаете, вы можете обучить свой автоэнкодер с помощью основных шагов:

for epoch in range(epochs):
        for features in train_loader:

            optimizer.zero_grad()
            outputs = model(batch_features)
            train_loss = criterion(outputs, features)
            train_loss.backward()
            optimizer.step()

После того, как модель будет обучена, вы можете изучить вложения, используя:

embedding = model.encode(your_input)
person Mabu    schedule 22.05.2020