Multi-class for sentence classification with pytorch (Using nn.LSTM)
Multi-class for sentence classification with pytorch (Using nn.LSTM)
我有这个网络,我从 this 教程中获取的,我想将句子作为输入(已经完成),结果只是一个单线张量。
从教程中,这句话“John's dog likes food”,返回一个 1 列张量:
tensor([[-3.0462, -4.0106, -0.6096],
[-4.8205, -0.0286, -3.9045],
[-3.7876, -4.1355, -0.0394],
[-0.0185, -4.7874, -4.6013]])
...和 class 列表:
tag_list[ “name”, “verb”, “noun”]
每一行都有一个标签与这个词相关联的概率。 (第一个词有 [-3.0462, -4.0106, -0.6096] 向量,其中最后一个元素对应于最高得分标签,"noun")
教程的数据集如下所示:
training_data = [
("The dog ate the apple".split(), ["DET", "NN", "V", "DET", "NN"]),
("Everybody read that book".split(), ["NN", "V", "DET", "NN"])
]
我希望我的格式是这样的:
training_data = [
("Hello world".split(), ["ONE"]),
("I am dog".split(), ["TWO"]),
("It's Britney glitch".split(), ["THREE"])
]
参数定义为:
class LSTMTagger(nn.Module):
def __init__(self, embedding_dim, hidden_dim, vocab_size, tagset_size):
super(LSTMTagger, self).__init__()
self.hidden_dim = hidden_dim
self.word_embeddings = nn.Embedding(vocab_size, embedding_dim)
self.lstm = nn.LSTM(embedding_dim, hidden_dim)
self.hidden2tag = nn.Linear(hidden_dim, tagset_size)
def forward(self, sentence):
embeds = self.word_embeddings(sentence)
lstm_out, _ = self.lstm(embeds.view(len(sentence), 1, -1))
tag_space = self.hidden2tag(lstm_out.view(len(sentence), -1))
tag_scores = F.log_softmax(tag_space, dim=1)
return tag_scores
截至目前,输入和输出的大小不匹配,我得到:
ValueError:预期输入 batch_size (2) 以匹配目标 batch_size (1).
似乎由于大小不匹配,标准函数不接受输入:
loss = criterion(tag_scores, targets)
我读到最后一层可以定义为 nn.Linear 以压缩输出,但我似乎无法得到任何结果。尝试了其他损失函数
如何更改它以使模型class验证句子,而不是像原始教程中那样验证每个单词?
我通过简单地获取最后一个
的隐藏状态解决了这个问题
tag_space = self.hidden2tag(lstm_out[-1])
我有这个网络,我从 this 教程中获取的,我想将句子作为输入(已经完成),结果只是一个单线张量。
从教程中,这句话“John's dog likes food”,返回一个 1 列张量:
tensor([[-3.0462, -4.0106, -0.6096],
[-4.8205, -0.0286, -3.9045],
[-3.7876, -4.1355, -0.0394],
[-0.0185, -4.7874, -4.6013]])
...和 class 列表:
tag_list[ “name”, “verb”, “noun”]
每一行都有一个标签与这个词相关联的概率。 (第一个词有 [-3.0462, -4.0106, -0.6096] 向量,其中最后一个元素对应于最高得分标签,"noun")
教程的数据集如下所示:
training_data = [
("The dog ate the apple".split(), ["DET", "NN", "V", "DET", "NN"]),
("Everybody read that book".split(), ["NN", "V", "DET", "NN"])
]
我希望我的格式是这样的:
training_data = [
("Hello world".split(), ["ONE"]),
("I am dog".split(), ["TWO"]),
("It's Britney glitch".split(), ["THREE"])
]
参数定义为:
class LSTMTagger(nn.Module):
def __init__(self, embedding_dim, hidden_dim, vocab_size, tagset_size):
super(LSTMTagger, self).__init__()
self.hidden_dim = hidden_dim
self.word_embeddings = nn.Embedding(vocab_size, embedding_dim)
self.lstm = nn.LSTM(embedding_dim, hidden_dim)
self.hidden2tag = nn.Linear(hidden_dim, tagset_size)
def forward(self, sentence):
embeds = self.word_embeddings(sentence)
lstm_out, _ = self.lstm(embeds.view(len(sentence), 1, -1))
tag_space = self.hidden2tag(lstm_out.view(len(sentence), -1))
tag_scores = F.log_softmax(tag_space, dim=1)
return tag_scores
截至目前,输入和输出的大小不匹配,我得到: ValueError:预期输入 batch_size (2) 以匹配目标 batch_size (1).
似乎由于大小不匹配,标准函数不接受输入:
loss = criterion(tag_scores, targets)
我读到最后一层可以定义为 nn.Linear 以压缩输出,但我似乎无法得到任何结果。尝试了其他损失函数
如何更改它以使模型class验证句子,而不是像原始教程中那样验证每个单词?
我通过简单地获取最后一个
的隐藏状态解决了这个问题tag_space = self.hidden2tag(lstm_out[-1])