LSTM网络中各层解读
Posted hi_mxd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LSTM网络中各层解读相关的知识,希望对你有一定的参考价值。
https://towardsdatascience.com/reading-between-the-layers-lstm-network-7956ad192e58
构建深度神经网络最关键的部分之一是——当数据流经不同的层时,要对其有一个清晰的视图,这些层经历了维度的变化、形状的改变、扁平化和重新塑造……
LSTM Network Architecture for Sentiment Analysis
每层解读:
0) 把单词变为tokens
1)embedding 把每个token变成特定大小的embedding
2)LSTM 由隐藏状态维度和层数决定
3)全连接层
4)激活函数
5)输出
数据:使用IMDB电影评论的数据集;
对数据进行了预处理,使得batch_size=50, 序列长度为200
1 dataiter = iter(train_loader) 2 x, y = dataiter.next() 3 x = x.type(torch.LongTensor) 4 print (\'X is\', x) 5 print (\'Shape of X and y are :\', x.shape, y.shape)
从X的形状可以看出,X是一个张量,为50行(=batch size)和200列(=sequence length)。
这个X将作为嵌入层的输入
- Embedding layer :
使用torch.nn.Embedding模块作嵌入。它需要两个参数:词汇表大小和嵌入的维数
1 from torch import nn 2 vocab_size = len(words) 3 embedding_dim = 30 4 embeds = nn.Embedding(vocab_size, embedding_dim) 5 print (\'Embedding layer is \', embeds) 6 print (\'Embedding layer weights \', embeds.weight.shape)
1 embeds_out = embeds(x) 2 print (\'Embedding layer output shape\', embeds_out.shape) 3 print (\'Embedding layer output \', embeds_out)
从嵌入层的输出可以看出,它作为嵌入权值的结果创建了一个三维张量。现在它有50行,200列和30个嵌入维,也就是说,在我们的审查中,我们为每个标记化的单词添加了嵌入维。该数据现在将进入LSTM层
- LSTM Layer :
在定义LSTM层时,我们保持Batch First = True和隐藏单元的数量= 512。
1 # initializing the hidden state to 0 2 hidden=None 3 lstm = nn.LSTM(input_size=embedding_dim, hidden_size=512, num_layers=1, batch_first=True) 4 lstm_out, h = lstm(embeds_out, hidden) 5 print (\'LSTM layer output shape\', lstm_out.shape) 6 print (\'LSTM layer output \', lstm_out)
通过查看LSTM层的输出,我们可以看到张量现在有50行,200列和512个LSTM节点。接下来,该数据被提取到全连接层
- Fully Connected Layer :
对于全连通层,输入特征数= LSTM中隐藏单元数。输出大小= 1,因为我们只有二进制结果(1/0;正和负)
1 fc = nn.Linear(in_features=512, out_features=1) 2 fc_out = fc(lstm_out.contiguous().view(-1, 512)) 3 print (\'FC layer output shape\', fc_out.shape) 4 print (\'FC layer output \', fc_out)
注意,在将lstm输出放入fc层之前,必须将其压平。
1 fc = nn.Linear(in_features=512, out_features=1) 2 fc_out = fc(lstm_out.contiguous().view(-1, 512)) 3 print (\'FC layer output shape\', fc_out.shape) 4 print (\'FC layer output \', fc_out)
- Sigmoid Activation Layer :
这只是为了将所有的输出值从完全连接的层转换为0到1之间的值
1 sigm = nn.Sigmoid() 2 sigm_out = sigm(fc_out) 3 print (\'Sigmoid layer output shape\', sigm_out.shape) 4 print (\'Sigmoid layer output \', sigm_out)
- Final Output :
这包括两个步骤:首先,重塑输出,使rows = batch大小
1 batch_size = x.shape[0] 2 out = sigm_out.view(batch_size, -1) 3 print (\'Output layer output shape\', out.shape) 4 print (\'Output layer output \', out)
第二,正如我们在网络体系结构中看到的那样——我们只希望在最后一个序列之后进行输出(在最后一个时间步之后)
1 print (\'Final sentiment prediction, \', out[:,-1])
这些输出来自未经训练的网络,因此这些值可能还不表示任何内容。这只是为了说明,我们将使用这些知识来正确定义模型。
以上是关于LSTM网络中各层解读的主要内容,如果未能解决你的问题,请参考以下文章
基于pytorch搭建多特征LSTM时间序列预测代码详细解读(附完整代码)