【语音识别】关于多层LSTM的结构解读

首先明确一点,RNN单元的输入输出的维度,点击参考keras.layers.RNN()文档

输入尺寸

3D 张量,尺寸为 (batch_size, timesteps, input_dim)。

输出尺寸

  1. 如果 return_state:返回张量列表。 第一个张量为输出。剩余的张量为最后的状态, 每个张量的尺寸为 (batch_size, units)。
  2. 如果 return_sequences:返回 3D 张量, 尺寸为 (batch_size, timesteps, units)。
  3. 否则,返回尺寸为 (batch_size, units) 的 2D 张量。
    每层LSTM的输入是前一层的LSTM的输出,所以自第二层LSTM开始,input_shape参数是可以忽略的

以双层的LSTM为例

#参数
time_steps = 10
features = 2
input_shape = [time_steps, features]
batch_size = 32
model = Sequential()
model.add(LSTM(64, input_shape=input_shape,  return_sequences=True))
model.add(LSTM(32,input_shape=input_shape))
model.summary()
>>>
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_2 (LSTM)                (None, 10, 64)            17152     
_________________________________________________________________
lstm_3 (LSTM)                (None, 32)                12416     
=================================================================
Total params: 29,568
Trainable params: 29,568
Non-trainable params: 0

调整模型,查看输出

model.add(LSTM(32,input_shape=(10000,10000)))	#调整了第二层的input_shape
Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_4 (LSTM)                (None, 10, 64)            17152     
_________________________________________________________________
lstm_5 (LSTM)                (None, 32)                12416     
=================================================================
Total params: 29,568
Trainable params: 29,568
Non-trainable params: 0

可以看到模型的输出维度并未改变。
如果第二层LSTM的return_sequences=True,会怎样?

model.add(LSTM(32,return_sequences=True))
Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_6 (LSTM)                (None, 10, 64)            17152     
_________________________________________________________________
lstm_7 (LSTM)                (None, 10, 32)            12416     
=================================================================
Total params: 29,568
Trainable params: 29,568
Non-trainable params: 0

从结果发现,两者之间的时间步都是10,也就是第一层的输入维度,也就是说,32并不是第二层LSTM单元的个数,而应该是每个时间步X的维度为32.第二层LSTM单元的个数仍然为10个。如果要更改时间步的数量,可使用masking层,点击见文档Masking
在每个时间步,LSTM-64将传递给LSTM-32形状为[batch_size,time_step,input_dim]的向量
从我们的模型来看,Input应该就是10,对应着我们的时间步,而每个时间步对应着64,32个特征。
看到这里,不禁要问,那输出中的第三个数,也就是我们的64,32是什么?答案是我们的每个时间步对应的特征的个数。
那是怎么从64变为32的呢?让我们从单个LSTM单元说起。

我们可以简单的将LSTM内部的各种计算想象成全连接的之间的矩阵计算。

所以units代表的不是一层单元的个数,而是单元内部隐藏层的大小。
对于LSTM而言,每个单元有3个门,对应了4个激活函数(3个sigmoid,一个tanh)。也就是说有4个神经元数量为32的前馈网络层。
在这里插入图片描述
对于LSTM的计算过程,我们这里举一个简单的例子:(此例转自对LSTM层的参数units 的理解)

假如我们样本的每一句话包含5个单词,每个单词用16维的词向量表示。对于LSTM(units=32),我们可以把LSTM内部的计算过程计算过程简化为:

Y=XW,这里X为(1,16)的向量,W为(16,32)的矩阵,所以运用矩阵乘法,将16维的X转化为32维的向量。
如下图所示
在这里插入图片描述
另外一张表示LSTM内部计算的图示。

在这里插入图片描述

再给出一个多层LSTM的例子,取自Keras文档。
图为下述代码的模型结构示意图

from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np

data_dim = 16
timesteps = 8
num_classes = 10

# 期望输入数据尺寸: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # 返回维度为 32 的向量序列
model.add(LSTM(32, return_sequences=True))  # 返回维度为 32 的向量序列
model.add(LSTM(32))  # 返回维度为 32 的单个向量
model.add(Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

# 生成虚拟训练数据
x_train = np.random.random((1000, timesteps, data_dim))
y_train = np.random.random((1000, num_classes))

# 生成虚拟验证数据
x_val = np.random.random((100, timesteps, data_dim))
y_val = np.random.random((100, num_classes))

model.fit(x_train, y_train,
          batch_size=64, epochs=5,
          validation_data=(x_val, y_val))

参考文章:

  1. Keras 基于栈式 LSTM 的序列分类
  2. StackOverflow-在栈式LSTM中,每层LSTM的输入是什么?
  3. 对LSTM层的参数units 的理解
  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值