LSTM原理请看这:点击进入
LSTM:
nn.LSTM(input_size,
hidden_size,
num_layers=1,
nonlinearity=tanh,
bias=True,
batch_first=False,
dropout=0,
bidirectional=False)
input_size:表示输入 xt 的特征维度
hidden_size:表示输出的特征维度
num_layers:表示网络的层数
nonlinearity:表示选用的非线性激活函数,默认是 ‘tanh’
bias:表示是否使用偏置,默认使用
batch_first:表示输入数据的形式,默认是 False,就是这样形式,(seq, batch, feature),也就是将序列长度放在第一位,batch 放在第二位
dropout:表示是否在输出层应用 dropout
bidirectional:表示是否使用双向的 LSTM,默认是 False。
import torch
from torch import nn
from torch.nn import functional as F
lstm = nn.LSTM(input_size=10, hidden_size=20, num_layers=2,bidirectional=False)
# 可理解为一个字串长度为5, batch size为3, 字符维度为10的输入
input_tensor = torch.randn(5, 3, 10)
# 两层LSTM的初始H参数,维度[layers, batch, hidden_len]
#在lstm中c和h是不一样的,而RNN中是一样的
h0,c0 = torch.randn(2,3, 20),torch.randn(2,3, 20)
# output_tensor最后一层所有的h输出, hn表示两层最后一个时序的输出, cn表示两层最后一个时刻的状态的输出
output_tensor, (hn,cn) =lstm(input_tensor, (h0,c0))
print(output_tensor.shape, hn.shape,cn.shape)
torch.Size([5, 3, 20]) torch.Size([2, 3, 20]) torch.Size([2, 3, 20])
从上面可以看到输出的h,x,和输入的h,x维度一致。
上面的参数中,num_layers=2相当于有两个rnn cell串联,即一个的输出h作为下一个的输入x。也可单独使用两个nn.LSTMCell实现
而当我们设置成双向LSTM时,即bidirectional=True
lstm = nn.LSTM(input_size=10, hidden_size=20, num_layers=2,bidirectional=True)
h0,c0 = torch.randn(4,3, 20),torch.randn(4,3, 20)
torch.Size([5, 3, 40]) torch.Size([4, 3, 20]) torch.Size([4, 3, 20])
一共5个时刻,可以看到最后一时刻的output维度是[3, 40],因为nn.LSTM模块他在最后会将正向和反向的结果进行拼接concat。而hn中的4是指正反向,还有因为num_layers是两层所以为4。
output_tenso只输出最后一层!!!的所有时刻的状态输出(且正向和反向拼接好了。而hn和cn包含所有层,所有方向的最后时刻的输出。
(
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)