在这个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]]
。我希望在训练过程中,使用一个系统,该系统会在训练时随机使用部分或完整的信息来处理顺序数据的批次。
因此,训练过程中有三种可能的情况:M1
和 M2
都具有完整的顺序数据,或者 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
中的顺序数据信息被设置为零,而 M1
具有完整的顺序数据信息。
有没有PyTorch函数可以自动帮我做到这一点,或者有人知道如何实现这种方法吗?
回答:
让 M1
和 M2
成为2D张量或3D批处理张量用于训练,并让 p1
、p2
和 p3
分别是M1、M2或两者均不置零的概率:
p1 = 0.5 # 例如p2 = 0.3 # 例如# p3 = 1- p1 - p2 = 0.2randn = torch.rand(1)if randn < p1: M1 *= 0elif randn > p1 and randn < p1+p2: M2 *= 0# 将 M1 和 M2 传递给您的模型
作为补充说明,如果可能,您可能需要考虑对数据被擦除的模态进行梯度归零处理。您不希望您的网络学习到零值有任何意义,而这正是您可能面临的风险。
根据您的模型结构,这可能是可行的。例如,如果 M1
由一个网络分支处理,而 M2
由另一个不同的分支处理,您可以限制损失仅通过接收非零输入的分支进行反向传播。然而,对于其他网络结构,这可能无法实现。