Hello,大家好,这里是从不拖更的糖葫芦喵喵~!
ようこそ実力至上主义のCS231n教室へ
天気がいいから、いっしょに散歩しましょう。(划掉烦人的听力!)
考N1什么的才不会耽误更新!大家一定要保佑喵喵一次通过啊~
那么,最后一篇CS231n 2017 Spring Assignment3 就要开始了~!
喵喵的代码实现:Observerspy/CS231n,欢迎watch和star!
视频讲解CS231n Assignment3:
Assignment 3-AI慕课学院www.mooc.ai![02c96c97ff04bf1f0bf29d3297549bbc.png](https://img-blog.csdnimg.cn/img_convert/02c96c97ff04bf1f0bf29d3297549bbc.png)
Part 1 Image Captioning with Vanilla RNNs
下面让我们来和普通RNN一起玩耍,并完成一个简单的看图说话(图像语义分析)的任务吧!
1.1 Vanilla RNN
![40acd8d8b54f0952eaaea30afcd05441.png](https://img-blog.csdnimg.cn/img_convert/40acd8d8b54f0952eaaea30afcd05441.png)
1.1.1 RNN单元
首先我们来看对于一个RNN单元:
前向:
向右的箭头:也就是
向上的箭头:输出层,是一个softmax:
反向:
反向我们需要计算dWx,dWh,db,dx和dh,不管计算哪一个,都要先把
剩下的就是一个线性的式子,分别对我们要的5个参数求导:
db = sum(dtheta)
dWx = dtheta dot x (是矩阵乘哦,然后还有注意形状!这里喵喵给出的不是实际式子,应该谁和谁相乘请按照形状自己想一想~)
dWh = dtheta dot h
dx = dtheta dot Wx
dh = dtheta dot Wh
1.1.2 完整RNN
每个单元都是一样的,那么,对于完整的RNN:
前向:
也就是要对RNN单元循环T次,T是序列的长度。
返回来看RNN单元前向公式,每次输入5个参数,输出一个
反向:
RNN反向和之前我们计算的反向都不太一样,因为之前我们计算反向时上游传回来的值只有dout一个。在RNN示例图中,反向时所有箭头都要翻转,也就是说,不仅有从右边来的dprev_h,还有从上面来的dh。
既然有两个那么加起来就好了。
首先我们逆序循环:
for t in range(T-1, -1, -1):
对于每一个时间片t,上面来的导数是dh[:, t, :](形状是(N, T, H)),右边来的暂时记作dprev_h。对于最后一个单元,它的右边没有传来导数,所以初始化dprev_h是0。
于是对于每一个RNN单元,需要传进去的导数就是dh[:, t, :]+dprev_h。显然dprev_h是需要更新的。
注意到我们在实现RNN单元的反向传播时还需要有一个参数cache,所以还需要构造cache,这时候需要注意其中有些元素的下标。
参数计算完毕,利用刚才实现的反向传播就可以计算出5个导数了。
但是还没有完!
对于dx,我们可以计算它每一个时刻的导数,那么剩下dWx,dWh,db和dh呢?注意到
其实RNN中,这四个参数在不同时刻是共享的,因此需要在每一个时刻把它们都加起来做更新。
RNN我们做完啦!下面让我们来看看这个看图说话(图像语义分析)任务是什么样!
1.2 Image Captioning
简单说就是看图说话,给你一幅图,给出关于这幅图的说明文字。网络结构如下图所示:
![7dd22f312178a57ff40e6135f08ab875.png](https://img-blog.csdnimg.cn/img_convert/7dd22f312178a57ff40e6135f08ab875.png)
1. 隐藏层
输入一幅图片,从训练好的vgg16的fc7层中取出特征,当做h0输入到RNN中。这样剩下的任务就是训练网络,使之能够输出图片说明句子(单词序列)。然后h还要经过一次线性变换。
如何表示单词呢?做过自然语言处理想必一定知道必不可少的操作就是Wor