-
2020-12-20 11:14:10
@DanielAdiwardana的答案的详细说明。我们需要为除最后一层之外的所有LSTM层添加return_sequences = True。
将此标志设置为True可让Keras知道LSTM输出应包含所有历史生成的输出以及时间戳(3D)。 因此,下一个LSTM层可以进一步处理数据。
如果此标志为假,则LSTM仅返回最后一个输出(2D)。 这样的输出对于另一个LSTM层来说还不够好。
# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
input_shape=(timesteps, data_dim))) # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True)) # returns a sequence of vectors of dimension 32
model.add(LSTM(32)) # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))
在侧面注意:::添加了最后一个密集层,以获取用户所需格式的输出。 这里的Dense(10)表示将使用softmax激活生成10个不同的类输出。
如果您将LSTM用于时间序列,则应具有Dense(1)。 因此只给出一个数字输出。
更多相关内容 -
多层LSTM,多层lstm与单层lstm区别,Python
2021-09-10 17:01:43使用的RNN中的LSTM进行对28个英文字母的简单文本预测 -
如何堆叠多层LSTM网络——长短期记忆(LSTM)系列_LSTM的建模方法(2)
2021-03-13 05:16:11如何堆叠多层LSTM网络——长短期记忆(LSTM)系列_LSTM的建模方法(2)发布时间:2018-...文中介绍了堆叠式LSTM的架构和实现方法在堆叠式LSTM中,层与层的输数出通过return_sequences = True参数修改成3D数据,以便供下...如何堆叠多层LSTM网络——长短期记忆(LSTM)系列_LSTM的建模方法(2)
发布时间:2018-12-07 15:15,
浏览次数:1362
, 标签:
LSTM
导读:
堆叠式LSTM属于深度学习,通过添加网络的深度,提高训练的效率,获得更高的准确性。
文中介绍了堆叠式LSTM的架构和实现方法
在堆叠式LSTM中,层与层的输数出通过return_sequences = True参数修改成3D数据,以便供下一层网络使用。
源码地址
https://github.com/yangwohenmai/LSTM/tree/master/%E9%95%BF%E7%9F%AD%E6%9C%9F%E8%AE%B0%E5%BF%86(LSTM)/%E4%BD%BF%E7%94%A8LSTM%E5%BB%BA%E6%A8%A1/%E5%A0%86%E5%8F%A0%E7%9A%84%E9%95%BF%E7%9F%AD%E6%9C%9F%E8%AE%B0%E5%BF%86%E7%BD%91%E7%BB%9C
为什么要增加深度?
堆叠LSTM隐藏层使模型更深入,更准确地将描述作为深度学习技术获得。
神经网络的深度通常归因于该方法在广泛的具有挑战性的预测问题上的成功
可以将其他隐藏层添加到多层感知器神经网络中以使其更深。附加隐藏层被理解为重新组合来自先前层的学习表示并在高抽象级别创建新表示。例如,从线到形状到对象。
足够大的单个隐藏层多层感知器可用于近似大多数功能。增加网络的深度提供了另一种解决方案,需要更少的神经元和更快的训练。最终,添加深度是一种代表性优化。
堆叠式LSTM架构
LSTM可以利用相同的好处。
鉴于LSTM对序列数据进行操作,这意味着层的添加增加了输入观察随时间的抽象级别。实际上,随着时间的推移分块观察或在不同的时间尺度上表示问题。
在同样的工作中,他们发现网络的深度比给定层中的存储器单元的数量更重要,以模拟技能。
堆叠LSTM现在是用于挑战序列预测问题的稳定技术。堆叠式LSTM架构可以定义为由多个LSTM层组成的LSTM模型。上面的LSTM层提供序列输出而不是单个值输出到下面的LSTM层。具体地说,每个输入时间步长一个输出,而不是所有输入时间步长的一个输出时间步长。
堆叠的长期短期记忆结构
在Keras中实现堆叠LSTM
下面是定义两个隐藏层Stacked LSTM的示例:
model = Sequential()
model.add(LSTM(..., return_sequences=True, input_shape=(...)))
model.add(LSTM(...))
model.add(Dense(...))
只要先前的LSTM层提供3D输出作为后续层的输入,我们就可以继续添加隐藏的LSTM层。例如,下面是一个有4个隐藏层的Stacked LSTM。
model = Sequential()
model.add(LSTM(..., return_sequences=True, input_shape=(...)))
model.add(LSTM(..., return_sequences=True))
model.add(LSTM(..., return_sequences=True))
model.add(LSTM(...))
model.add(Dense(...))
我们可以在Keras Python深度学习库中轻松创建Stacked LSTM模型
每个LSTM存储器单元都需要3D输入。当LSTM处理一个输入时间步长序列时,每个存储器单元将输出整个序列的单个值作为2D阵列。
我们可以使用具有单个隐藏LSTM层的模型来演示以下内容,该LSTM层也是输出层。
# Example of one output for whole sequence from keras.models import Sequential
from keras.layers import LSTM from numpy import array # define model where LSTM
is also output layer model = Sequential() model.add(LSTM(1, input_shape=(3,1)))
model.compile(optimizer='adam', loss='mse') # input time steps data =
array([0.1, 0.2, 0.3]).reshape((1,3,1)) # make and show prediction
print(model.predict(data))
输入序列有3个值。运行该示例将输入序列的单个值输出为2D数组。
输出:[[ 0.00031043]]
要堆叠LSTM图层,我们需要更改先前LSTM图层的配置,以输出3D数组作为后续图层的输入。
我们可以通过将图层上的return_sequences参数设置为True(默认为False)来完成此操作。这将为每个输入时间步返回一个输出并提供3D数组。
以下是与return_sequences = True相同的示例。
# Example of one output for each input time step from keras.models import
Sequential from keras.layers import LSTM from numpy import array # define model
where LSTM is also output layer model = Sequential() model.add(LSTM(1,
return_sequences=True, input_shape=(3,1))) model.compile(optimizer='adam',
loss='mse') # input time steps data = array([0.1, 0.2, 0.3]).reshape((1,3,1)) #
make and show prediction print(model.predict(data))
运行该示例为输入序列中的每个时间步输出单个值。
[[[-0.02115841]
[-0.05322712]
[-0.08976141]]]
-
单层LSTM和多层LSTM的输入与输出
2020-06-10 11:44:09其实它是由一个LSTM单元的一个展开,如下图所示: 所以从左到右的每个LSTM Block只是对应一个时序中的不同的步。 在第一个图中,输入的时序特征有S个,长度记作:seq_len,每个特征是一个C维的向量,长度记作:input...单层LSTM的输入与输出
RNN结构:
对应的代码为:(代码中没写偏置)
上图是单层LSTM的输入输出结构图。其实它是由一个LSTM单元的一个展开,如下图所示:
所以从左到右的每个LSTM Block只是对应一个时序中的不同的步。
在第一个图中,输入的时序特征有S个,长度记作:seq_len,每个特征是一个C维的向量,长度记作:input_size。而Initial State是LSTM的隐藏状态和内部状态的一个输入的初始化。分别记作:h0和c0。
输出可以通过设置,来决定是输出所有时序步的输出,还是只输出最后一个时序步的输出。Final_State是隐藏状态和内部状态的输出,记作:hn和cn.那么对于在pytorch中的函数LSTM的参数的输入情况如下:
输入数据:
- X的格式:(seq_len,batch,input_size)
#batch是批次数,可以在LSTM()中设置batch_first,使得X的输入格式要求变为(batch,seq_len,input_size) - h0的格式:(1,batch,hidden_size)
- c0的格式:(1,batch,hidden_size)
因为不管输入的数据X是多少个特征的,h0和c0的都只需要一个输入就行。
对于输出,输出的hidden_size的大小是由门控中的隐藏的神经元的个数来确定的。
输出的格式:
- H的格式:(seq_len,batch,hidden_size)
#如果按照(seq_len,batch,hidden_size) 的格式输出,需要在LSTM()中设置return_sequences=True,否则默认只输出最后一个时间步的输出结果(1,batch,hidden_size). - hn的格式:(1,batch,hidden_size)
- cn的格式:(1,batch,hidden_size)
这只是LSTM单元的输入输出格式,真实的其后还要跟一个全连接层,用于把LSTM的输出结果映射到自己想要的结果上,如分类:
如果只想要研究最后一个时间步的输出结果,只需在最后一个时间步添加全连接即可。多层LSTM的输入与输出
对于多层的LSTM,需要把第一层的每个时间步的输出作为第二层的时间步的输入,如上图所示。
对于num_layers层LSTM:输入数据:
- X的格式:(seq_len,batch,input_size)
- h0的格式:(num_layers,batch,hidden_size)
- c0的格式:(num_layers,batch,hidden_size)
输出数据:
- H的格式:(seq_len,batch,hidden_size)
- hn的格式:(num_layers,batch,hidden_size)
- cn的格式:(num_layers,batch,hidden_size)
如果是双向的,即在LSTM()函数中,添加关键字bidirectional=True,则:
单向则num_direction=1,双向则num_direction=2
输入数据格式:
input(seq_len, batch, input_size)
h0(num_layers * num_directions, batch, hidden_size)
c0(num_layers * num_directions, batch, hidden_size)
输出数据格式:
output(seq_len, batch, hidden_size * num_directions)
hn(num_layers * num_directions, batch, hidden_size)
cn(num_layers * num_directions, batch, hidden_size)补充细节,下面是转载的:
版权声明:本文为CSDN博主「ssswill」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ssswill/article/details/88429794
输出的y=act(h_t*W_y)+b_y(图中未显示!)可以看到中间的 cell 里面有四个黄色小框,你如果理解了那个代表的含义一切就明白了,每一个小黄框代表一个前馈网络层,对,就是经典的神经网络的结构,num_units就是这个层的隐藏神经元个数,就这么简单。其中1、2、4的激活函数是 sigmoid,第三个的激活函数是 tanh。
另外几个需要注意的地方:
1、 cell 的状态是一个向量,是有多个值的。
2、 上一次的状态 h(t-1)是怎么和下一次的输入 x(t) 结合(concat)起来的,这也是很多资料没有明白讲的地方,也很简单,concat, 直白的说就是把二者直接拼起来,比如 x是28位的向量,h(t-1)是128位的,那么拼起来就是156位的向量。
3、 cell 的权重是共享的,这是什么意思呢?这是指这张图片上有三个绿色的大框,代表三个 cell 对吧,但是实际上,它只是代表了一个 cell 在不同时序时候的状态,所有的数据只会通过一个 cell,然后不断更新它的权重。
4、那么一层的 LSTM 的参数有多少个?根据第 3 点的说明,我们知道参数的数量是由 cell 的数量决定的,这里只有一个 cell,所以参数的数量就是这个 cell 里面用到的参数个数。假设 num_units 是128,输入是28位的,那么根据上面的第 2 点,可以得到,四个小黄框的参数一共有 (128+28)*(128*4),也就是156 * 512,可以看看 TensorFlow 的最简单的 LSTM 的案例,中间层的参数就是这样,不过还要加上输出的时候的激活函数的参数,假设是10个类的话,就是128*10的 W 参数和10个bias 参数
5、cell 最上面的一条线的状态即 s(t) 代表了长时记忆,而下面的 h(t)则代表了工作记忆或短时记忆。LSTM的训练过程:
说明:上面画红框的地方,如想输出如上的三维矩阵,需要指明参数:return_sequences=True
再附一张图:
白色框框中,第一行是实现细节,第二行是第一行输出结果的维度。
对于双向的Bi-LSTM网络:
正向求得的第一个正h_1和反向求得的最后一个反h_-1,生成的结果进行对应位置相加,然后再经过act(W_y*h)+b_y得到对应的y. - X的格式:(seq_len,batch,input_size)
-
LSTM的例子、单向LSTM、双向LSTM、多层LSTM.rar
2022-05-13 16:08:49LSTM 的例子 单向LSTM 双向LSTM 多层LSTM(LSTM long short term memory) -
matlab多层lstm代码-BidirectionalLSTM:使用具有CNN功能的深度双向LSTM在视频序列中进行动作识别
2021-05-27 16:26:26Matlab多层lstm代码使用具有CNN功能的深度双向LSTM在视频序列中进行动作识别 我们已经使用caffe模式使用matlab脚本“ oneFileFeatures ...”从视频中提取了深层功能。 每个CSV文件代表一个视频的功能。 使用“ ... -
多层LSTM_LSTM_foodc64_多层RNN_多层LSTM_LSTMRNN
2021-09-10 17:01:43使用的RNN中的LSTM进行对28个英文字母的简单文本预测 -
多层LSTM
2021-07-02 10:49:28左侧架构说明了使用多层 RNN 预测输出序列中的一个输出的方法。正确的架构显示了使用多层 RNN 预测输出序列的方法,该输出序列使用输出作为输入。 比如下面的例子 以上是按时间展开的堆叠循环神经网络。一般的...我们扩展了单层 RNN,使它们具有两层。对于原始的单层版本,请参阅上一章简介中的绘图。左侧架构说明了使用多层 RNN 预测输出序列中的一个输出的方法。正确的架构显示了使用多层 RNN 预测输出序列的方法,该输出序列使用输出作为输入。比如下面的例子以上是按时间展开的堆叠循环神经网络。一般的,我们定义 ht(l)为在时刻 t 时第 l 层的隐状态,则它是由时刻t-1第l层的隐状态与时刻t第l-1层的隐状态共同决定:其中U (l) 、W (l) 是权重矩阵,b (l) 是偏置,h t (0) = x t 。我们可以看到,如果一共有T步,那么会有T个输出:y 1 ,y 2 ,...,y T 。但一般只取最后一个输出y T ,相应的隐状态也取最后时刻最后一个循环层的隐状态,比如上面就是取h T (3) ,这是代码中需要注意的地方。参考链接: -
使用pytorch从头实现多层LSTM
2021-12-29 11:36:47#自定义LSTM实现 class NaiveCustomLSTM(nn.Module): def __init__(self,input_size,hidden_size,num_layers=2): super().__init__() self.input_size = input_size self.hidden_size= hidden_size self.num_... -
多层 LSTM的实现
2019-02-13 20:10:51前言: 根据我本人学习 TensorFlow 实现 LSTM 的经历,发现网上虽然也有不少教程,其中很多都是根据官方给出的例子,用多层 LSTM 来实现 PTBModel 语言模型,比如: tensorflow笔记:多层LSTM代码分析 但是感觉... -
Pytorch实现多层lstm
2020-07-26 18:23:09Pytorch实现多层lstmPytorch实现多层lstmPytorch实现多层lstm -
keras实现多层LSTM
2021-07-02 15:49:01model = Sequential() model.add(LSTM(units=hidden, ...model.add(LSTM(units=hidden,return_sequences=False))#返回最后一个节点的输出 ## # model.add(Dense(1, activation='softmax')) model.add(Dense(1, acti -
LSTM 05:Keras实现多层LSTM进行序列预测
2020-03-19 22:26:37Keras实现多层LSTM模型进行时间序列预测 -
多层堆叠LSTM的理论与TensorFlow的实现
2021-05-20 11:46:56堆叠LSTM(Stacked LSTM)是此模型的扩展,具有多个LSTM层。 文章结构 为什么要堆叠LSTM? 堆叠LSTM结构 堆叠LSTM的Tensorflow实现 为什么要堆叠LSTM? 堆叠LSTM使模型深度更深,提取的特征更深层次,从而使预测... -
基于Pytorch实现LSTM(多层LSTM,双向LSTM)进行文本分类
2021-07-28 23:04:41LSTM原理请看这:点击进入 LSTM: nn.LSTM(input_size, hidden_size, num_layers=1, nonlinearity=tanh, bias=True, batch_first=False, ...num_layers:表示网络的层数 nonlinearity:表示选 -
keras搭建多层LSTM时间序列预测模型
2020-12-30 06:12:41LSTM from keras.layers import Dropout 1层LSTM def lstm_single(x,y,hidden_cell,epoch,batch_size,verbose): #verbose=0不显示训练进度,verbose=2显示训练进度和每个epoch所需时间 model = Sequential() model.... -
多层LSTM的坑:如何定义多层LSTM?
2018-08-24 21:07:24多层LSTM需要每次都定义一个新的BasicCell, 而不是定义一个BasicCell之后多次调用。 def lstm_model(X,Y,is_training): ###方式1:错误!! #cell_unit = tf.nn.rnn_cell.BasicLSTMCell(HIDDEN_SIZ... -
多层LSTM结构的深入解读
2018-06-15 01:37:52读这篇文章的时候,默认你已经对LSTM神经网络有了一个初步的认识,当你深入理解时,可能会对多层LSTM内部的隐藏节点数,有关cell的定义或者每一层的输入输出是什么样子的特别好奇,虽然神经网络就像是一个黑箱子一样... -
使用一层LSTM与两层LSTM比较
2020-08-22 09:23:04使用一层对应的LSTM from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow_datasets as tfds import tensorflow as tf # Get the data dataset, info = tfds.... -
【语音识别】关于多层LSTM的结构解读
2020-08-11 16:22:22输入尺寸 3D 张量,尺寸为 (batch_size, ...剩余的张量为最后的状态, 每个张量的尺寸为 (batch_size, units)。 如果 return_sequences:返回 3D 张量, 尺寸为 (batch_size, timesteps, units)。 否则,返回尺寸为 (b -
堆叠多层bi-lstm的方法
2019-01-07 10:13:52自己在搭建多层双向lstm网络的时候,看了很多的资料,一开始的时候搭建都是不成功的,后来看了官方的资料还有一些博客,使用了2种方法搭建成功了! 方法1: n_hidden_units=50 # 隐藏层神经元数目 num_layers=3 #... -
深度学习之循环神经网络(9)LSTM层使用方法
2021-10-07 20:56:56深度学习之循环神经网络(9)LSTM层使用方法1. LSTMCell2. LSTM层 在TensorFlow中,同样有两种方式实现LSTM网络。既可以使用LSTMCell来手动完成时间戳上面的循环运算,也可以通过LSTM层方式一步完成前向运算。 1.... -
双向LSTM程序_BiLSTM.rar
2021-12-19 17:06:42在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。(A bidirectional LSTM program Long short term network, commonly known as LSTM, is a special type of RNN that can learn long-... -
我训练了不同的模型,其中一个模型包含一个LSTM层。 它在10个时元上的准确度为84%。 第二个示
2021-04-19 17:36:49我训练了不同的模型,其中一个模型包含一个LSTM层。 它在10个时元上的准确度为84%。 第二个示例由两组Conv1D和MaxPooling1D图层组成,后面是标准GRU图层。 观察到85%的准确性。 我已经将CuDNN层用于LSTM和GRU,... -
TensorFlow入门(五)多层 LSTM 通俗易懂版
2017-03-10 12:28:59@creat_date: 2017-03-09 前言: 根据我本人学习 TensorFlow 实现 LSTM 的经历,发现网上虽然也有不少教程,其中很多都是根据官方给出的例子,用多层 LSTM 来实现 PTBModel 语言模型,比如: tensorflow笔记:多层... -
tensor-poet:Tensorflow Jupyter-Notebook,用于通过深度LSTM从多个来源可视化文本生成
2021-02-04 13:55:25tensor-poet:Tensorflow Jupyter-Notebook,用于通过深度LSTM从多个来源可视化文本生成 -
基于keras的双层LSTM网络和双向LSTM网络
2020-03-11 12:49:11基于keras的双层LSTM网络和双向LSTM网络中,都会用到 LSTM层,主要参数如下: LSTM(units,input_shape,return_sequences=False) units:隐藏层神经元个数 input_shape=(time_step, input_feature):time_step是... -
文本分类(一) | (6) 多层双向LSTM
2019-12-21 22:16:48对于输入文本序列,在LSTM的每个时间步输入序列中一个单词的嵌入表示,计算当前时间步的隐藏状态,用于当前时间步的输出以及传递给下一个时间步和下一 个单词的词向量一起作为LSTM单元输入,然后再计算下一个时间步... -
RNN之多层LSTM理解:输入,输出,时间步,隐藏节点数,层数
2019-02-28 16:37:39从pytorch代码角度初次理解LSTM各种术语。 LSTM: ...hidden_size 隐层状态的维数:(每个LSTM单元或者时间步的输出的ht的维度,单元内部有权重与偏差计算) num_layers RNN层的个数:(在竖直... -
一个双向LSTM程序 BiLSTM.rar
2022-05-13 16:07:19在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。(A bidirectional LSTM program Long short term network, commonly known as LSTM, is a special type of RNN that can learn long-...