pytorch-1.0.1-RNN相关

这篇RNN文章一直准备写,今天终于动笔了。本文章不涉及RNN的原理,也就是运算公式等。所以阅读此文,最好已经对RNN有了较好的认识,这里只谈及pytorch的实现和使用

RNN(GRU)模块定义

def __init__(self, mode, input_size, hidden_size,
                 num_layers=1, bias=True, batch_first=False,
                 dropout=0, bidirectional=False)

关于官方的doc链接看最下面。source上的定义如上,下面解释各个参数的作用:

  • mode: 判断RNN模块是GRU,还是LSTM等等。
if mode == 'LSTM':
    gate_size = 4 * hidden_size
elif mode == 'GRU':
    gate_size = 3 * hidden_size
elif mode == 'RNN_TANH':
    gate_size = hidden_size
elif mode == 'RNN_RELU':
    gate_size = hidden_size
else:
    raise ValueError("Unrecognized RNN mode: " + mode)
  • input_size: 一般我们输入的embedding size
  • hidden_size: 其实就是输出的hidden unit的feature size
  • num_layers: RNN的层数,为1时不需要设置dropout
  • bias :略
  • batch_first: False时输入和输出为(seq, batch, feature),否则(batch, seq, feature)
  • bidirectional: 是否为双向RNN

pack与pad sequence操作

参考自这篇文章,写的非常不错,这里不再赘述

  • pack_padded_sequence(): pack操作就是针对有padding的sequence,通过挤压并取index的方式,把这些padding去掉,输出(PackedSequence, bach_sizes)将放置到rnn.PackedSequence属性中去。注:这里的bach_sizes是针对PackedSequence,与我们输入的batch_size并不是同一个。
    关于参数,如果batch_first=True, 则input的维度为(batch, sequence, emb_dim),这里sequence要求按照真实长度从高到低排好顺序。
rnn.pack_padded_sequence(input, lengths, batch_first=False)
  • pad_packed_sequence(): 如果在输入到rnn之前调用了pack_padded_sequence(),那么rnn的输入output就为PackedSequence的模式,需要再调用该函数,将其逆转为(batch, sequence, feature_size)的模式。
    这里total_length参数就是指定将最终的sequence进行padding后的长度。
pad_packed_sequence(sequence, batch_first=False, padding_value=0.0, total_length=None)

输入与输出

RNN的输入有两个:input与hidden_0

  • input: shape为(seq_len, batch, input_size),受batch_first影响
  • hidden_0: shape为 (num_layers * num_directions, batch, hidden_size),就是初始的h_0对应的weights,default为0。

这里主要解释两种输出:output与hidden_n

  • output: 即RNN最后一层的所以hidden states,shape为(seq, batch, num_directions *hidden_size),同样受rnn的参数batch_first的影响。
    举个常用的栗子:如果num_directions =2,那么正向的最后一个hidden state就是output[ -1, :, :hidden_size],反向的第一个hidden state就是output[ 0, :, hidden_size:]。这两个hidden unit其实都对应于rnn sequence的最后一个输出,我们也常常会用它来表示整个sequence。当然也可以直接调用view操作,output.view(seq_len, batch, num_directions, hidden_size)

  • hidden_n: 顾名思义,就是RNN输出的最后一个hidden unit的hidden state,它也包含双向的情况,所以shape=(num_layers * num_directions, batch, hidden_size),与output类似。需要注意它不受batch_first影响

RNN.flatten_parameters()效用

这里可以参考我的另一篇文章,这里提一下是因为发现在RNN初始化的时候其实会自己调用flatten_parameters()这个函数,所以我们不需要在外部再调用该函数。

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值