【问题标题】:How can I use an LSTM to classify a series of vectors into two categories in Pytorch如何使用 LSTM 在 Pytorch 中将一系列向量分为两类
【发布时间】:2021-03-05 06:20:28
【问题描述】:

我有一系列向量表示一段时间内的信号。我想将信号的一部分分为两类:1 或 0。使用 LSTM 的原因是我相信网络需要了解整个信号才能进行分类。

我的问题是开发 PyTorch 模型。下面是我想出的课程。

class LSTMClassifier(nn.Module):

   def __init__(self, input_dim, hidden_dim, label_size, batch_size):
       self.lstm = nn.LSTM(input_dim, hidden_dim)
       self.hidden2label = nn.Linear(hidden_dim, label_size)
       self.hidden = self.init_hidden()

   def init_hidden(self):
       return (torch.zeros(1, self.batch_size, self.hidden_dim), 
               torch.zeros(1, self.batch_size, self.hidden_dim))

   def forward(self, x):
       lstm_out, self.hidden = self.lstm(x, self.hidden)
       y  = self.hidden2label(lstm_out[-1])
       log_probs = F.log_softmax(y)
       return log_probs

但是,这个模型给出了一堆形状错误,我无法理解正在发生的一切。我先看了this SO 问题。

【问题讨论】:

    标签: machine-learning pytorch classification lstm


    【解决方案1】:

    您应该关注PyTorch documentation,尤其是inputsoutputs 部分,始终

    分类器应该是这样的:

    import torch
    import torch.nn as nn
    
    
    class LSTMClassifier(nn.Module):
        def __init__(self, input_dim, hidden_dim, label_size):
            super().__init__()
            self.lstm = nn.LSTM(input_dim, hidden_dim, batch_first=True)
            self.hidden2label = nn.Linear(hidden_dim, label_size)
    
        def forward(self, x):
            _, (h_n, _) = self.lstm(x)
            return self.hidden2label(h_n.reshape(x.shape[0], -1))
    
    
    clf = LSTMClassifier(100, 200, 1)
    inputs = torch.randn(64, 10, 100)
    clf(inputs)
    

    需要考虑的要点:

    • 始终使用super().__init__(),因为它在您的神经网络中注册模块,允许挂钩等。
    • 使用batch_first=True,这样您就可以传递形状为(batch, timesteps, n_features) 的输入
    • 不需要init_hiddenzeros,如果未初始化则为默认值
    • 无需每次将self.hidden传递给LSTM。此外,您不应该这样做。这意味着每批数据中的元素在某种程度上都是下一步,而批元素应该是不相交的,您可能不需要。
    • _, (h_n, _) 从最后一个时间步返回最后一个隐藏单元格,形状完全一致:(num_layers * num_directions, batch, hidden_size)。在我们的例子中 num_layersnum_directions1 所以我们得到 (1, batch, hidden_size) 张量作为输出
    • 重塑为(batch, hidden_size),使其可以通过线性层
    • 不激活就返回 logits。只有一个,如果它是一个二进制案例。使用torch.nn.BCEWithLogitsLoss 作为二元情况的损失,torch.nn.CrossEntropyLoss 用于多类情况。 sigmoid 也适用于二进制大小写,softmaxlog_softmax 适用于多类。
    • 对于二进制只需要一个输出。任何低于0 的值(如果在这种情况下返回非标准化概率)都被认为是负数,高于正数的任何值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 2019-09-28
      • 2023-04-05
      • 2019-10-23
      • 2016-09-15
      • 2019-01-24
      • 1970-01-01
      相关资源
      最近更新 更多