Работа с данными разного размера в многозадачном обучении (Pytorch) - PullRequest
0 голосов
/ 27 марта 2019

Я хочу создать многозадачную модель обучения с помощью Pytorch.

Разработанная мной модель следует жесткому совместному использованию параметров (http://ruder.io/multi-task/)

Проблема в том, что размер каждого набора данных различен.Поэтому их нельзя обучить одному и тому же циклу for в модели, подобной этой:

for epoch in range(EPOCHS):
    for data in dataloader_train:
        output_a = model(data.a)
        output_b = model(data.b)
        output_c = model(data.c)

        loss_a = criterion(output_a, data.target_a)
        loss_b = criterion(output_b, data.target_b)
        loss_c = criterion(output_c, data.target_c)

        optimizer.zero_grad()
        loss.backward([loss_a, loss_b, loss_c])
        optimizer.step()

Я хотел бы знать, как справиться с этой ситуацией. Я подумал, что могу использовать zip с itertools.cycle ( Перебор двух списков разных размеров в python ), но это может существенно повлиять на модель, поскольку изменяет частоту определенных данных, особенно расположенных в раннем индексе:

data.a data.b
a      1
b      2
c      3
a      4
b      5
c      1
a      2
b      3

С другой стороныС другой стороны, если я рассматриваю это как разницу между эпохами наборов данных, то, похоже, у него нет проблем: например, data.a имеет 5 эпох, а data.b - 3 эпохи, когда EPOCHS == 15.

.Или, если нет проблем с проектированием модели следующим образом:

for epoch in range(EPOCHS):
    for data, target in data_a:
        output = model(data)
        loss = criterion(output, target)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    for data, target in data_b:
        output = model(data)
        loss = criterion(output, target)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    for data, target in data_c:
        output = model(data)
        loss = criterion(output, target)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

Я думаю, что это будет самое простое решение. Однако я не знаю почему, но я был одержим идеей, что я долженпостроить модэль, как бывшая модель.

все коды выше псевдокод.

спасибо за совет :))

...