经典的LSTM可视化,彻底搞懂

作者:master苏 版权归作者所有  侵删

https://zhuanlan.zhihu.com/p/139617364

本文内容如下:

1、传统的BP网络和CNN网络
2、LSTM网络
3、LSTM的输入结构
4、pytorch中的LSTM
     4.1 pytorch中定义的LSTM模型
     4.2 喂给LSTM的数据格式
     4.3 LSTM的output格式
5、LSTM和其他网络组合

传统的BP网络和CNN网络

BP网络和CNN网络没有时间维,和传统的机器学习算法理解起来相差无几,CNN在处理彩色图像的3通道时,也可以理解为叠加多层,图形的三维矩阵当做空间的切片即可理解,写代码的时候照着图形一层层叠加即可。

如下图是一个普通的BP网络和CNN网络。

5681c913e90f0cf0681380e99090388c.jpeg
BP网络

b04efdaa2d620f41bd97d97acfcb9fbf.png

CNN网络

图中的隐含层、卷积层、池化层、全连接层等,都是实际存在的,一层层前后叠加,在空间上很好理解,因此在写代码的时候,基本就是看图写代码,比如用keras就是:

# 示例代码,没有实际意义
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu'))  # 添加卷积层
model.add(MaxPooling2D(pool_size=(2, 2)))         # 添加池化层
model.add(Dropout(0.25))                          # 添加dropout层

model.add(Conv2D(32, (3, 3), activation='relu'))  # 添加卷积层
model.add(MaxPooling2D(pool_size=(2, 2)))         # 添加池化层
model.add(Dropout(0.25))                          # 添加dropout层

....   # 添加其他卷积操作

model.add(Flatten())                            # 拉平三维数组为2维数组
model.add(Dense(256, activation='relu'))        添加普通的全连接层
model.add(Dropout(0.5))model.add(Dense(10, activation='softmax'))

....  # 训练网络

LSTM网络

当我们在网络上搜索看LSTM结构的时候,看最多的是下面这张图:

1f46768d06de433b2ebb034a5c5e4bf0.png

RNN网络

这是RNN循环神经网络经典的结构图,LSTM只是对隐含层节点A做了改进,整体结构不变,因此本文讨论的也是这个结构的可视化问题。

中间的A节点隐含层,左边是表示只有一层隐含层的LSTM网络,所谓LSTM循环神经网络就是在时间轴上的循环利用,在时间轴上展开后得到右图。

看左图,很多同学以为LSTM是单输入、单输出,只有一个隐含神经元的网络结构,看右图,以为LSTM是多输入、多输出,有多个隐含神经元的网络结构,A的数量就是隐含层节点数量。

WTH?思维转不过来啊。这就是传统网络和空间结构的思维。

实际上,右图中,我们看Xt表示序列,下标t是时间轴,所以,A的数量表示的是时间轴的长度,是同一个神经元在不同时刻的状态(Ht),不是隐含层神经元个数。

我们知道,LSTM网络在训练时会使用上一时刻的信息,加上本次时刻的输入信息来共同训练。

举个简单的例子:在第一天我生病了(初始状态H0),然后吃药(利用输入信息X1训练网络),第二天好转但是没有完全好(H1),再吃药(X2),病情得到好转(H2),如此循环往复知道病情好转。

因此,输入Xt是吃药,时间轴T是吃多天的药,隐含层状态是病情状况。因此我还是我,只是不同状态的我。

实际上,LSTM的网络是这样的:

7a06d6861bc078362c0dd69d170d500a.jpeg

LSTM网络结构

上面的图表示包含2个隐含层的LSTM网络,在T=1时刻看,它是一个普通的BP网络,在T=2时刻看也是一个普通的BP网络,只是沿时间轴展开后,T=1训练的隐含层信息H,C会被传递到下一个时刻T=2,如下图所示。上图中向右的五个常常的箭头,所的也是隐含层状态在时间轴上的传递。

ba1bccb55553c4e35c22500715e688b5.png


注意,图中H表示隐藏层状态,C是遗忘门,后面会讲解它们的维度。

LSTM的输入结构

为了更好理解LSTM结构,还必须理解LSTM的数据输入情况。仿照3通道图像的样子,在加上时间轴后的多样本的多特征的不同时刻的数据立方体如下图所示:

340f9fd11fbe59e564e051b194ef555a.jpeg

三维数据立方体

右边的图是我们常见模型的输入,比如XGBOOST,lightGBM,决策树等模型,输入的数据格式都是这种(NF)的矩阵,而左边是加上时间轴后的数据立方体,也就是时间轴上的切片,它的维度是(NT*F),第一维度是样本数,第二维度是时间,第三维度是特征数,如下图所示:

baf6287cebea91231e8f1f753e488d26.jpeg

这样的数据立方体很多,比如天气预报数据,把样本理解成城市,时间轴是日期,特征是天气相关的降雨风速PM2.5等,这个数据立方体就很好理解了。在NLP里面,一句话会被embedding成一个矩阵,词与词的顺序是时间轴T,索引多个句子的embedding三维矩阵如下图所示:

38c7a1bbcc0e9253907121c745fb3ea7.jpeg

pytorch中的LSTM

4.1 pytorch中定义的LSTM模型

pytorch中定义的LSTM模型的参数如下

class torch.nn.LSTM(*args, **kwargs)
参数有:  
    input_size:x的特征维度   
    hidden_size:隐藏层的特征维度   
    num_layers:lstm隐层的层数,默认为1   
    bias:False则bihbih=0和bhhbhh=0. 默认为True 
    batch_first:True则输入输出的数据格式为 (batch, seq, feature)    
    dropout:除最后一层,每一层的输出都进行dropout,默认为: 0  
    bidirectional:True则为双向lstm默认为False

结合前面的图形,我们一个个看。

(1)input_size:x的特征维度,就是数据立方体中的F,在NLP中就是一个词被embedding后的向量长度,如下图所示:

e0a15dc48f956bed6eb9e873bd91b81b.png

(2)hidden_size:隐藏层的特征维度(隐藏层神经元个数),如下图所示,我们有两个隐含层,每个隐藏层的特征维度都是5。注意,非双向LSTM的输出维度等于隐藏层的特征维度。

a748c32f2ddf7e9a1b2401f9b03f4025.png

(3)num_layers:lstm隐层的层数,上面的图我们定义了2个隐藏层。

(4)batch_first:用于定义输入输出维度,后面再讲。

(5)bidirectional:是否是双向循环神经网络,如下图是一个双向循环神经网络,因此在使用双向LSTM的时候我需要特别注意,正向传播的时候有(Ht, Ct),反向传播也有(Ht', Ct'),前面我们说了非双向LSTM的输出维度等于隐藏层的特征维度,而双向LSTM的输出维度是隐含层特征数*2,而且H,C的维度是时间轴长度*2。

499dc4d19fd328fee2dcd27499547ada.png


4.2 喂给LSTM的数据格式

pytorch中LSTM的输入数据格式默认如下:

input(seq_len, batch, input_size)
参数有:   
    seq_len:序列长度,在NLP中就是句子长度,一般都会用pad_sequence补齐长度   
    batch:每次喂给网络的数据条数,在NLP中就是一次喂给网络多少个句子 
    input_size:特征维度,和前面定义网络结构的input_size一致。

前面也说到,如果LSTM的参数 batch_first=True,则要求输入的格式是:

input(batch, seq_len, input_size)

刚好调换前面两个参数的位置。其实这是比较好理解的数据形式,下面以NLP中的embedding向量说明如何构造LSTM的输入。

之前我们的embedding矩阵如下图:

601a20e42ba1c214b4d6d6c3806641c4.jpeg

如果把batch放在第一位,则三维矩阵的形式如下:

f66961150f6d8010f2389e472b2b4777.jpeg

其转换过程如下图所示:

69c8937e2e1be63ea7f961bcbce18ff9.jpeg

看懂了吗,这就是输入数据的格式,是不是很简单。

LSTM的另外两个输入是 h0 和 c0,可以理解成网络的初始化参数,用随机数生成即可。

h0(num_layers * num_directions, batch, hidden_size)
c0(num_layers * num_directions, batch, hidden_size)
参数:   
    num_layers:隐藏层数   
    num_directions:如果是单向循环网络,则num_directions=1,双向则
num_directions=2    
    batch:输入数据的batch   
    hidden_size:隐藏层神经元个数

注意,如果我们定义的input格式是:

input(batch, seq_len, input_size)

则H和C的格式也是要变的:

h0(batc,num_layers * num_directions, h, hidden_size)
c0(batc,num_layers * num_directions, h, hidden_size)

4.3 LSTM的output格式

LSTM的输出是一个tuple,如下:

output,(ht, ct) = net(input)    
    output: 最后一个状态的隐藏层的神经元输出    
    ht:最后一个状态的隐含层的状态值   
    ct:最后一个状态的隐含层的遗忘门值

output的默认维度是:

output(seq_len, batch, hidden_size * num_directions)
ht(num_layers * num_directions, batch, hidden_size)
ct(num_layers * num_directions, batch, hidden_size)

和input的情况类似,如果我们前面定义的input格式是:

input(batch, seq_len, input_size)

则ht和ct的格式也是要变的:

ht(batc,num_layers * num_directions, h, hidden_size)
ct(batc,num_layers * num_directions, h, hidden_size)

说了这么多,我们回过头来看看ht和ct在哪里,请看下图:

fa4ab729d349ffe7eeed8b2b91018700.png

output在哪里?请看下图:

7e455e28a022f9b01f9de313ae382c6c.png

LSTM和其他网络组合

还记得吗,output的维度等于隐藏层神经元的个数,即hidden_size,在一些时间序列的预测中,会在output后,接上一个全连接层,全连接层的输入维度等于LSTM的hidden_size,之后的网络处理就和BP网络相同了,如下图:

81fada6d496698fec6bab9366e82502b.jpeg

用pytorch实现上面的结构:

import torch
from torch import nn

class RegLSTM(nn.Module):  
    def __init__(self):    
        super(RegLSTM, self).__init__()     
        # 定义LSTM    
        self.rnn = nn.LSTM(input_size, hidden_size, hidden_num_layers)      
        # 定义回归层网络,输入的特征维度等于LSTM的输出,输出维度为1       
        self.reg = nn.Sequential(    
            nn.Linear(hidden_size, 1)    
        )
        
    def forward(self, x):  
        x, (ht,ct) = self.rnn(x)    
        seq_len, batch_size, hidden_size= x.shape  
        x = y.view(-1, hidden_size)  
        x = self.reg(x)   
        x = x.view(seq_len, batch_size, -1)    
        return x

当然,有些模型则是将输出当做另一个LSTM的输入,或者使用隐藏层ht,ct的信息进行建模,不一而足。

参考链接:

https://zhuanlan.zhihu.com/p/94757947

https://zhuanlan.zhihu.com/p/59862381

https://zhuanlan.zhihu.com/p/36455374

https://www.zhihu.com/question/41949741/answer/318771336

https://blog.csdn.net/android_ruben/article/details/80206792

作者:master苏

https://zhuanlan.zhihu.com/p/139617364

猜您喜欢:

175385f1efc3701b9b92aa2c151475fd.png 戳我,查看GAN的系列专辑~!

一顿午饭外卖,成为CV视觉前沿弄潮儿!

ECCV2022 | 生成对抗网络GAN部分论文汇总

CVPR 2022 | 25+方向、最新50篇GAN论文

 ICCV 2021 | 35个主题GAN论文汇总

超110篇!CVPR 2021最全GAN论文梳理

超100篇!CVPR 2020最全GAN论文梳理

拆解组新的GAN:解耦表征MixNMatch

StarGAN第2版:多域多样性图像生成

附下载 | 《可解释的机器学习》中文版

附下载 |《TensorFlow 2.0 深度学习算法实战》

附下载 |《计算机视觉中的数学方法》分享

《基于深度学习的表面缺陷检测方法综述》

《零样本图像分类综述: 十年进展》

《基于深度神经网络的少样本学习综述》

74538cf245d95e081aa87c2eb25f5faa.png

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要对LSTM模型进行预测可视化,需要进行以下步骤: 1. 导入所需的库: ```python import numpy as np import matplotlib.pyplot as plt from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM ``` 2. 准备数据集: ```python # 准备用于训练的数据 data = [[i for i in range(100)]] data = np.array(data, dtype=float) target = [[i for i in range(1, 101)]] target = np.array(target, dtype=float) # 将数据集进行归一化处理 data /= np.max(data) target /= 100 # 将数据集分为训练集和测试集 x_train = data[:, :-10] y_train = target[:, :-10] x_test = data[:, -10:] y_test = target[:, -10:] ``` 3. 构建LSTM模型: ```python model = Sequential() model.add(LSTM(64, input_shape=(None, 1))) model.add(Dense(1)) model.compile(loss='mean_absolute_error', optimizer='adam') ``` 4. 训练模型: ```python model.fit(x_train.reshape((1, 90, 1)), y_train.reshape((1, 90, 1)), epochs=1000, batch_size=1, verbose=2) ``` 5. 进行预测并进行可视化: ```python # 进行预测 predicted = model.predict(x_test.reshape((1, 10, 1))) # 将预测结果和真实结果进行可视化 plt.subplot(2, 1, 1) plt.plot(predicted.reshape(10,), 'r', label="predicted") plt.plot(y_test.reshape(10,), 'g', label="real") plt.legend(loc='upper left') plt.show() ``` 以上代码可以实现对LSTM模型预测结果的可视化。 ### 回答2: Python中的LSTM(长短期记忆)模型是一种用于时间序列预测的强大工具。LSTM是一种特殊的循环神经网络(RNN),能够捕捉时间序列中的长期依赖关系。 要使用Python进行LSTM预测可视化,我们需要遵循以下步骤: 1. 导入所需的Python库,包括tensorflow、keras和matplotlib。 2. 加载或生成要用于训练和测试的时间序列数据集。通常,我们将数据集划分为训练集和测试集,其中训练集用于训练LSTM模型,测试集用于评估模型性能。 3. 创建LSTM模型。可以使用Keras库中的LSTM层来构建模型。LSTM层可以具有多个隐藏单元和时间步长,可以根据预测问题的需求进行配置。 4. 使用训练集对LSTM模型进行训练。通过逐步迭代地向模型提供训练样本和目标值,模型将学习时间序列中的模式和趋势。 5. 使用测试集对LSTM模型进行预测。将测试集中的输入数据传递给已训练的模型,模型将返回相应的预测结果。 6. 使用matplotlib库绘制预测结果的可视化图表。可以将原始时间序列数据、模型预测数据以及相应的真实值放在同一个图表中,以便进行对比和评估。 通过LSTM预测可视化,可以直观地了解模型的预测效果和性能。预测图表可以显示出时间序列数据中的趋势、周期性和异常值等信息,帮助我们更好地理解和分析数据。 总之,Python中的LSTM模型可以通过实施上述步骤来进行预测可视化,从而提供对时间序列数据的更深入的理解和洞察。 ### 回答3: 要进行PythonLSTM模型的预测可视化,我们可以使用多种方法来展示预测结果的可视化效果。 首先,我们可以使用matplotlib库来绘制时间序列数据的图表。可以使用LSTM模型在训练集上进行预测,并将预测结果与实际值进行对比。通过将实际值和预测值绘制在同一张图上,我们可以直观地看到预测的准确性和趋势。这种方式可以帮助我们了解预测结果与实际情况的接近程度。 其次,我们也可以使用其他一些可视化工具,如Plotly或Seaborn等库,来创建更复杂的预测图表。这些库提供了更多的定制选项和交互式功能,可以更详细地展示预测结果。例如,我们可以用线图表示时间序列数据,用不同颜色的线表示实际值和预测值。我们还可以添加趋势线、置信区间或其他统计指标,以增加信息的可读性。 此外,还可以使用动画来展示LSTM模型的预测效果。我们可以使用Python中的动画库,如Matplotlib的animation模块,来创建动态图表。通过逐步展示预测结果的变化,我们可以更加形象地向观众展示预测过程。 最后,我们还可以使用3D可视化技术来展示多个变量之间的复杂关系。例如,我们可以使用Python中的Mayavi库或Plotly的3D图表功能,将多维时间序列数据的预测结果可视化为三维图表。这种方式有助于我们直观地了解各个变量之间的关系和变化趋势。 总的来说,Python提供了丰富的可视化工具和库,可以帮助我们对LSTM模型的预测结果进行可视化展示。这些可视化方法不仅可以提高我们对结果的理解,还可以向他人清晰地传达模型的预测效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值