Neural network Pytorch小型批处理使模型不受训练

Neural network Pytorch小型批处理使模型不受训练,neural-network,nlp,pytorch,mini-batch,Neural Network,Nlp,Pytorch,Mini Batch,我试图用二进制特征对序列进行分类。我有一个序列/标签对的数据集,我使用一个简单的单层LSTM对每个序列进行分类。在我实现minibacking之前,我在测试集上获得了80%的合理精度,平均训练损失将从0.6降到0.3 我使用本教程的部分内容实现了小型批处理: 然而,现在我的模型不会比70-72%做得更好。70%的数据有一个标签,批量大小设置为1,所有其他参数完全相同。此外,损失从0.0106开始,很快变得非常小,结果没有显著变化。我觉得不批处理和大小为1的批处理之间的结果应该是相同的,所以我可能

我试图用二进制特征对序列进行分类。我有一个序列/标签对的数据集,我使用一个简单的单层LSTM对每个序列进行分类。在我实现minibacking之前,我在测试集上获得了80%的合理精度,平均训练损失将从0.6降到0.3

我使用本教程的部分内容实现了小型批处理:

然而,现在我的模型不会比70-72%做得更好。70%的数据有一个标签,批量大小设置为1,所有其他参数完全相同。此外,损失从0.0106开始,很快变得非常小,结果没有显著变化。我觉得不批处理和大小为1的批处理之间的结果应该是相同的,所以我可能有一个bug,但就我的一生而言,我找不到它。我的代码如下

培训代码一个时代:

for i in t:
    model.zero_grad()

    # prep inputs
    last = i+self.params['batch_size']
    last = last if last < len(train_data) else len(train_data)
    batch_in, lengths, batch_targets = self.batch2TrainData(train_data[shuffled][i:last], word_to_ix, label_to_ix)

    iters += 1

    # forward pass.
    tag_scores = model(batch_in, lengths)

    # compute loss, then do backward pass, then update gradients
    loss = loss_function(tag_scores, batch_targets)
    loss.backward()

    # Clip gradients: gradients are modified in place
    nn.utils.clip_grad_norm_(model.parameters(), 50.0)

    optimizer.step()
型号:

class LSTMClassifier(nn.Module):

    def __init__(self, params, vocab_size, tagset_size, weights_matrix=None):
        super(LSTMClassifier, self).__init__()
        self.hidden_dim = params['hidden_dim']

        if weights_matrix is not None:
            self.word_embeddings = nn.Embedding.from_pretrained(weights_matrix)
        else:
            self.word_embeddings = nn.Embedding(vocab_size, params['embedding_dim'])

        self.lstm = nn.LSTM(params['embedding_dim'], self.hidden_dim, bidirectional=False)

        # The linear layer that maps from hidden state space to tag space
        self.hidden2tag = nn.Linear(self.hidden_dim, tagset_size)

    def forward(self, batch_in, lengths):
        embeds = self.word_embeddings(batch_in)
        packed = nn.utils.rnn.pack_padded_sequence(embeds, lengths)
        lstm_out, _ = self.lstm(packed)
        outputs, _ = nn.utils.rnn.pad_packed_sequence(lstm_out)
        tag_space = self.hidden2tag(outputs)
        tag_scores = F.log_softmax(tag_space, dim=0)
        return tag_scores[-1]

对于其他有类似问题的人,我让它起作用。我删除了log_softmax计算,因此:

tag_space = self.hidden2tag(outputs)
tag_scores = F.log_softmax(tag_space, dim=0)
return tag_scores[-1]
变成这样:

tag_space = self.hidden2tag(outputs)
return tag_space[-1]
我还将NLLLoss更改为CrossEntropyLoss(上面未显示),并初始化了CrossEntropyLoss,没有参数,也没有忽略索引


我不知道为什么这些更改是必要的,文档甚至说NLLLOS应该在log_softmax层之后运行,但他们让我的模型工作,并将我的损失恢复到合理的范围~0.5。

那么,为什么不使用torch.utils.data.Dataset和torch.utils.data.DataLoader来生成您的小批量?除了避免错误,它比你正在做的更快。我会试试,但我认为这并不能解决我的问题。我已经检查了我的模型的输入,它和我期望的一样。
tag_space = self.hidden2tag(outputs)
return tag_space[-1]