Dropout 降低 Pytorch 中一层 LSTM 的测试和训练精度

数据挖掘 lstm 火炬 辍学
2022-02-22 07:21:39

我在 Mnist 数据上有一个带有 pytorch 的单层 lstm。我知道对于 pytorch 中的 lstm 的一层 lstm dropout 选项不起作用。所以,我在第二层的开头添加了一个退出,这是一个完全连接的层。然而,我观察到,在没有 dropout 的情况下,我在测试数据上获得了 97.75% 的准确率,而在 dropout 为 0.5 的情况下,我得到了 95.36%。我想问我是否做错了什么或者这种现象的原因是什么?我在测试中将其更改为 eval 模式,但我达到了 96.44% 的准确度。仍然比没有辍学的要少。非常感谢

# RNN Model (Many-to-One)
class RNN(nn.Module):
   def __init__(self, input_size, hidden_size, num_layers, num_classes):
    super(RNN, self).__init__()
    self.hidden_size = hidden_size
    self.num_layers = num_layers
    self.lstm = nn.LSTM(input_size, hidden_size, num_layers,
                        batch_first=True,bidirectional=True)

    self.fc = nn.Sequential(
        nn.Dropout(0.1),
       nn.Linear(hidden_size*2, num_classes),
        nn.Softmax(dim=1)
    )
def init_hidden(self,x):

     return(Variable(torch.zeros(self.num_layers*2, x.size(0), self.hidden_size)).cuda(), 
     Variable(torch.zeros(self.num_layers*2, x.size(0), self.hidden_size).cuda()))

def forward(self, x):
    # Set initial states 


    # Forward propagate RNN

    hidden = self.init_hidden(x)
    #print(len(hidden))
    out, _ = self.lstm(x, hidden)  

    # Decode hidden state of last time step
    out = self.fc(out[:, -1, :])  
    return out
2个回答

从我所见,LSTM 的 dropout 不应该高到 0.5 建议是 0.1 或更低。

这篇论文 - Where to Apply Dropout in Recurrent Neural Networks for Handwriting Recognition详细研究了如何将 Dropout 与 RNN 一起使用,其中一个建议是“在 lstm 层之前几乎总是比在它内部或之后更好”(第 3 页),所以你可以试试。但是,我相信这取决于您拥有的数据类型。

我记得读过一篇论文,其中 LSTM 辍学仅对大型 LSTM 有用(例如 4096 单元 x 4 层)。我现在找不到它,但在这篇文章中,作者提出了类似的建议——显示 dropout 在 1500 单元 x 2 层 lstm 上比 650 单元 x 2 层的结果更好,而较小的网络只会过拟合。我猜这个教训取决于你的 lstm 有多大以及你想要实现的目标——用例是在增加模型大小的同时防止过度拟合。

这可能是因为学习率。你需要降低你的学习率,让它运行更多的时期。