前面一文我们简单得介绍了ConvLSTM
得原理和应用场景,现在来看看在Tensorflow
它具体是如何实现得。 值得一说得是Tensorflow
在实现这个算法得时候并没有使用peepholes
,即下面的红色部分,而是基于原始的LSTM网络结构改变的。不过在最后,我也会给出一个仿照Tensorflow实现的基于peepholes
的ConvLSTM版本。
![](https://i-blog.csdnimg.cn/blog_migrate/2ea12dca8eac75c1850c7dc6dcce32d1.png)
1.用法
在接受具体用法前,先来大致解释一下参数。由于该算法是CNN与LSTM的一个结合,所以在说到对其中各个参数理解的时候,我会将其类比于CNN和LSTM中对应的参数。
def __init__(self,
conv_ndims,
input_shape,
output_channels,
kernel_shape,
use_bias=True,
skip_connection=False,
forget_bias=1.0,
initializers=None,
name="conv_lstm_cell"):
参数:
conv_ndims:
卷积维度,对于平面卷积来说都为2,例如图片的卷积处理;
input_shape:
输入维度(除去batch_size),例如当conv_ndims=2
时,输入维度就应该为[weight,high,channel]
,最简单的就是将它想象成一个图片;
output_channels:
最终输出时的深度;就像是在conv2d
中卷积核的深度一样,它决定了最终提取特征后的图像的深度
kernel_shape:
卷积核的平面大小例如[3,3]
;熟悉conv2d
的都知道卷积核的维度应该是4,这儿怎么才2,原因就是剩下的两个维度直接通过计算就可以得到,这部分在ConvLSTM
的内部实现中完成
use_bias:
这个很好理解,是否要使用偏置
剩下的参数保持默认就好。
1.1 单个单元cell.call()
import tensorflow.contrib as contrib
import tensorflow as tf
inputs = tf.placeholder(dtype=tf.float32, shape=[64, 10, 10, 28]) # [batch_size,width,high,channeals]
cell = contrib.rnn.ConvLSTMCell(conv_ndims=2, input_shape=[10, 10, 28], output_channels=6, kernel_shape=[3, 3])
initial_state = cell.zero_state(batch_size=64, dtype=tf.float32)
output, final_state=cell.call(inputs=inputs,state=initial_state)
print(output)
print(final_state)
>>
Tensor("mul_2:0", shape=(64, 10, 10, 6), dtype=float32)
LSTMStateTuple(c=<tf.Tensor 'add_2:0' shape=(64, 10, 10, 6) dtype=float32>, h=<tf.Tensor 'mul_2:0' shape=(64, 10, 10, 6) dtype=float32>)
![](https://i-blog.csdnimg.cn/blog_migrate/5df5d89167ad5d4e076e1e91029ee306.png)
从图中我们可以看到每个输出结果的维度是由哪些参数所确定的。
1.2 按时