机器学习笔记(5)RNN

参考资料:https://zhuanlan.zhihu.com/p/30844905

基本概念

RNN

在这里插入图片描述
对任意输入的输出,不仅和当前输入有关,还和上一输入的隐层状态有关。
在这里插入图片描述

BRNN

在这里插入图片描述
双向RNN,对任意输入的输出,不仅和当前输入有关,还和上一输入的隐层状态,以及下一输入的隐层状态有关。即对于一个序列正向计算一次隐层状态,再反向计算一次,最终得到输出

LSTM(长短期模型)

在这里插入图片描述
LSTM相比于RNN,主要解决的长依赖问题,因为RNN的输出只跟上一时刻和这一时刻有关,但对于一些情况,这一时刻的输出可能和序列中很前的状态有关,那么LSTM通过引入细胞状态,使得当前输入与当前输入,上一输出,细胞状态都有关系。与BRNN类似,BLSTM也就是两个方向相反的LSTM组合在一起。
详细理解可以参考:https://www.jianshu.com/p/4b4701beba92

函数代码学习

torch.nn.RNN()函数解析:

官方文档:https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-nn/#class-torchnnrnn-args-kwargssource
1.参数解析:
input_size:必选参数,指输入序列中一个输入的特征个数,相当于CNN中的输入个数。
hidden_size:必选参数,指的是隐藏层中的特征个数,这个是自定义的超参数,相当于CNN中隐层神经元个数。
num_layers:必选参数,串联RNN的层数,指的是纵向的隐藏层的个数,相当于CNN中的层数。
batch_first:默认为FALSE,是否将batch_size作为第一个维度,如果是,则输入的尺寸为(batch_size, seq_length,input_size),否则为(seq_length,batch_size, input_size)。
bidirectional:指定是否使用双向RNN,使用num_directions=2,不使用为1。

2.函数输入 (input, h_0)
input为当前输入值:input (seq_len, batch, input_size)
h_0为初始隐层状态:h_0 (num_layers * num_directions, batch, hidden_size)

3.函数输出(output, h_n),输出指的是隐藏层在各个序列上计算并输出的隐藏状态,它们通常作为后续输出层的输⼊。
output为当前输出值:output (seq_len, batch, hidden_size * num_directions)
h_n为最终隐层状态:h_n (num_layers * num_directions, batch, hidden_size)

4.示例

#input_size = 10,hidden_size = 20,num_layers = 2
rnn = nn.RNN(10, 20, 2)
#seq_length = 5, batch_size = 3, inputsize = 10
input = Variable(torch.randn(5, 3, 10))
#num_layers * num_directions = 2*1, batch_size = 3, hidden_size = 20
h0 = Variable(torch.randn(2, 3, 20))
#oupt(5,3,20),hn(2,3,20)
output, hn = rnn(input, h0)

torch.nn.LSTM()

参数与上一个函数类似,相信大家在理解了RNN函数后,可以很快理解。

1.参数说明:

input_size – 输入的特征维度
hidden_size – 隐状态的特征维度
num_layers – 层数(和时序展开要区分开)
batch_first – 如果为True,那么输入和输出Tensor的形状为(batch, seq, feature)
dropout – 如果非零的话,将会在RNN的输出上加个dropout,最后一层除外。那么什么是dropout呢,我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征
bidirectional – 如果为True,将会变成BLSTM,默认为False。

2.LSTM输入: input, (h_0, c_0)

input (seq_len, batch, input_size): 包含输入序列特征的Tensor。
h_0 (num_layers * num_directions, batch, hidden_size):保存着batch中每个元素的初始化隐状态的Tensor
c_0 (num_layers * num_directions, batch, hidden_size): 保存着batch中每个元素的初始化细胞状态的Tensor

2.LSTM输出 output, (h_n, c_n)
output (seq_len, batch, hidden_size * num_directions): 保存RNN最后一层的输出的Tensor。
h_n (num_layers * num_directions, batch, hidden_size): Tensor,保存着RNN最后一个时间步的隐状态。
c_n (num_layers * num_directions, batch, hidden_size): Tensor,保存着RNN最后一个时间步的细胞状态。

lstm = nn.torch.lstm(10,20,2)
input = Variable(torch.rand(5,3,10))
h0 = Variable(torch.rand(2,3,10))
c0 = Variable(torch.rand(2,3,10))
ouput,hn,cn = lstm(input,(h0,c0))

代码实战

用pytorch搭建一个CTPN所需的BLSTM网络

class BLSTM(nn.Module):
    def __init__(self,input_size,hidden_size):
        super(VGG,self).__int__()
        self.lstm = nn.LSTM(input_size=input_size,hidden_size=hidden_size,num_layer=1,bidirectional=True)
    def forward(self,x):
        #x(batch,channel,h,w)->x(seq_len, batch, input_size)
        out,_,_ = self.lstm(x)
        return out
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值