实现keras中ConvLSTM2D中recurrent_activation和activation的设置
- LSTM结构如下图
一种常见的写法为如下,每个门的生成除了当前时刻的信息Xt和上一个时刻的输出ht-1外,还外加了一个小尾巴 Ct-1,即上一个时刻的状态。 但是这个写法其实太过复杂,而且不易理解LSTM中参数个数的计算
而这样的写法其实是更合适。每个门的生成都与当前时刻输入和上一个时刻的输出有关。
这三个门的**函数都默认为sigmoid(hard_sigmoid),在keras中为用recurrent_activations参数表示。
而输入Ct和输出信息ht里面使用的两个**函数都默认为tanh,在keras中用activations表示。
LSTM参数计算方法可参考如下链接
https://blog.****.net/PIPIXIU/article/details/81014168
https://www.cnblogs.com/wushaogui/p/9176617.html
- ConvLSTM2D
施雄健提出的ConvLSTM2D可以具备处理时空特性数据的能力。主要改动是将LSTM的部分gate由矩阵乘法运算改成卷积运算。这个具体参数和维度信息我后期会出一篇介绍。
keras根据这个思路将ConvLSTM2D进行了封装。
其封装过程中将三个门的**函数都用一个recurrent_activation来表示,两个tanh**函数也只用一个activations来指定。
也就是说,keras中,ConvLSTM2D使用了5个**函数,但是只传入两个**函数参数进行控制。
如果我们想对三个门和其他两个tanh**函数,这5个**函数分别使用不同的**函数,如relu什么的,在keras里面就没有办法实现。
- 源码
keras的ConvLSTM2D层在keras.layers中,其底层源码一般保存在你的anconda所安装的路径的layers里面,如下图。
其中convolutional_recurrent就是ConvLSTM2D的源码。为了以防万一,备份一份,进行修改。
将其打开,看544行和545行。默认为tanh和hard_sigmoid
在727-731行为ConvLSTM2D的**函数使用方式。是不是很相似,和上面的公式一模一样! - 源码修改
这里将5个**函数用5个参数来标准,这样就可以实现一对一精准修改啦
activation_i=‘tanh’,
activation_o=‘tanh’,
recurrent_activation_f=‘hard_sigmoid’,
recurrent_activation_i=‘hard_sigmoid’,
recurrent_activation_o=‘hard_sigmoid’,
前两**函数为上面公式 4和6中所用。后三个**函数表示三个门(遗忘门、输入门和输出门)所用**函数
这两块是最基本的更改,除此之外,还要其他一些细节也要就行相应的修改。具体就不一一讲解了,都贴在下面了,有具体的行数可以对应修改。
修改完成之后,就修改好的convlutional_recurrent.py放进layers里面去(进行替换)。之后重启你的IDE,就可以看到修改后的效果啦.如下图。
亲测有效!!!
5. 注意事项。
修改好源码后,ConvLSTM2D? 会出现如下解释,似乎并没有改变。但是实际上注释已经和参数不一样啦。所以大家修改源码的时候,最好也将注释进行对应修改哦
另外,LSTM中的**函数的改变,也可以相对应的方式进行源码修改。下面这个链接会给你启发的。
https://blog.****.net/silent56_th/article/details/73442391
另外,如果有需要修改后的源码的,可以私聊 !
欢迎转载,如转载,务必加上参考链接!