nn.GRU()使用

项目场景1:

  今天写代码的时候需要完成
nn.GRU()使用_第1张图片
  那么我们就需要给Decodert添加h0,赋一个初始值


解决办法:

  通过查看nn.GRU()源代码,发现只要多输入一个h0就可以,即将代码

modelFeatureExact(x)
modelFeatureExact(x, h0)

  但是通过源代码发现h0 shape (num_layers * num_directions, batch, hidden_size),然后自己就突然晕了,觉得三维是给每个时间步的h赋值(实际上完全不相关),查了很多资料,花了很多时间,突然发现自己想错了,batch, hidden_size 一个batch中的每个数据都有h0,就应该是batch, hidden_size,引以为戒,不要先入为主。

项目场景2:

  编写代码的时候使用了双层双向的GRU,那么双层双向的GRU应该用什么来作为下一层的输入。


解决办法:

  nn.GRU()的返回值为out,hn,其中out包括每个时间步的隐藏层(h),而我们做分类深入时通常使用最后一个时间步的隐藏层作为下一个层的输入,但是当我们使用双层双向的GRU的时候,由于他的返回值是(num_layers * num_directions, batch, hidden_size),所以我们没法判断num_layers * num_directions中哪一部分数据是双向GRU的隐藏层,哪一部分是双层GRU的隐藏层。
  通过查看nn.GRU()源代码,发现源代码的说明中有

h_n.view(num_layers, num_directions, batch, hidden_size)

  通过这一行代码,我们可以区分哪一部分是双向,哪一部分是双层,但是同样存在的问题是,双层的那一部分,我们仍旧不能区分哪一部分是第一层,哪一部分是第二层。
  经过实验发现,经过上一步分view,hn已经变成了num_layers, num_directions, batch, hidden_size,其中hn[0]为双层GRU第1层的隐藏层,hn[1]为双层GRU的第二层,即最后一层。

你可能感兴趣的:(pytorch,深度学习,人工智能)