Deep learning LSTM多对多同步序列输入和输出Pytorch损耗是否减少?

Deep learning LSTM多对多同步序列输入和输出Pytorch损耗是否减少?,deep-learning,pytorch,lstm,recurrent-neural-network,seq2seq,Deep Learning,Pytorch,Lstm,Recurrent Neural Network,Seq2seq,我正在一个项目中工作,我为seq2seq构建了一个LSTM模型,其中我有一个同步的序列输入和输出。我的音频时间序列长度为32000,我的标签长度也为32000。我们希望对每个音频样本进行分类(假音频或真音频)。我的张量是这样的,举个例子 时间序列 tensor([-0.1635, -0.1510, -0.1455, ..., -0.3338, -0.3163, -0.2944]) 每个样本对应的标签0和1 tensor([0, 0, 0, ..., 0, 0, 0]) 在所有的音频中,大

我正在一个项目中工作,我为seq2seq构建了一个LSTM模型,其中我有一个同步的序列输入和输出。我的音频时间序列长度为32000,我的标签长度也为32000。我们希望对每个音频样本进行分类(假音频或真音频)。我的张量是这样的,举个例子

时间序列

tensor([-0.1635, -0.1510, -0.1455,  ..., -0.3338, -0.3163, -0.2944])
每个样本对应的标签0和1

tensor([0, 0, 0,  ..., 0, 0, 0])
在所有的音频中,大约有45-50%的音频样本标记为1表示假,基本上另一半标记为0表示真。因此,阶级不平衡在这里不是问题。此外,假音频将始终位于音频的某个区域。例如,在一个长度为32000的音频时间序列中,假区域可以是22000到30000,或者5000到24000,举两个例子

我最初用一个LSTM尝试这个问题,它接受32000的固定输入大小并对其进行训练。我注意到,我的模型只预测了一个班级,损失从未减少,甚至在5个时期之后。然后我读到长输入序列的LSTM,比如我的音频,很容易消失梯度,可能是无法学习的模型。所以我改变了我的训练方法,这样对于Pytorch数据加载器中的每一批,我们将32000的音频时间序列分割成更小的块(我尝试了1002005001000…等等),然后我们对这些更小的块进行反向传播。使用这种方法,我的模型在训练期间能够有一些回忆,因此它可以预测两个课程,但损失仍然没有减少,即使在大约5个时期之后

class LSTM(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_dim = 2, batch_size = batch_size):
        super(LSTM , self).__init__()
        self.num_layers = num_layers
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.batch_size = batch_size
        self.rnn_state = None
        self.lstm = nn.LSTM(self.input_size , self.hidden_size , self.num_layers, batch_first = True)
        self.to_linear = nn.Linear(self.hidden_size, output_dim)
    def repackage_rnn_state(self):

        self.rnn_state = self._detach_rnn_state(self.rnn_state)

    def _detach_rnn_state(self, h):

        if isinstance(h, torch.Tensor):
            return h.detach()
        else:
            return tuple(self._detach_rnn_state(v) for v in h)


    def forward(self, x):
        lstm_out, self.rnn_state = self.lstm(x , self.rnn_state)
        logits = self.to_linear(lstm_out)
        scores = F.softmax(logits, dim = 2)
        return scores



for epoch in range(num_epochs):

    running_loss_train , accuracy_train = 0 , 0

    network.hidden = network.init_hidden()

    for batch_idx, batch in enumerate(train_loader):


        new_time_series , new_labels = batch

        new_time_series, new_labels = new_time_series.to(device), new_labels.to(device)

        optimizer.zero_grad()

        # forward pass feeding the padded sequence

        preds = network(new_time_series.unsqueeze(2))

        preds = preds.view(preds.shape[0]*preds.shape[1], preds.shape[2])

        train_loss = criterion(preds, new_labels.flatten().long())

        train_loss.backward()

        # gradient clipping here just before the parameter updates, clips inplace, clip value = 1

        torch.nn.utils.clip_grad_norm_(network.parameters(),clip)

        optimizer.step()

        running_loss_train+=train_loss.detach().item()/new_time_series.shape[0]

        _ ,predictions = torch.max(preds,1)

        metrics = get_evaluations_ignoring_padding(new_labels, predictions, 2)

        accuracy_train+=metrics['Accuracy']


        if batch_idx%100==0:
            print('Epoch : %d | BatchID : %d | Train Loss : %.3f | Train Acc : %.3f ' % 
                  (epoch , batch_idx, train_loss.item() / new_time_series.shape[0] ,
                   metrics['Accuracy']))
上面的代码是针对我将时间序列分割成多个块的“截断”反向传播。所以之前我在32000码的长度上训练时没有重新包装或分离状态。用原来的方法和chunk方法都没有减少损失

我之前对真实音频和假音频进行了多对一分类,其中一半的音频没有任何假区域,另一半有一些假区域。我在CNN模型上得到了99%的准确率,而且仅在3个时代之后。所以我认为我的数据很容易训练,只是因为它现在是一个多对多的问题,不应该有学习问题

我的代码有问题吗

就我的这类问题培训LSTM不合适吗

我想要一些关于你如何进行这类训练的建议

请让我知道,如果你需要更多的信息,我会更新我的问题,谢谢