lstm原文_conv-LSTM解读:背景&介绍&优劣势&适用场景(附生成视频seq预测问题的keras代码)

conv-LSTM

产生背景:

conv-lstm的诞生,与一 个降水预测的问题有关——“给定前几个小时的降水分布图,预测接下来几个小时的降水分布情况”

27fc1389d41f8e146c5dcb37712831fa.png


我們的任務是希望可以透過以往的前 J 張圖片,可以產生後面 K 張的圖片。**

这个问题很明显我们需要从时间序列、空间关系的角度去考量。

原文的贡献在于将能够抽取空间特征卷积操作加到了能抽时序特征LSTM网络中来,提出了CONV-LSTM的架构。

定义及介绍;

FC-LSTM的表达如下所示:

92bd605eab899968cf371fd6913b55a0.png

而在conv-LSTM中,我们将一部分的连接替换为了卷积操作,出发点很明显也就是要用权重共享来体现空间上的相关性:

38effd0accb7829466dffb141517cc0e.png

如下为公式的图形解释图:

2697ba43458f185726d85a13300eccda.png

网络架构:Encoding-Forecasting Structure

编码预测(解码):

5b65a711fcc2780b2377310a2d60f27f.png

优势/缺点

  • 优点:
  1. 兼顾时空,大部分时空预测都以他为building block。
  • 缺点:
  1. 并行堆叠之后层与层之间是独立的,抽空间特征会影响到时间信息的传播,详见https://cloud.tencent.com/developer/article/1584966。

适用的场景或问题

  • 时空序列问题

经典变形/改进:

  • PredRNN: Spatiotemporal LSTM:

7074cea77c4747451c357238b21d22fa.png

就是解决刚刚说的那个缺点,并行结构中信息利用不够充分的问题,这里通过新搞了个M状态来解决。

参考

https://www.jianshu.com/p/a82c0ad728f1

https://blog.csdn.net/guohao_zhang/article/details/79435485

http://193.112.63.105/?p=606

https://medium.com/@xiaosean5408/convlstm%E7%B0%A1%E4%BB%8B-convolutional-lstm-network-a-machine-learning-approach-for-precipitation-nowcasting-84fa4541cb46

编码测试

输入编码格式与输出编码格式

XYshape(Batch_size,TIME_STAMP,WIDTH,HEIGHT,CHANNEL)(Batch_size,TIME_STAMP,WIDTH,HEIGHT,CHANNEL)含义Batch_size组前TIME_STAMP张输入图片Batch_size组前后TIME_STAMP张输入图片

本例中,

Batch_sizeTIME_STAMPWIDTH/HEIGHTCHANNEL1015401

网络结构(配图)

3cc0eed8ef1b60fb012102ace1e3a779.png

5e862dfbf9f276fe085e817f4ab1bf53.png

所用的激活函数

  • ConvLSTM2D的cell中输出有tanh激活,几个门控由hard-sigmoid(sigmoid的近似)激活
  • Conv3D最后的输出由sigmoid激活

伪代码

# first, get our data
​
# build our model
seq = Sequential()
# repeat the convlstm2d_bn struct for 4 times
seq.add(ConvLSTM2D())
seq.add(BatchNormalization())
​
seq.add(ConvLSTM2D())
seq.add(BatchNormalization())
​
seq.add(ConvLSTM2D())
seq.add(BatchNormalization())
​
seq.add(ConvLSTM2D())
seq.add(BatchNormalization())
# end
seq.add(Conv3D())
seq.compile(loss='binary_crossentropy', optimizer='adadelta')
​
# train our model
​
# test and predict
​

测试问题及输出

  • 问题描述:视频序列预测——人工生成30帧的方块移动视频,丢前15帧进入,预测后15帧的输出。
  • 参数设置:

epochbatch_sizeoptimizerloss100010adadeltabinary_crossentropy

  • 输出结果:

12f12b3e0a1735b5620a42fcdc4fc4a0.png
可以看出,后面的loss变化已经很小了,这样继续train是会导致过拟合的。后面考虑早停法改进。

4c5dc58a9c5b707a980a7d94c82e39f4.png
方块消失的现象:暂时不知道怎么解释。有可能是过拟合数据了。

9d70132ecd9e895da266fdbeed428deb.png
解释:可以从其中一部分的输出预测输出看出,预测还是很不准的。
问题主要有:1. 图片太糊了,2. 丢了一些方块。
这个问题用 GAN来做应该会好很多,至少模糊的问题是可以解决的(这个问题中的判别标准只是predict和label的交叉熵损失,太简单了)

个人感悟

  • colab真tm的坑多...根本无法训练到说的最多12小时,一会儿就断了,有时还限制GPU的使用。
    目前遇到的一些colab的坑:
  1. 不要把数据放到colabdrive上,会有很惊人的IO。。
  2. 及时保存模型或者结果,因为你不知道什么时候会突然断开。。
  3. colab上的操作不像本地,有些操作在colabnotebook上直接执行是没用的,得运行专门设置的命令才能有用(例如tensoflow的转版本命令%%tensorflow_version 1.x)。
  • 论文原文指出了对物体速度移动的洞悉和kernelsize相关,基于这个先验知识(大核对大移动敏感,小核对小移动敏感),可否做一个自适应kernelsze来更分注意力捕捉两种速度的移动情况。

05bfe5ae1c39d68ee2ada1b414e26601.png
  • 与GAN结合:判别做的太差了

Git链接

https://github.com/liuyixin-louis/dl_learning/blob/master/conv_lstm.ipynb

参考

https://github.com/ndrplz/ConvLSTM_pytorch

https://github.com/tychovdo/MovingMNIST

https://architect1st.github.io/2019/04/23/ConvLSTM-Part-2/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值