0

我想用 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()

我想知道如何处理这种情况。我想我可以使用zipwith 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()

我认为这将是最简单的解决方案。但是,我不知道为什么,但我痴迷于我必须像以前的模型一样构建模型的想法。

以上代码均为伪代码。

谢谢你的建议 :)

4

0 回答 0