show and tell是直接调用的LSTM
https://www.cnblogs.com/wangduo/p/6773601.html?utm_source=itdadao&utm_medium=referral
1.LSTM网络
LSTM网络包括的结构为:
输入:、
输出:
其他:由四个主要的门组成
第一步:
- 决定从细胞状态中丢弃什么信息,这个过程由忘记门完成。输出为0-1之间的数值,1表示“完全保留”,0表示“完全舍弃”
第二步:
- 确定什么样的新信息被存放在细胞状态中。sigmoid层称“输入门层”决定什么值将要更新。tanh层创建一个新的候选值向量,会被加入到状态中。
- 、
第三步:
- 更新旧细胞状态,将更新为
第四步:
- 确定要输出的值
- 、
2.show and tell
我理解的这篇文章算是encoder decoder中,运用CNN编码,RNN解码的鼻祖,github上有代码,neraultalk2和im2txt。
我研究的是im2txt代码。
在论文中,编码部分是将图片输入到CNN(比如InceptionV3)的卷积层最后一层,得到image_embedding的数据,将输入和voab对比,生成seq_embedding数据。
在训练阶段,将image_embedding当作初始状态输入进lstm中,之后依次输入seq_embedding,通过dynamic_rnn训练,最后得到output。其中loss是由总的loss和batch的loss求和得到的。
在inference也就是测试阶段,直接将数据输入到lstm中,得到output。
本文用的是原始的lstm框架,所以额外需要理解的就是输入输出空间大小问题了。
3.show attend and tell
本文相比于上篇,主要有以下不一样的地方:
- 编码器不是CNN的最后一层,而是更前面的层,因为需要空间特征,比如vgg19的conv5_3
- 增加了两个attention特征。一个是根据输入的图像feature特征和隐层数据推导出来的,将比例与原图像feature特征相乘,得到新的输入特征;另一个是加了一个随机beta特征
- loss的计算方式,加上了上面一项求和为1的项
- 并且多加了几个感知机的层
分析几个变量和结构:
1.初始化
主要有c和h的初始变量,初始化方法为
2.attention 层
将图像feature和h与隐层w的积相加,得到一个h,和另一个隐层w相乘,得到,通过softmax得到,和feature求积累加得到context
3.beta层(第二个attention层)
beta只有一个感知机层,得到的beta与context相乘
最终得到模型
参考:
https://blog.csdn.net/shenxiaolu1984/article/details/51493673