Keras中LSTM使用过程中的几个易混点

现在dl学习的过程已经越来越简单的了,尽管很多时候真的只是调用API即可,但遇到需要定制的需求,这时候就需要清晰理解各个注意点,这里记录下LSTM API使用中的几处笔记。

1、LSTMCell类和LSTM类的区别

解答:LSTMCell类是对LSTM单个计算单元的完整封装,里面包含了各个计算步骤的详细过程,在LSTM层中用作实际计算单元。而LSTM类是抽象类RNN的子类,通过实例化LSTMCell来完成LSTM的计算。简单来说,LSTMCell类是LSTM的“心”,而LSTM类是LSTM的“壳”(比喻不一定恰当)。

Keras中LSTM使用过程中的几个易混点_第1张图片

 

2、LSTM中的return_sequences和return_state的区别?

解答:return_sequence返回每个时间步上的隐状态(hidden state),return_state返回最后一个时间步上的隐状态和细胞状态(hidden state和cell state)。

y = LSTM(units=self.rnn_units)(x) 
Tensor("lstm_1/TensorArrayReadV3:0", shape=(?, 128), dtype=float32)

y = LSTM(units=self.rnn_units, return_sequences=True)(x) 
Tensor("lstm_2/transpose_2:0", shape=(?, ?, 128), dtype=float32) 

y = LSTM(units=self.rnn_units, return_state=True)(x) 
[, , ] 

y = LSTM(units=self.rnn_units, return_sequences=True, return_state=True)(x) 
[, , ]

 

3、LSTM中activation和recurrent_activation的区别?

解答:recurrent_activation是针对三个门机制(遗忘门、输入门、输出门)的激活函数,而activation是针对输入信息(默认tanh)和当前隐状态输出(默认tanh)的激活函数。

Keras中LSTM使用过程中的几个易混点_第2张图片

 

4、LSTMCell类和LSTM类分别如何使用?

RNN(LSTMCell(32))

LSTM(32)

这2者等价

 

5、LSTM(32)调用关系的简单分析

解答:

step1:实例化LSTMCell()和调用执行。

step2:根据各个参数确定output_shape大小(比如return_state)

step3:调用tf(假定后端使用tf)后端K.rnn()

step4:后端tf中调用control_flow_ops.while_loop(位于control_flow_ops.py文件中)

下面最后一个调用关系比较复杂,暂还没看懂。

 

6、keras使用过程中,activation等参数接受字符串值,keras是如何实现真正调用到相应激活函数的?

解答:在activations.py中调用globals()函数,获取到当前py模块中全局变量映射,其中各个激活函数的名字和激活函数本身存在kv的映射关系。直接get激活函数名称字符串就能得到激活函数本身。这其实是一种“反射”机制。

Keras中LSTM使用过程中的几个易混点_第3张图片

 

-- 未完待续 --

 

你可能感兴趣的:(deep,learning,keras)