如何将RNN输出映射到类大小的张量



我正在使用GLOVE嵌入和RNN构建一个二进制文本分类器。nn的输出。RNN是火炬。尺寸([1,12150](。我需要将其映射到大小为2的维度,这样我就可以根据实际类计算损失。Im馈送大小为"单词"的张量,对于大小为100d的手套嵌入,为100。例如,一个12个单词的句子的大小为[1,12100]

这是怎么做到的?

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

如果我理解正确,您正试图用二进制类对一系列单词(在您的示例中为12(进行分类。有很多方法可以做到这一点。从本质上讲,你只需要用可微分运算来减少输出的大小,这样在训练中就能学到有意义的参数。从另一个意义上讲,RNN输出一组特征(根据原始输入特征创建(,这些特征在文本分类中更有用,因此您基本上需要构建一个二进制分类器,该分类器使用这些大小为[字数x100]的特征。

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

# 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都会产生与分类模块有区别的特征。然而,你可能会发现有些东西比其他东西更有效,所以最好尝试一些东西,看看什么有效。

最新更新