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