keras上的RNN代码理解

keras上的RNN代码理解
来自我的个人网站: http://wangbch.com

babi_memnn.py

用记忆神经网络训练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层)

layershape
1-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)进行损失计算。

babi_rnn.py

数据处理与上一例类似,只不过改变了数据集,描述的最大长度为552,问题最大长度为5,答案的维度(总也就是词汇量)为36
模型结构

layershape
1-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)

conv_lstm.py

  • 这个例子首先认为创造一个移动的矩形,形成一段影片,之后根据这个影片预测出矩形之后的移动,涉及到图像处理和时间序列,因而需要ConvLSTM
  • 需要较高显存才可执行,可将n_samples调低一些,同时调整which
  • 模型结构(输入为(batch_size, n_frames[帧数], width, height, channels))
layershape
input(None, None, 40, 40, 1)
conv2d_LSTM(None, None, 40, 40, 40)
batch_normalization-
conv2d_LSTM(None, None, 40, 40, 40)
batch_normalization-
conv2d_LSTM(None, None, 40, 40, 40)
batch_normalization-
conv2d_LSTM(None, None, 40, 40, 40)
batch_normalization-
conv3d(None, None, 40, 40, 1)

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的每一帧作图在一起,输出图像进行对比

imdb_lstm.py

利用LSTM处理IMDB数据集,IMDB是一个网络电影数据集,输入是已经转化为词向量的数据,输出为正面或负面评价,是二分类问题。
模型

layershape
input(None, 80)
embedding(None, None, 128)
LSTM(None, 128)
dense(None, 1)

imdb_cnn_lstm.py

在IMDB中使用conv1D的卷积。LSTM可以处理序列化的数据,而一维卷积则是类似于2维卷积,处理序列上相关的数据。
模型

layershape
input(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)

imdb_bidirecational_lstm.py

双向LSTM网络
模型

layershape
input(None, 100)
embedding(None, 100, 128)
bidirectional(None, 128)
dropout(None, 128)
dense(None, 1)

mnist_hierarchical_rnn.py

多层反馈神经网络,这个例子中是采用的keras函数式建模(不同于
Model.add(),采用layer(parameters)(last_layer))。
模型

layershape
input-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)的图像向量,最后全连接获得标签。

体会

  • embedding层是专用于语言处理的层,能够降低维度,在词向量数据集IMDB中经常使用,而在图形处理采用convLSTM时,没有用到这个层。这个层的具体作用可见keras手册
  • LSTM层在keras中的使用类似于dense层,convLSTM也可直接当做conv使用,在了解了LSTM的机理之后可以不用造轮子直接使用
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值