来张图说明一下

 

RNNCell

nn.RNNCell(input_size, hidden_size, bias=True, nonlinearity=‘tanh’)

      h=tanh(Wihx+bih+Whhh+bhh)

input_size:输入数据X的特征值的数目。

hidden_size:隐藏层的神经元数量,也就是隐藏层的特征数量。

bias:默认为 True,如果为 false 则表示神经元不使用 bias 偏移参数。

nonlinearity:默认为tanh,可选relu

输入:

input:[batch,input_size]

hidden:[batch,hidden_size]

输出:

h:[batch,hidden_size]

参数:

RNNCell.weight_ih: [hidden_size, input_size]

RNNCell.weight_hh: [hidden_size, hidden_size]

RNNCell.bias_ih: [hidden_size]

RNNCell.bias_hh: [hidden_size]

示例

#输入特征维度5,输出维度10
rnn_cell = torch.nn.RNNCell(5,10)
#Batch_size=2
input = torch.randn(2,5)
h_0 = torch.randn(2,10)
h = rnn_cell(input,h_0)
h.shape
>>torch.Size([2, 10])

[(para[0],para[1].shape) for para in list(rnn_cell.named_parameters())]
>>[('weight_ih', torch.Size([10, 5])),
 ('weight_hh', torch.Size([10, 10])),
 ('bias_ih', torch.Size([10])),
 ('bias_hh', torch.Size([10]))]

cell 其实就是一个全连接,可以自己定义,比如

nn.Linear(input_size + hidden_size, hidden_size)

 

RNN

torch.nn.RNN(args, kwargs)*

  ht=tanh(Wihxt+bih+Whhh(t1)+bhh)

input_size:输入数据X的特征值的数目。

hidden_size:隐藏层的神经元数量,也就是隐藏层的特征数量。

num_layers:循环神经网络的层数,默认值是 1。

nonlinearity:默认为tanh,可选relu

bias:默认为 True,如果为 false 则表示神经元不使用 bias 偏移参数。

batch_first:如果设置为 True,则输入数据的维度中第一个维度就 是 batch 值,默认为 False。默认情况下第一个维度是序列的长度, 第二个维度才是 - - batch,第三个维度是特征数目。

dropout:如果不为空,则表示最后跟一个 dropout 层抛弃部分数据,抛弃数据的比例由该参数指定。默认为0。

bidirectional : If True, becomes a bidirectional RNN. Default: False  【bidirectional 双向】

输入:

input: [seq_len, batch, input_size]

h0: [(num_layers * num_directions, batch, hidden_size)]

输出:

out: [seq_len, batch, num_directions * hidden_size]

hn: [num_layers * num_directions, batch, hidden_size]

示例

#输入特征维度5,输出维度10, 层数2
rnn = torch.nn.RNN(5, 10, 2)
#seq长度4,batch_size=2
input = torch.randn(4 , 2 , 5)
h_0 =torch.randn(2 , 2 , 10)
output,hn=rnn(input ,h_0) 

print(output.size(),hn.size())
>>torch.Size([4, 2, 10]) torch.Size([2, 2, 10])

[(para[0],para[1].shape) for para in list(rnn.named_parameters())]
>>[('weight_ih_l0', torch.Size([10, 5])),
 ('weight_hh_l0', torch.Size([10, 10])),
 ('bias_ih_l0', torch.Size([10])),
 ('bias_hh_l0', torch.Size([10])),
 ('weight_ih_l1', torch.Size([10, 10])),
 ('weight_hh_l1', torch.Size([10, 10])),
 ('bias_ih_l1', torch.Size([10])),
 ('bias_hh_l1', torch.Size([10]))]

rnn = torch.nn.RNN(5, 10, 2,bidirectional=True)
>>[('weight_ih_l0', torch.Size([10, 5])),
 ('weight_hh_l0', torch.Size([10, 10])),
 ('bias_ih_l0', torch.Size([10])),
 ('bias_hh_l0', torch.Size([10])),
 ('weight_ih_l0_reverse', torch.Size([10, 5])),
 ('weight_hh_l0_reverse', torch.Size([10, 10])),
 ('bias_ih_l0_reverse', torch.Size([10])),
 ('bias_hh_l0_reverse', torch.Size([10])),
 ('weight_ih_l1', torch.Size([10, 20])),
 ('weight_hh_l1', torch.Size([10, 10])),
 ('bias_ih_l1', torch.Size([10])),
 ('bias_hh_l1', torch.Size([10])),
 ('weight_ih_l1_reverse', torch.Size([10, 20])),
 ('weight_hh_l1_reverse', torch.Size([10, 10])),
 ('bias_ih_l1_reverse', torch.Size([10])),
 ('bias_hh_l1_reverse', torch.Size([10]))]

 

以下详见 参考资料1

LSTMCell

LSTM

GRUCell

GRU

 

实际使用案例

实际使用过程中,有各种变化

import torch.nn as nn 

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
        # 使用 lstm 构建自己 的 RNN 模型
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, 
                            batch_first=True)
        self.fc = nn.Linear(hidden_size, num_classes)  # 2 for bidirection 

    def forward(self, x):
        # Forward propagate RNN
        out, _ = self.lstm(x)

        # Decode hidden state of last time step
        # lstm 的batch_first=True,故输出为[b,t,o]
        # 这里只取最后一个时刻的输出,属于 多对一 rnn
        # 取出隐层输出,再 fc
        out = self.fc(out[:, -1, :])    
        return out

rnn = RNN(input_size, hidden_size, num_layers, num_classes)

注意:

1. lstm 的输出是 hiden 层的输出,后面才是 fc 层

2. rnn 有一对一、多对一、多对多的预测,注意最后一步的使用

 

 

 

参考资料:

https://blog.csdn.net/lkangkang/article/details/89814697  pytorch中RNN,LSTM,GRU使用详解

https://blog.csdn.net/qq_41375318/article/details/107597465   Pytorch实现多层lstm