LSTM结合一维CNN使用的基本理解

结合一维 CNN 和 RNN 来处理长序列已经十分常见,然而这对组合对身为小白的我造成了一定的困扰。要知道CNN各通道的输出可是平行的,并不存在什么先后顺序,然而RNN却要求的输入却是序列,这一开始令我十分不解,而后通过对CNN和RNN的输出输入参数的数量和形状为切入点总算是让我搞明白了它们的运作机理。

简化模型如下:

from keras.models import Sequential
from keras import layers

model = Sequential()
model.add(layers.Conv1D(64, 5, activation='relu',
                        input_shape=(None, 10)))
model.add(layers.LSTM(32))

看看模型的参数数量:

model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
conv1d_1 (Conv1D)            (None, None, 64)          3264
_________________________________________________________________
lstm_1 (LSTM)                (None, 32)                12416
=================================================================
Total params: 15,680
Trainable params: 15,680
Non-trainable params: 0
_________________________________________________________________

可以看到卷积层的参数数量是3264个,计算公式为:

(过滤器的长度 * 输入的深度 + 1) * 卷积层通道数

也就是(5 x 10 + 1)x 64 = 3264

LSTM层的参数数量是12416个,计算公式为:

4 x (64 x 32 + 32 x 32 + 32) = 12416

接下来大概介绍一下这两个参数数量代表什么含义(有错漏还请指正):

一维卷积层接受形状为 [samples, time_steps, depth]的输入,以输入一句由n个单词组成,其中每个单词用长度为10的密集向量表示的句子为例,则该输入的samples=1,time_steps=n, depth=10,形状为[1, n, 10]。

假定该卷积层有64个长度为5的filter,由于 filter的depth必须与input的depth等同,故weight参数数量为 5x10x64,bias的数量为 1×64

filter在time_steps轴上进行卷积操作,操作过程与二维卷积思路一致,当 padding=’same’的时候,卷积后每个channel应当得到 长度仍为time_steps,深度为depth的二维张量,但由于要 在depth轴上求和,所以 每个channel给出长度为time_steps的一维张量,整个层 最终给出形状为[samples, time_steps, channels]的输出,例子中为[1, n, 64], 该输出可直接传入LSTM层。 其作用是将原本每个单词的特征(可以由Embeding给出)转化为cnn给出的特征,相当进行了一次抽象程度更高的embedding。另外,只需对卷积层的输出进行pooling操作就可以减小time_steps的长度(一般说来不对channels进行pooling,与二维卷积同样一致),毕竟过长的序列很容易导致训练过程中出各种幺蛾子。

接下来LSTM层的参数数量就很好理解了,由于LSTM层得到的输入形状为 [samples, time_steps, channels],由于LSTM自身有32个输出通道,那么根据LSTM的基本架构:

output_t = activation(dot(state_t, Uo) + dot(input_t, Wo) + bo) * c_t

Uo是一个形状为[32, 32]的矩阵,Wo是一个形状为[channels, 32]的矩阵,bo形状为[, 32],参数数量和为32 x 32 + 64 x 32 + 1 x 32 = 3104。又由于输入门,遗忘门和输出门三个变换的形式都和 基本RNN 单元相同,参数数量也相同,所以整个LSTM层的总参数数量为4 x 3104 = 12416

Original: https://blog.csdn.net/a871891824/article/details/120599129
Author: 知者不知,行者未行
Title: LSTM结合一维CNN使用的基本理解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/530506/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球