结果与Weston等人提供的LSTM模型相当:“面向AI-Complete Question answer: A Set of先决条件玩具任务”http://arxiv.org/abs/1502.05698
图书馆(keras)图书馆(readr)图书馆(stringr)图书馆(purrr)图书馆(宠物猫)图书馆(dplyr)
以下对象从'package:stats'被屏蔽:filter, lag
以下对象从'package:base'被屏蔽:intersect, setdiff, setequal, union
#函数定义 -----------------------------------------------------tokenize_words<-函数(x) {x<-x% > %str_replace_all(”([[:punct:]] +)”,'\ \1 ')% > %函数(' ')% > %unlist()x (x! =""]}parse_stories<-函数(线,only_卡塔尔世界杯欧洲预选赛赛程表supporting =假) {行<-行% > %函数(”“,n =2)% > %map_dfr(~宠物猫(nid =as.integer(以下方式[[1]]),行=以下方式[[2]]))行<-行% > %变异(分=地图(线,~函数(以下方式,"\ t") [[1]]),q =map_chr(分裂,~以下方式(1]),一个=map_chr(分裂,~以下方式(2]),卡塔尔世界杯欧洲预选赛赛程表支持=地图(分裂,~以下方式(3.]% > %函数(”“)% > %unlist()% > %as.integer()),story_id =c(0,cumsum[(国家免疫日-nrow(。)>nid [-1))))% > %选择(-分割)故事<-行% > %过滤器(is.na(一))% > %选择(nid_story =story_id nid,故事=问)问题<-行% > %过滤器(!is.na(一))% > %选择(-线)% > %left_join(故事,通过=“story_id”)% > %过滤器(nid_story<nid)如果(only_卡塔尔世界杯欧洲预选赛赛程表supporting) {问题<-问题% > %过滤器(map2_lgl(nid_story,支卡塔尔世界杯欧洲预选赛赛程表持,~以下方式%, %.y))}问题% > %group_by, (story_id国家免疫日问题=问,回答=一)% > %总结(故事=粘贴(故事,崩溃=”“),.groups =“保持”)% > %取消组()% > %变异(问题=地图(问题,~tokenize_words(方式)),故事=地图(故事,~tokenize_words(方式)),id =row_number())% > %选择(id,问题,答案,故事)}vectorize_stories<-函数(data, vocab, story_maxlen, query_maxlen){问题<-地图(数据$问题,函数(x) {map_int(x,~哪一个(以下方式= =词汇)})故事<-地图(数据$的故事,函数(x) {map_int(x,~哪一个(以下方式= =词汇)})# ""表示填充答案<-酸式焦磷酸钠(c(""词汇)函数(x) {as.integer(x= =数据$回答)})列表(问题=pad_sequences(问题,maxlen =query_maxlen),故事=pad_sequences(故事,maxlen =story_maxlen),答案=答案)}#参数 --------------------------------------------------------------max_length<-99999embed_hidden_size<-50batch_size<-32时代<-40#数据准备 --------------------------------------------------------路径<-get_file(帧=" -任务- v1 - 2. - tar.gz”,起源=“https://s3.amazonaws.com/text - datasets/babi_tasks_1 - 20 - _v1 - 2. - tar.gz”)
解压(路径,exdir =str_replace(路径,固定(“gz”),“/”))路径<-str_replace(路径,固定(“gz”),“/”)#默认QA1, 1000个样本# challenge = '%stasks_1-20_v1-2/ zh /qa1_singl卡塔尔世界杯欧洲预选赛赛程表e- supported -fact_%s.txt'# QA1, 10000个样本挑战=' % stasks_1-20_v1-2 / en-10k qa1_sin卡塔尔世界杯欧洲预选赛赛程表gle-supporting-fact_ % s.txt '# QA2, 1000个样品#挑战<- "%stasks_1-20_v1-2/ zh /qa2_two- suppor卡塔尔世界杯欧洲预选赛赛程表ted -facts_%s.txt"# QA2, 10000个样本# challenge = '%stasks_1-20_v1-2/en-10k/qa2_two-卡塔尔世界杯欧洲预选赛赛程表 supported -facts_%s.txt'火车<-read_line(sprintf(挑战,道路,“训练”))% > %parse_stories()% > %过滤器(map_int(故事,~长度(方式)< =max_length)测验<-read_line(sprintf(挑战,道路,“测试”))% > %parse_stories()% > %过滤器(map_int(故事,~长度(方式)< =max_length)#提取词汇all_data<-bind_rows(火车、测试)词汇<-c(unlist(all_data$问题),all_data$的答案,unlist(all_data$故事)% > %独特的()% > %排序()#保留0通过pad_sequences屏蔽vocab_size<-长度(词汇)+1story_maxlen<-map_int(all_data$的故事,~长度(方式)% > %马克斯()query_maxlen<-map_int(all_data$问题,~长度(方式)% > %马克斯()#训练和测试集的向量化版本train_vec<-vectorize_stories(train, vocab, story_maxlen, query_maxlen)test_vec<-vectorize_stories(test, vocab, story_maxlen, query_maxlen)#定义模型 ------------------------------------------------------句子<-layer_input(形状=c(story_maxlen),dtype =“int32”)encoded_sentence<-句子% > %layer_embedding(input_dim =vocab_size,output_dim =embed_hidden_size)% > %layer_dropout(率=0.3)问题<-layer_input(形状=c(query_maxlen),dtype =“int32”)encoded_question<-问题% > %layer_embedding(input_dim =vocab_size,output_dim =embed_hidden_size)% > %layer_dropout(率=0.3)% > %layer_lstm(单位=embed_hidden_size)% > %layer_repeat_vector(n =story_maxlen)合并后的<-列表(encoded_sentence encoded_question)% > %layer_add()% > %layer_lstm(单位=embed_hidden_size)% > %layer_dropout(率=0.3)仅仅<-合并后的% > %layer_dense(单位=vocab_size,激活=“softmax”)模型<-keras_model(输入=列表(句子,问题),输出=仅仅)模型% > %编译(优化器=“亚当”,损失=“categorical_crossentropy”,指标=“准确性”)模型
模型:”模型 " ____________________________________________________________________________ 层(类型)形状参数#连接到输出 ============================================================================ input_2 (InputLayer)[(没有,4)]0 []embedding_1(嵌入)(没有4 50)1100(“input_2[0][0]”)input_1 (InputLayer)[(没有,68)]0 []dropout_1(辍学)(没有,4、50)0(“embedding_1[0][0]”)嵌入(嵌入)(没有,68年,50)1100(“input_1[0][0]”)lstm (lstm)(没有,50) 20200 [' dropout_1[0][0]”)辍学(辍学)(没有,68年,50)0(“嵌入[0][0]”)repeat_vector (RepeatVe(没有,68年,50)0(“lstm[0][0]”)男星)添加(添加)(没有,68年,50)0(“辍学[0][0]”、“repeat_vector[0][0]”)lstm_1 (lstm)(没有,50)20200(“添加[0][0]”)dropout_2(辍学)(没有,50)0(“lstm_1[0][0]”)密度(密度)(没有,22)1122 [' dropout_2 [0] [0 ]'] ============================================================================ 总参数:43722可训练的参数:43722 Non-trainable params: 0 ____________________________________________________________________________
#培训 ----------------------------------------------------------------模型% > %适合(x =列表(train_vec$故事,train_vec$问题),y =train_vec$答案,batch_size =batch_size,时代=时代,validation_split =0.05)评价<-模型% > %评估(x =列表(test_vec$故事,test_vec$问题),y =test_vec$答案,batch_size =batch_size)评价
损失精度0.03284298 0.99100000