LSTM网络的输入输出的维度和值的理解

1 引言

       相信很多使用LSTM网络的初学者跟我一样,需要从刚开始不会用,再到只是会用LSTM写模型,最后基本理解LSTM的网络结构及输入输出。

2 对LSTM网络的分析

    LSTM网络从概念上讲,主要包括四个门,依次为遗忘门f,输入门i,更新门g(我这里也把它看做一个门,因为这样好说明问题,其实是cell的备选值,但在文章或学术上仍然以其余三个门为准)和输出门o。如下图

上图对于每一个门有相应的计算方式:

              f=sigmoid(Wf(x(t),h(t-1))+bf)

              i=sigmoid(Wi(x(t),h(t-1))+bi)

              g=tanh(Wg(x(t),h(t-1))+bg)

              o=sigmoid(Wo(x(t),h(t-1))+bo)

对于S(t)和h(t)有:

             S(t)=f*C(t-1)+i*g

             h(t)=tanh(C(t))*o

对于上面的公式可以参考源码:

3 实现细节

1.units表示什么:

所谓units就是你写代码时传入的神经元个数,即下图中的HIDDEN_SIZE。这里的神经元个数表示每一个门里面的神经元个数,即若我设HIDDEN_SIZE=128,那么上面每个门里面的神经元个数均为128,实际上每个门就是一个含128个神经元的前馈神经网络。

2.关于初始值,也就是对于第一个传入的x1不存在S和h时,可以参考源码,即设为维度为神经元个数的0向量。

4 举例说明

1.假设经过上层传入LSTM的x1=[1,2,3],那么如果为第一个则初始化h=[0,0,0,0,0](假设神经元个数为5),初始s=[0,0,0,0,0],每个门的权重W矩阵维度为(5,8),偏置b的维度为(5,);

2.执行第一步,拼接x1和h形成一个维度为(8,)的输入,这里暂且记为input;根据上面公式算每个门的值,以遗忘门为例:

f=sigmoid(np.dot(wf,input)+bf)可以得出f的维度为(5,)你会发现f的维度跟初始的C一样,所以可以进行相乘运算;那么我们易知每个门的计算值的维度均为(5,),所以你会发现一切的点乘和相加都能够正常计算;那么我们可以推出h的维度也为(5,)

      综上,可以直达在LSTM网络中的S也作C的维度为(神经元个数,),h的维度也为(神经元个数,)

最后,因为本人也是初识LSTM,文中可能有不对的地方,可以多多指教,方便改正。

  • 13
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
LSTM网络中添加Attention层可以提高模型对输入序列的关注程度,使得模型能够更好地理解输入序列中的重要信息。下面是在LSTM网络中添加Attention层的一般步骤: 1. 对于每个时间步的LSTM隐藏状态,计算其与一个可学习的向量(通常称为query向量)之间的相似度,得到一个注意力权重向量。 2. 将注意力权重向量与LSTM隐藏状态向量相乘,并对结果进行求和,得到一个加权后的向量表示。 3. 将加权后的向量表示输入到下一个时间步的LSTM中,继续进行处理。 具体实现方式可以参考以下步骤: 1. 定义Attention层的输入:LSTM隐藏状态序列。在Keras中,可以使用`Input`函数来定义Attention层的输入,例如: ``` lstm_hidden_states = Input(shape=(None, lstm_hidden_size)) ``` 2. 定义Query向量。在Keras中,可以使用`Dense`函数来定义Query向量,例如: ``` query = Dense(lstm_hidden_size, activation='tanh')(lstm_hidden_states) ``` 3. 计算注意力权重向量。在Keras中,可以使用`Dot`函数来计算注意力权重向量,例如: ``` attention_weights = Dot(axes=(2, 1))([query, lstm_hidden_states]) attention_weights = Activation('softmax')(attention_weights) ``` 4. 将注意力权重向量与LSTM隐藏状态向量相乘并求和。在Keras中,可以使用`Dot`函数和`Lambda`函数来实现注意力加权和的计算,例如: ``` attention_output = Dot(axes=(2, 1))([attention_weights, lstm_hidden_states]) attention_output = Lambda(lambda x: K.sum(x, axis=1))(attention_output) ``` 注意,这里使用了`K.sum`函数来对注意力加权和进行求和,因为在时间步上进行加权和是有意义的,而在特征维度上进行加权和则没有意义。 5. 将注意力加权和作为下一个时间步的输入。在Keras中,可以使用`Concatenate`函数将注意力加权和与LSTM输出拼接在一起,例如: ``` lstm_output = Concatenate(axis=-1)([lstm_output, attention_output]) ``` 注意,这里使用了`axis=-1`来表示在最后一个维度上进行拼接,因为LSTM输出的最后一个维度是隐藏状态的维度,而注意力加权和的维度也是隐藏状态的维度,因此可以在这个维度上进行拼接。 6. 将Attention层嵌入到LSTM模型中,并进行训练。在Keras中,可以使用`Model`函数将Attention层和LSTM层组合成一个模型,例如: ``` lstm_input = Input(shape=(max_sequence_length, input_dim)) lstm_output = LSTM(lstm_hidden_size, return_sequences=True)(lstm_input) attention_output = ... # 定义Attention层的输出 lstm_output = Concatenate(axis=-1)([lstm_output, attention_output]) lstm_output = ... # 继续定义LSTM层和其他层的输出 model = Model(inputs=lstm_input, outputs=...) model.compile(...) model.fit(...) ``` 注意,这里使用了`return_sequences=True`来保留LSTM层的所有输出,因为需要将每个时间步的输出与Attention加权和进行拼接。同时,还需要定义其他层的输出,并使用`Model`函数将所有层组合成一个模型,然后使用`compile`函数和`fit`函数进行训练。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值