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

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


person Venkat    schedule 14.02.2018    source источник
comment
pytorch.org/tutorials/beginner/data_loading_tutorial.html   -  person Manuel Lagunas    schedule 15.02.2018


Ответы (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) В самом начале дополните все ваши последовательности начальными нулями, чтобы все они имели ту же длину, что и ваша самая длинная последовательность всех ваших данных.

OR

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

person patapouf_ai    schedule 22.02.2018