如何使用具有部分信息的批次来训练pytorch模型



在这个PyTorch模型中,我有两个具有两种不同模态的流数据,它们同时输入到模型中。数据流是顺序数据块。所以我有模态一M1 = [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4],[5,5,5,5]]和模态二M2 = [[11,11,11,11],[22,22,22,22],[33,33,33,33],[44,44,44,44]]。我想用一个系统来训练这个模型,在训练过程中,一批批连续数据将随机地具有部分或全部信息。

因此,在训练过程中会有三种可能性:M1M2将具有其完整的序列数据,或者M1将被剪裁,这意味着序列数据信息将被设置为零(例如M1 = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]](,而M2将具有其完全的序列数据信息,或者M2将被剪裁——这意味着M2中的顺序数据信息将设置为零,而CCD_ 9将具有其完整的顺序数据信息。

有没有PyTorch函数可以自动为我做到这一点,或者有人知道什么是实现这一点的好方法吗?

M1M2为用于训练的2D张量或3D批处理张量,设p1p2p3为M1、M2或两者均不为零的概率:

p1 = 0.5 # for example
p2 = 0.3 # for example
# p3 = 1- p1 - p2 = 0.2
randn = torch.rand(1)
if randn < p1:
M1 *= 0
elif randn > p1 and randn < p1+p2:
M2 *= 0
# pass M1 and M2 to your model

作为第二个注意事项,如果可能的话,您可能需要考虑将数据擦除的任何模态的梯度归零。你并不真的想让你的人际网络知道零值有任何意义,你有学习的风险。

根据模型的结构,这可能是可能的。例如,如果M1由一个网络分支处理,而M2由另一个分支处理,则可以进行约束,使损耗仅通过接收非零输入的分支反向传播。然而,对于其他网络结构,这可能是不可能的。

最新更新