我想用 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
with 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 个 epoch,data.b
当 时有 3 个 epoch 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()
我认为这将是最简单的解决方案。但是,我不知道为什么,但我痴迷于我必须像以前的模型一样构建模型的想法。
以上代码均为伪代码。
谢谢你的建议 :)