keras上的RNN代码理解 来自我的个人网站: http://wangbch.com
用记忆神经网络训练bAbI数据集 - bAbI数据集下载到一半时如果取消,会得到不完整的文件而报错,此时应当在代码中打印出下载地址,如path = get_file(...) print(path),然后删除这个文件,不过一般在home目录下,windows在用户目录下 - 在分析代码时,先直接看模型summary以及喂入的数据集,之后返回看数据集是怎样得到的。 1. 函数tokenize(sent):输入一个句子,将句子的每一个词和符号作为元素存储在list中 2. parse_stories(lines, only_supporting):only_supporting为True时,只有支持答案的句子才会出现。这个函数基于tokenize,针对bAbI的数据集,输入行,得到单词的list 3. get_stories():基于parse_stories,输入文件名,解析出句子中词语的list,比如某个输出:[(['Mary', 'moved', 'to', 'the', 'bathroom', '.', 'John', 'went', 'to', 'the', 'hallway', '.'], ['Where', 'is', 'Mary', '?'], 'bathroom'), 每个set是一个完整的问题,含有两个list和一个string,前一个list是描述,后一个是问题,最后一个string是答案 4.vectorize_stories()`直接转换为词向量,一个单词具有独一无二的序号 5. 描述的最大长度为68个单词,问题的最大长度为4个单词,用来训练的数据为10000组,用来测试的数据为1000组 6. 所采用的问题集都是关于空间位置逻辑的,比如“a在b处,b在c处,问d在哪?”因而,描述的shape为(None, 68),多为[0,0,0,…,18,n,1],因为问题结尾多为”the … .”。问题的shape为(None, 4),几乎都为[7,13,n,2],对应于”where is … ?”,而答案的shape为(None, 22),是22维的独热编码(整个数据集的词汇量为22个,多为“bedroom, hallway, bathroom”等空间位置词汇,以及人名)
模型结构 模型结构包含并联层,在layer前用n-m-l注明,n为层的深度,m,l等等为同一个串联层的标志,在这里m=1代表描述的输入,m=2代表问题的输入。layer后面的括号中代表了对哪个层进行了运算(省略了dropout和activation层)
layershape1-1, story_input(None, 68)1-2, question_input(None, 4)2-1-1, story_encoder_m, embedding(1-1)(None, 68, 64)2-1-2, story_encoder_c, embedding(1-1)(None, 68, 4)2-2, question_encoder, embedding(1-2)(None, 4, 64)3, dot(2-1-1, 2-2)(None, 68, 4)4, add(3, 2-1-2)(None, 68, 4)5, permute(4)(None, 4, 68)6, concatenate(5, 2-2)(None, 4, 132)7, LSTM(6)(None, 32)8, dense(7)(None, 22)之后输出的(None, 22)和结果和真实答案(None, 22)进行损失计算。
数据处理与上一例类似,只不过改变了数据集,描述的最大长度为552,问题最大长度为5,答案的维度(总也就是词汇量)为36 模型结构
layershape1-1, story_input(None, 552)1-2, question_input(None, 5)2-1, story_encoded, embedding(1-1)(None, 552, 50)2-2, question_encoded, embedding(1-2)(None, 5, 50)3-2, recurrent.LSTM(2-2)(None, 50)4-2, repeat_vector(3-2)(None, 552, 50)5, add(2-1, 3-2)(None, 552, 50)6, recurrent.LSTM(5)(None, 50)7, dense(6)(None, 36)1. 创建一个指定大小、帧率和batch_size的影片作为输入。在影片中添加3~7个正方形,设定正方形的运动起始点和运动方向 2. 创建输入数据,即创建正方形的移动影片,并在视频加上噪点,是为了防止数据为0,增强模型robust 2. 创建下一刻的数据作为y,y的影片时间为输入的时间t+1,相当于y总是快于输入一秒,这样训练能够预测,y不加入噪点 3. 用上述模型,以完整影片作为输入,影片时间+1的y作为求取loss的输出,进行训练
预测和可视化 1. 训练完成之后,首先用which变量选择一个sample,之后会取7帧作为输入,进行fit,得到预测之后的几帧,变量为track 2. 截取和预测片段相同的真实片段track2,将track和track2的每一帧作图在一起,输出图像进行对比
利用LSTM处理IMDB数据集,IMDB是一个网络电影数据集,输入是已经转化为词向量的数据,输出为正面或负面评价,是二分类问题。 模型
layershapeinput(None, 80)embedding(None, None, 128)LSTM(None, 128)dense(None, 1)在IMDB中使用conv1D的卷积。LSTM可以处理序列化的数据,而一维卷积则是类似于2维卷积,处理序列上相关的数据。 模型
layershapeinput(None, 100)embedding(None, 100, 128)dropout(None, 100, 128)conv1d(None, 96, 64)pooling(None, 24, 64)LSTM(None, 70)dense(None, 1)activation(None, 1)双向LSTM网络 模型
layershapeinput(None, 100)embedding(None, 100, 128)bidirectional(None, 128)dropout(None, 128)dense(None, 1)多层反馈神经网络,这个例子中是采用的keras函数式建模(不同于 Model.add(),采用layer(parameters)(last_layer))。 模型
layershapeinput-x(None, 28-row, 28-col, 1)LSTM(row)(None, 128)timeDirtributed(x)(None, 28, 128)LSTM(col)(None, 128)dense(None, 10)将(28, 1)的行向量用LSTM编码成(128)的行向量,之后将(28, 128)的图形用LSTM编码成(128)的图像向量,最后全连接获得标签。