如何将多层添加到 RNN 模块以进行情感分析?火炬
How to add multiple layers to an RNN module for sentiment analysis? Pytorch
我正在尝试使用 Pytorch(新手)创建情绪分析模型
import torch.nn as nn
class RNN(nn.Module):
def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim, dropout):
super().__init__() #to call the functions in the superclass
self.embedding = nn.Embedding(input_dim, embedding_dim) #Embedding layer to create dense vector instead of sparse matrix
self.rnn = nn.RNN(embedding_dim, hidden_dim)
self.fc = nn.Linear(hidden_dim, output_dim)
self.dropout = nn.Dropout(dropout)
def forward(self, text):
embedded = self.embedding(text)
output, hidden = self.rnn(embedded)
hidden = self.dropout(hidden[-1,:,:])
nn.Sigmoid()
return self.fc(hidden)
但是,准确度低于 50%,我想添加一个额外的层,也许是另一个线性层,然后再将其馈送到最后一个线性层以获得预测。我可以在 RNN 之后和最后一个 Linear 之前添加什么样的层?还有我应该用什么喂它?
我试过简单地添加另一个
output, hidden= self.fc(hidden)
但我明白了
ValueError: too many values to unpack (expected 2)
我认为这是因为激活和丢弃的前一层的输出不同。非常感谢您的帮助。
谢谢
你非常接近,只需将你的转接电话更改为:
import torch.nn.functional as F
class model_RNN(nn.Module):
def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim, dropout):
super().__init__() #to call the functions in the superclass
self.embedding = nn.Embedding(input_dim, embedding_dim) #Embedding layer to create dense vector instead of sparse matrix
self.rnn = nn.RNN(embedding_dim, hidden_dim)
self.hidden_fc = nn.Linear(hidden_dim,hidden_dim)
self.out_fc = nn.Linear(hidden_dim, output_dim)
self.dropout = nn.Dropout(dropout)
def forward(self, text):
embedded = self.embedding(text)
output, hidden = self.rnn(embedded)
hidden = self.dropout(hidden[-1,:,:])
hidden = F.relu(torch.self.hidden_fc(hidden))
return self.out_fc(hidden)
请注意,调用 nn.Sigmoid() 不会对您的模型输出做任何事情,因为它只会创建一个 S 形层,但不会在您的数据上调用它。你要的大概是torch.sigmoid(self.fc(hidden))
。尽管我会说不建议使用输出激活,因为一些常见的损失函数需要原始 logits。不过,请确保在评估模式下调用模型后应用 sigmoid!
我正在尝试使用 Pytorch(新手)创建情绪分析模型
import torch.nn as nn
class RNN(nn.Module):
def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim, dropout):
super().__init__() #to call the functions in the superclass
self.embedding = nn.Embedding(input_dim, embedding_dim) #Embedding layer to create dense vector instead of sparse matrix
self.rnn = nn.RNN(embedding_dim, hidden_dim)
self.fc = nn.Linear(hidden_dim, output_dim)
self.dropout = nn.Dropout(dropout)
def forward(self, text):
embedded = self.embedding(text)
output, hidden = self.rnn(embedded)
hidden = self.dropout(hidden[-1,:,:])
nn.Sigmoid()
return self.fc(hidden)
但是,准确度低于 50%,我想添加一个额外的层,也许是另一个线性层,然后再将其馈送到最后一个线性层以获得预测。我可以在 RNN 之后和最后一个 Linear 之前添加什么样的层?还有我应该用什么喂它? 我试过简单地添加另一个
output, hidden= self.fc(hidden)
但我明白了
ValueError: too many values to unpack (expected 2)
我认为这是因为激活和丢弃的前一层的输出不同。非常感谢您的帮助。
谢谢
你非常接近,只需将你的转接电话更改为:
import torch.nn.functional as F
class model_RNN(nn.Module):
def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim, dropout):
super().__init__() #to call the functions in the superclass
self.embedding = nn.Embedding(input_dim, embedding_dim) #Embedding layer to create dense vector instead of sparse matrix
self.rnn = nn.RNN(embedding_dim, hidden_dim)
self.hidden_fc = nn.Linear(hidden_dim,hidden_dim)
self.out_fc = nn.Linear(hidden_dim, output_dim)
self.dropout = nn.Dropout(dropout)
def forward(self, text):
embedded = self.embedding(text)
output, hidden = self.rnn(embedded)
hidden = self.dropout(hidden[-1,:,:])
hidden = F.relu(torch.self.hidden_fc(hidden))
return self.out_fc(hidden)
请注意,调用 nn.Sigmoid() 不会对您的模型输出做任何事情,因为它只会创建一个 S 形层,但不会在您的数据上调用它。你要的大概是torch.sigmoid(self.fc(hidden))
。尽管我会说不建议使用输出激活,因为一些常见的损失函数需要原始 logits。不过,请确保在评估模式下调用模型后应用 sigmoid!