【问题标题】:How to map RNN output to tensor of class size?如何将 RNN 输出映射到类大小的张量?
【发布时间】:2021-05-03 11:34:44
【问题描述】:

我正在使用 GLOVE 嵌入和 RNN 构建二进制文本分类器。 nn.RNN 的输出是 torch.Size([1, 12, 150])。我需要将其映射到大小为 2 的维度,以便我可以根据实际类计算损失。我为大小为 100d 的手套嵌入提供大小为“单词”和 100 的张量。例如,一个 12 个单词的句子大小为 [1,12,100]

这是怎么做到的?

def forward(self, input, hidden):

    embeds = self.embedding(input) # glove embedding
    embeds = embeds.unsqueeze(0)
    embeds = embeds.float()
    
    output, hidden = self.rnn(embeds, hidden)
    # output is size [1, 12, 150]

    return output, hidden

【问题讨论】:

    标签: python deep-learning neural-network pytorch


    【解决方案1】:

    如果我理解正确,您正在尝试使用二进制类对一系列单词(在您的示例中为 12 个)进行分类。有很多方法可以做到这一点。本质上,您只需要通过可微操作来减小输出的大小,以便在训练期间学习有意义的参数。在另一种意义上,RNN 输出一组特征(从原始输入特征创建),这些特征在文本分类中更有用,因此您基本上需要构建一个二进制分类器,使用这些大小为 [词数 x 100]。

    例如,您可以简单地对所有特征进行平均或求和:

    # done in two steps to avoid averaging across batch examples
    pred = torch.average(output,dim = 2)
    pred = torch.average(pred,dim = 1) 
    

    您可以使用一个或多个全连接神经网络层:

    # in __init__()
    ...
    self.fc = nn.Linear(100,1)
    
    
    # in forward()
    ...
    output = torch.average(output,dim = 1)
    output = self.fc(output)
    output = torch.nn.functional.sigmoid(output)
    
    return output,hidden
    

    本质上,构建最终分类模块的方法没有错误,因为无论您定义什么结构,训练 RNN 都会产生与分类模块相关的特征。但是,您可能会发现有些方法比其他方法更有效,因此最好尝试一些方法,看看哪些方法有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多