Caffe中实现LSTM网络的思路以及LSTM网络层的接口使用方法。 本文描述了论文《Long-term recurrent convolutional networks fo

代码地址:https://github.com/junhyukoh/caffe-lstm、

小demo:http://christopher5106.github.io/deep/learning/2016/06/07/recurrent-neural-net-with-Caffe.html

本文内容:

  • 本文描述了Caffe中实现LSTM网络的思路以及LSTM网络层的接口使用方法。
  • 本文描述了论文《Long-term recurrent convolutional networks for visual recognition and description》的算法实验
  • 本文不做LSTM原理介绍,不从数学角度推导反向传播,不进行Caffe详细代码分析
  • 本文基于对Caffe的代码及使用有一定的了解

涉及LSTM算法原理的部分可以参考其他文章见如 理解 LSTM 网络等。

1 简介及相关论文

LSTM为处理具有时间维度以及类似时间维度信息的RNN深度神经网络的一种改进模型,参考文献[1,2],在不少问题上能弥补CNN只能处理空间维度信息的缺陷。不同于CNN的深度体现在网络层数及参数规模上,RNN/LSTM的深度主要体现在时间节点上的深度。

Caffe中的LSTM相关代码由Jeff Donahue基于文献[1]的实验Merge而来。文献[3]中有三个关于使用LSTM的实验:(1)行为识别(介绍及代码) (2)图像描述(图像标注,介绍及代码) (3)视频描述。 三个实验难度依次递增。其中前两个实验代码开源。

论文图片

本文主要从文献[3]第一个实验出发,介绍LSTM的接口的使用。

2 行为识别实验

实验使用UCF-101 数据集。行为识别实验目的为给定一视频片段,判断出视频片段人物的行为。

2.1 算法介绍

如1.1图所示,该实验的方法为:

  1. 首先提取视频的部分帧
  2. 其次根据标注的帧预训练一个图片分类网络(基于AlexNet)
  3. 训练LSTM模型 
    • 预训练的共享的CNN提取一段视频序列(时间上相关的帧)的CNN特征
    • 以上特征输入至LSTM单元
    • 对每个LSTM单元的输出取平均得到最后的检测结果

2.2 网络模型

Caffe训练网络的网络结果如下所示: 

2.3相关术语及变量

  • N  为LSTM同时处理的独立流的个数,在该实验中为输入LSTM相互独立的视频的个数,以该实验测试网络为例,本文取 T=3

  • T  为LSTM网络层处理的时间步总数,在该实验中为输入LSTM的任意一独立视频的视频帧个数,以该实验测试网络为例,本文取 T=16

  • 因此fc-reshape层输出维度为  T×N×4096 . 4096为AlexNet中全连接层的维度,即CNN特征的维度。

  • reshape-cm的输出维度为  T×N ,即每一个帧有一个是否连续帧的标志。

  • reshape-label的维度同样为  T×N

3 Caffe 相关类及接口

3.1 相关类

主要类说明见官方文档 RecurrentLayerLSTMLayerLSTMUnitLayer

其中:

  • RecurrentLayer为一个抽象类,定义了处理时间序列的循环神经网络的通用行为
  • LSTMLayer及RNNLayer为RecurrentLayer的具体实现,后者为RNN的一般形式
  • LSTMUnitLayer在LSTMLayer内部使用,处理了部分核心计算

3.2 接口说明

由官方文档可知,一个 RecurrentLayer/LSTMLayer 的输入为三个Blob:

  • 一. 时间变化数据 x(T×N×...) 。2.3处已介绍,此实验测试网络中该维度为 16×3×4096 。注意 T N 前面。
  • 二. 序列连续性标志 cont,(T×N) 。2.3处已介绍,此实验测试网络中该维度为 16×3 ,其中0表示该图片为视频帧的开始,1表示该图片为上一帧的延续。注意不能反过来用1表示为开始,在代码实现中,开始帧视频应当“遗忘”以往的信息,所以乘以0归零了之前的数据。
  • 三. 时间不变的静态数据 xstatic,(N×...) (可选)。该项在行为识别中没有使用,而在第二个实验图片描述中有使用。如使用一张不随时间变化的图片作为第三个输入,该图片的输入维度为 N×4096 .

4 LSTMLayer

Caffe中通过展开LSTMLayer网络层,得到另一个网络从而实现LSTM,即一个LSTMLayer即为一个LSTM网络。以实验中测试网络为例,及 T=16,N=3 ,CNN特征维度为4096,LSTM特征维度为256,来介绍展开网络的各网络层及数据流动情况。

4.1 实现流程

如图所示:

  • 方框为网络层,文字为网络层类型。
  • 椭圆为数据Blob。
  • Blob  ci 为细胞状态; Blob  hi 为隐藏状态
  • 蓝色为输入数据或产生输出数据的网络层。
  • 红色为权重网络层。
  • 整体外框为基类RecurrentLayer实现的功能,子框为LSTMLayer实现的功能。
  • 输出为Blob h(1,3,256)。
  • 最后的Reduction层生产的伪损失,该网络层不起功能作用,存在的意义只是使这个网络变得完成,而“强制”反向传播。
  • 多个时间步( T1,,T16 )间的InnerProduct是共享参数的,及保证了各个时间步的权重能处理同一时间序列。因而整个网络(LSTM网络)只有三个权重Blob:图中第一个红色框中的InnerProduct层的权重 Wxc 及 偏置 bc ,后边所有红色权重层的权重 Whc (共享的,且无偏置)
  • Scale层为根据cont提供的序列连续性情况,来决定是否保持(乘1)与放弃(乘0)之前的隐藏状态 ht1

4.2 公式描述

论文图片

计算公式如下:

it:=sigmoid[Whiht1+Wxixt+bi]ft:=sigmoid[Whfht1+Wxfxt+bf]ot:=sigmoid[Whoht1+Wxoxt+bo]gt:=tanh[Whght1+Wxgxt+bg]ct:=(ft.ct1)+(it.gt)ht:=ot.tanh[ct]

注意:

  • 联系前两张图与以上公式,可以描述Caffe的LSTM实现过程
  • 以上公式的 [Wxi,Wxf,Wxo,Wxg] 为由第一个InnnerProduct层保存,及4.1中的 Wxc
  • 以上公式的 [bi,bf,bo,bg] 为由第一个InnnerProduct层保存,及4.1中的 bc
  • 以上公式的 [Whi,Whf,Who,Whg] 为由后边的InnnerProduct层保存,及4.1中的 Whc

5 总结

一个RNN/LSTM网络层可以通过从时间维度上进行展开来进行理解( 理解 LSTM 网络)。同样的,Caffe在实现LSTM时也是通过展开LSTM层来实现,等价于一个LSTM 网络层 即为一个LSTM 网络。

6 图像描述实验

实验使用coco caption数据集。给定一张图片,其目标为产生一段语句对该图片进行描述。

6.1 语言模型小实验

这部分实验属于图像描述的基础实验。图像描述在该实验基础上拓展而来,且相对图像描述来说更为简单,因而先介绍该小实验。

语言模型实验为训练一个语言模型,使其能够完成: 
(1)给定一个词,如some,该模型能产生下人类语言中能搭配该词的下一个次,如some people, some apple。 
(2)在(1)的基础上,该模型能产生一个完整的语句。

链接处为作者给出的该模型的实例与教程。

6.1.1 训练

该模型的训练过程与行为检测的训练过程类似。如图所示,LSTM层的输入为两个Blob: 
(1)训练数据Blob,维度为 T×N×1000 ,其中1000为每个词的特征,即语言模型的训练数据中,一个词对应于行为识别中的一张图片(行为识别的训练数据维度为 T×N×4096 )。 
注意,此处说的维度为embedded_input_sentence的维度。而输入数据的input_sentence的维度为 T×N×8801 8801 为词典(词库)的规模 N ,即输入数据为该词在该词典中的独热向量(one-hot vector) y˜,y˜R8801 。该独热向量通过权重层Embed层产生一个 1000 维的特征向量 y,yR1000 。该Embed层等价于实现 y=Wey˜,WeR1000×8801 。由于 y˜ 为独热向量,所以也可以理解为 We 为一个查找表,每一列为一个词的特征向量。 
(2)连续性标志Blob。与行为识别类似,维度为 T×N  
这里写图片描述

6.1.2 推理

该模型的产生一个完整句子的过程推理如下图所示。

说明: 
1. 生成一个完整的句子需要反复多次调用该语言模型,即前一次的结果作为下一次的输入,直至最后的输出为语句终止符EOS 
2. 推理时的输入LSTM维度为 1×N×1000 ,如果是只产生单个语句,则为 1×1×1000

6.2 使用静态输入 xstatic

不同于行为识别实验以及语言模型小实验,图像描述实验的LSTM层使用了第三个输入参数,静态输入 xstatic 。有 xstatic LSTM层的训练模型如下图所示:

注意:

  1. 第一个输入Blob同语言模型,维度为 (20,100,1000) ,即 N=100 条语句(对应100张图片),时间步 T=20 ,每个词的特征维度为 1000
  2. 第二个输入Blob同语言模型,维度为 (20,100)
  3. 第三个输入Blob为图片CNN特征,维度为 (100,1000) ,即 N=100 张图片,每张图片特征为1000维度。注意图片的特征维度尽量与词的特征维度相同,若不同,Caffe会通过填充或截断的方式进行维度长度匹配。
  4. Caffe中的官方文档说对 x 以及 xstatic 的处理方式,及通过连接每个时间步 xt xstatic 得到新的特征 xt=[xt;xstatic] 。而由上图可知,实现上Caffe不是使用Concat层连接二者而是使用Eltwise求和二者,及 xt=[xt+xstatic]

6.3 图像描述实验

图像描述实验是在语言描述实验的基础上,增加图像的CNN特征作为LSTM的静态输入特征。

文献[1]提出三个组合方式,如下图所示:

1)第一种为一层LSTM,为最朴素的方法。 
2)第二种为两层LSTM,静态输入在第一个LSTM层。 
3)第三种为两层LSTM,静态输入在第二个LSTM层。最后取的是该种方法。

参考文献

[1] Hochreiter, Sepp, and Schmidhuber, Jürgen. “Long short-term memory.” Neural Computation 9, no. 8 (1997): 1735-1780.

[2] Zaremba, Wojciech, and Sutskever, Ilya. “Learning to execute.” arXiv preprint arXiv:1410.4615 (2014).

[3] Donahue, J., et al. “Long-term recurrent convolutional networks for visual recognition and description.” Computer Vision and Pattern Recognition IEEE, 2015.


另外,对于caffe中lstmlayer的理解,可以参考一下:

I have a question about caffe-lstm.
There are members N_ and T_ in class LstmLayer ( I found default value of N_ is 1 ) and their comments are batch size and length of sequence. I am not sure if that means: there are N_ independent sequences and each one of them has T_ frames. For example, If I have 5 videos and each one has 100 frames. I must set N_ = 5 and T_ = 100. Like this, if I have only one video with 100 frames, I must set N_ = 1 and T_ = 100.
But if I have 5 videos with different frames, say, video1 has 100 frames, video2 has 90 frames, videos3 has 96 frames, video4 has 88 frames, video5 has 99 frames, I feel N_ must be set 1 and use 'clip' to solve this training. If N_ is not 1, there is no solution.

Above is my understand about the members in LstmLayer class. Could you tell me if that is right? Thanks!

@junhyukoh
Owner
junhyukoh commented  on 23 Sep 2015

You are understanding the role of N_ and T_ correctly.
There are one general solution and another solution for some cases:

  1. Use N_=1 and clip appropriately as you said.
    This is actually very inefficient because the model cannot process different streams in parallel.

  2. If you are using softmax loss as loss function, you can put 5 videos with different frames into streams (N=5) by fixing T as the maximum length (say T=100) and filling extra input frames with zeros (x_99=0, x_100=0 for 98-length video).
    In order to remove unnecessary losses caused by extra frames, you can specify ignore_label: -1 in theloss_param and provide -1 as labels for the extra time steps.
    This will set loss/gradient to 0 for the extra time steps.

I think Caffe should support a mask indicator for all loss layers so that we can selectively ignore losses for specific examples/time steps.

猜你喜欢

转载自blog.csdn.net/dongapple/article/details/77887465