zoukankan      html  css  js  c++  java
  • 【pytorch】pytorch-LSTM

    pytorch-LSTM()

    torch.nn包下实现了LSTM函数,实现LSTM层。多个LSTMcell组合起来是LSTM。

    LSTM自动实现了前向传播,不需要自己对序列进行迭代。

    LSTM的用到的参数如下:创建LSTM指定如下参数,至少指定前三个参数

    input_size:
    	输入特征维数
    hidden_size:
    	隐层状态的维数
    num_layers:
    	RNN层的个数,在图中竖向的是层数,横向的是seq_len
    bias:
    	隐层状态是否带bias,默认为true
    batch_first:
    	是否输入输出的第一维为batch_size,因为pytorch中batch_size维度默认是第二维度,故此选项可以将	batch_size放在第一维度。如input是(4,1,5),中间的1是batch_size,指定batch_first=True后就是(1,4,5)
    dropout:
    	是否在除最后一个RNN层外的RNN层后面加dropout层
    bidirectional:
    	是否是双向RNN,默认为false,若为true,则num_directions=2,否则为1
    

    为了统一,以后都batch_first=True

    LSTM的输入为:LSTM(input,(h0,co))

    其中,指定batch_first=True​后,input就是(batch_size,seq_len,input_size)​

    (h0,c0)是初始的隐藏层,因为每个LSTM单元其实需要两个隐藏层的。记hidden=(h0,c0)

    其中,h0的维度是(num_layers*num_directions, batch_size, hidden_size)

    c0维度同h0。注意,即使batch_first=True,这里h0的维度依然是batch_size在第二维度

    LSTM的输出为:out,(hn,cn)

    其中,out是每一个时间步的最后一个隐藏层h的输出,假如有5个时间步(即seq_len=5),则有5个对应的输出,out的维度是:(batch_size,seq_len,hidden_size)

    hidden=(hn,cn),他自己实现了时间步的迭代,每次迭代需要使用上一步的输出和hidden层,最后一步hidden=(hn,cn)记录了最后一各时间步的隐藏层输出,有几层对应几个输出,如果这个是RNN-encoder,则hn,cn就是中间的编码向量。hn的维度是(num_layers*num_directions,batch_size,hidden_size),cn同。

    应用LSTM

    创建一LSTM:

    lstm = torch.nn.LSTM(input_size,hidden_size,num_layers,batch_first=True)

    forward使用LSTM层:

    out,hidden = lstm(input,hidden)

    其中,hidden=(h0,c0)是个tuple

    最终得到out,hidden

    举例:

    import torch
    # 实现一个num_layers层的LSTM-RNN
    class RNN(torch.nn.Module):
        def __init__(self,input_size, hidden_size, num_layers):
            super(RNN,self).__init__()
            self.input_size = input_size
            self.hidden_size=hidden_size
            self.num_layers=num_layers
            self.lstm = torch.nn.LSTM(input_size=input_size,hidden_size=hidden_size,num_layers=num_layers,batch_first=True)
        
        def forward(self,input):
            # input应该为(batch_size,seq_len,input_szie)
            self.hidden = self.initHidden(input.size(0))
            out,self.hidden = lstm(input,self.hidden)
            return out,self.hidden
        
        def initHidden(self,batch_size):
            if self.lstm.bidirectional:
                return (torch.rand(self.num_layers*2,batch_size,self.hidden_size),torch.rand(self.num_layers*2,batch_size,self.hidden_size))
            else:
                return (torch.rand(self.num_layers,batch_size,self.hidden_size),torch.rand(self.num_layers,batch_size,self.hidden_size))
    
    input_size = 12
    hidden_size = 10
    num_layers = 3
    batch_size = 2
    model = RNN(input_size,hidden_size,num_layers)
    # input (seq_len, batch, input_size) 包含特征的输入序列,如果设置了batch_first,则batch为第一维
    input = torch.rand(2,4,12)
    model(input)
    
  • 相关阅读:
    [置顶] Spring的自动装配
    BZOJ2831(小强的金字塔系列问题--区域整点数求法)
    国际跆拳道联盟
    Linux如何查找某个时间点后生成的空文件
    ORACLE中关于外键缺少索引的探讨和总结
    ORA-12514, TNS:listener does not currently know of service requested in connect descriptor案例2
    SQL Server 2005 sp_send_dbmail出现Internal error at FormatRowset (Reason: Not enough storage is available to complete this operation)
    SQL Server数据库邮件发送异常案例
    MySQL二进制日志总结
    OSWatcher使用过程中小问题解决方法
  • 原文地址:https://www.cnblogs.com/duye/p/9913386.html
Copyright © 2011-2022 走看看