如何在 Pytorch 中处理很长的向量?

问题描述 投票:0回答:1

现在有问题了。我有一个用于数据去噪的降噪编码器。现在我的输入是一个长度为 20,000 的向量,我的模型结构如下。

class AutoEncoder(nn.Module):
  def __init__(self, input_dim, output_dim = None):
    super().__init__()
    if output_dim is None:
        output_dim = input_dim

    self.fc = nn.Sequential(
            nn.Linear(input_dim, 1024),
            nn.BatchNorm1d(1024),
            nn.GELU(),
            nn.Linear(1024,512),
            nn.BatchNorm1d(512),
            nn.GELU(),
            nn.Linear(512,256),
            nn.BatchNorm1d(256),
            nn.GELU(),
            nn.Linear(256,512),
            nn.BatchNorm1d(512),
            nn.GELU(),
            nn.Linear(512,1024),
            nn.BatchNorm1d(1024),
            nn.GELU(),
            nn.Linear(1024,input_dim)
    )

  def forward(self, x):
    out = self.fc(x)
    return out

我在原始数据中添加了噪声,添加的噪声遵循标准正态分布。该模型的目的是预测添加的噪声。损失函数是添加噪声和预测噪声之间的 L2 损失。然而,在训练过程中,无论我如何调整学习率或增加模型复杂度,我的损失一直很高,并且预测的噪声很小,明显与添加的噪声相去甚远,并且在检查梯度后,我发现梯度接近于0。当我把这个输入向量的长度减少到1000时,损失可以减少,但是收敛值并不理想。我该如何解决我遇到的问题?

我已经尝试过增加模型的复杂度,但这并没有帮助减少我的损失。我希望有一种方法可以让我的loss在训练过程中不断减少,最终收敛到一个理想的值。

vector pytorch autoencoder loss
1个回答
0
投票

如果我正确地理解了你的问题,根本问题是你的梯度正在消失。 跳过连接可以帮助解决梯度消失问题。要创建跳跃连接,只需将前面层的结果添加到后面的层(如算术)。

这是您使用方案 B 实现的架构,但可能值得尝试其他跳过连接方案。

class AutoEncoder(nn.Module):
  def __init__(self, input_dim, output_dim = None):
    super().__init__()
    if output_dim is None:
        output_dim = input_dim

    self.fc1 = nn.Sequential(
            nn.Linear(input_dim, 1024),
            nn.BatchNorm1d(1024),
            nn.GELU(),
    )
    
    self.fc2 = nn.Sequential(
            nn.Linear(1024,512),
            nn.BatchNorm1d(512),
            nn.GELU(),
    )

    self.fc3 = nn.Sequential(
            nn.Linear(512,256),
            nn.BatchNorm1d(256),
            nn.GELU(),
    )

    self.fc4 = nn.Sequential(
            nn.Linear(256,512),
            nn.BatchNorm1d(512),
            nn.GELU(),
    )

    self.fc5 = nn.Sequential(
            nn.Linear(512,1024),
            nn.BatchNorm1d(1024),
            nn.GELU(),
    )

    self.fc6 = nn.Linear(1024,input_dim)

  def forward(self, x):
    out = self.fc1(x)
    out = self.fc2(out) + out
    out = self.fc3(out) + out
    out = self.fc4(out) + out
    out = self.fc5(out) + out
    out = self.fc6(out)
    return out
© www.soinside.com 2019 - 2024. All rights reserved.