【发布时间】:2019-11-13 07:46:51
【问题描述】:
我正在尝试使用 LSTM 和 Pytorch 进行练习。我用IMDB movie review dataset 来预测评论是正面还是负面。我使用 80% 的数据集进行训练,删除标点符号,使用 GloVe(具有 200 个暗角)作为嵌入层。
在训练之前,我还排除了太短(长度小于 50 个符号的评论)和太长(超过 1000 个符号的评论)的评论。
对于LSTM 层,我使用hidden dimension 256、num_layers 2 和one directional 参数和0.5 dropout。之后,我有全连接层。
对于训练,我使用了 nn.BCELoss 函数和 Adam 优化器 (lr=0.001)。
目前我在 7 个 epoch 后获得了 85% 的验证准确率和 98% 的训练准确率。我做了以下步骤来防止过度拟合并获得更高的准确性:
- 为 Adam 优化器使用 weight_decay,
- 尝试使用 SGD (lr=0.1, 0.001) 代替 Adam,
- 试图增加 LSTM 的 num_layers,
在所有这些情况下,模型根本没有学习,训练集和验证集的准确率都达到了 50%。
class CustomLSTM(nn.Module):
def __init__(self, vocab_size, use_embed=False, embed=None, embedding_size=200, hidden_size=256,
num_lstm_layers=2, bidirectional=False, dropout=0.5, output_dims=2):
super().__init__()
self.vocab_size = vocab_size
self.embedding_size = embedding_size
self.hidden_size = hidden_size
self.num_lstm_layers = num_lstm_layers
self.bidirectional = bidirectional
self.dropout = dropout
self.embedding = nn.Embedding(vocab_size, embedding_size)
if use_embed:
self.embedding.weight.data.copy_(torch.from_numpy(embed))
# self.embedding.requires_grad = False
self.lstm = nn.LSTM(input_size=embedding_size,
hidden_size=hidden_size,
num_layers=num_lstm_layers,
batch_first=True,
dropout=dropout,
bidirectional=bidirectional)
# print('output dims value ', output_dims)
self.drop_fc = nn.Dropout(0.5)
self.fc = nn.Linear(hidden_size, output_dims)
self.sig = nn.Sigmoid()
我想了解:
- 为什么模型在应用更改后根本无法学习?
- 如何提高准确率?
【问题讨论】:
-
你好,我也在用 rnn 和 IMDb 做一个项目,我想知道你是否可以分享一些关于你的模型关于 forward 函数的更多细节?因为我的模型的准确性停留在 50%,而没有将双向设置为 true。
标签: python machine-learning nlp pytorch lstm