繁体   English   中英

如何将 map RNN output 转换为 class 大小的张量?

[英]How to map RNN output to tensor of class size?

我正在使用 GLOVE 嵌入和 RNN 构建二进制文本分类器。 nn.RNN 的 output 是 torch.Size([1, 12, 150])。 我需要将 map 调整为尺寸 2,以便我可以根据实际 class 计算损失。 我为大小为 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

如果我理解正确,您正在尝试使用二进制 class 对一系列单词(在您的示例中为 12 个)进行分类。 有很多方法可以做到这一点。 本质上,您只需要通过可微分运算减小 output 的大小,以便在训练期间学习有意义的参数。 在另一种意义上,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 都会产生与分类模块相关的特征。 但是,您可能会发现有些事情比其他事情更有效,因此最好尝试一些事情,看看什么有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM