Мини-тренинг для вводов переменных размеров

У меня есть список LongTensors и еще один список меток. Я новичок в PyTorch и RNN, поэтому я не совсем понимаю, как реализовать обучение по мини-пакетам для данных, которые у меня есть. Эти данные гораздо больше, но я хочу, чтобы они были простыми, поэтому я могу понять только, как реализовать обучающую часть по мини-пакетам. Я делаю мультиклассовую классификацию, основанную на окончательном скрытом состоянии LSTM/GRU, обученного на входах переменной длины. Мне удалось заставить его работать с размером пакета 1(в основном SGD), но я борюсь с внедрением мини-пакетов.

Должен ли я заполнить последовательности до максимального размера и создать новую тензорную матрицу большего размера, которая содержит все элементы? Я имею в виду, как это:

inputs = pad(sequences)
train = DataLoader(inputs, batch_size=batch_size, shuffle=True)
for i, data in train:
   #do stuff using LSTM and/or GRU models

Является ли это общепринятым способом обучения мини-пакетам на пользовательских данных? Я не смог найти никаких руководств по загрузке пользовательских данных с использованием DataLoader(но я предполагаю, что это способ создания пакетов с использованием pyTorch?)

У меня есть еще одно сомнение в отношении прокладки. Причина, по которой я использую LSTM/GRU, заключается в переменной длине ввода. Не отступает ли отступление цели? Обивка необходима для обучения мини-партии?

1 ответ

Решение

Да. Проблема, связанная с обучением мини-пакетам последовательностей различной длины, заключается в том, что нельзя составлять последовательности различной длины вместе.

Обычно это можно сделать.

for e in range(epochs):
    sequences = shuffle(sequences)
    for mb in range(len(sequences)/mb_size):
        batch = torch.stack(sequences[mb*mb_size:(mb+1)*mb_size])

а затем вы применяете свою нейронную сеть в вашей партии. Но поскольку ваши последовательности имеют разную длину, torch.stack не удастся. Поэтому на самом деле вам нужно заполнить свои последовательности нулями, чтобы они все имели одинаковую длину (по крайней мере, в мини-пакете). Итак, у вас есть 2 варианта:

1) В самом начале дополните все свои последовательности начальными нулями, чтобы они все имели длину, равную самой длинной последовательности всех ваших данных.

ИЛИ ЖЕ

2) На лету, для каждой мини-партии, перед тем как сложить последовательности вместе, добавьте все последовательности, которые войдут в мини-пакет, с начальными нулями, чтобы все они имели длину, равную самой длинной последовательности мини-пакета.

Другие вопросы по тегам