BC.Wang Welcome

AI学习笔记4-RNN

2017-07-10
BCWang

阅读:


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层)

layer shape
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 模型结构

layer shape
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))
layer shape
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
  3. 创建下一刻的数据作为y,y的影片时间为输入的时间t+1,相当于y总是快于输入一秒,这样训练能够预测,y不加入噪点
  4. 用上述模型,以完整影片作为输入,影片时间+1的y作为求取loss的输出,进行训练

预测和可视化

  1. 训练完成之后,首先用which变量选择一个sample,之后会取7帧作为输入,进行fit,得到预测之后的几帧,变量为track
  2. 截取和预测片段相同的真实片段track2,将track和track2的每一帧作图在一起,输出图像进行对比

imdb_lstm.py

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

layer shape
input (None, 80)
embedding (None, None, 128)
LSTM (None, 128)
dense (None, 1)

imdb_cnn_lstm.py

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

layer | shape :–: | :–: 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网络 模型

layer shape
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))。 模型

layer shape
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的机理之后可以不用造轮子直接使用

Similar Posts

Comments

0