在120次epoch后,任务' single_supporting_fact_卡塔尔世界杯欧洲预选赛赛程表10k '的准确率达到98.6%。每个epoch的时间:在CPU (core i7)上为3秒。
图书馆(keras)图书馆(readr)图书馆(stringr)图书馆(purrr)图书馆(宠物猫)图书馆(dplyr)
以下对象从'package:stats'屏蔽:filter, lag
以下对象是从'package:base'屏蔽的:intersect, setdiff, seteal, 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国家免疫日问题=问,回答=一)% > %总结(故事=粘贴(故事,崩溃=”“))% > %取消组()% > %变异(问题=地图(问题,~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),答案=答案)}#参数 --------------------------------------------------------------挑战<-列表(# QA1, 10000个样本single_卡塔尔世界杯欧洲预选赛赛程表supporting_fact_10k =“% stasks_1-20_v1-2 / en-10k qa1_sing卡塔尔世界杯欧洲预选赛赛程表le-supporting-fact_ % s.txt”,# QA2, 10000个样本two_卡塔尔世界杯欧洲预选赛赛程表supporting_facts_10k =“% stasks_1-20_v1-2 / en-10k qa2_t卡塔尔世界杯欧洲预选赛赛程表wo-supporting-facts_ % s.txt”)challenge_type<-“single_卡塔尔世界杯欧洲预选赛赛程表supporting_fact_10k”挑战<-挑战[[challenge_type]]max_length<-999999#数据准备 --------------------------------------------------------#下载数据路径<-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”),“/”)读取训练和测试数据火车<-read_line(sprintf(挑战,道路,“训练”))% > %parse_stories()% > %过滤器(map_int(故事,~长度(方式)< =max_length)
' summarise() '按'story_id', 'nid', 'question'对输出进行分组。您可以使用'。组的参数。
测试<-read_line(sprintf(挑战,道路,“测试”))% > %parse_stories()% > %过滤器(map_int(故事,~长度(方式)< =max_length)
' summarise() '按'story_id', 'nid', 'question'对输出进行分组。您可以使用'。组的参数。
#提取词汇表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))问题<-layer_input(形状=c(query_maxlen))#编码器#将输入序列嵌入到向量序列中sequence_encoder_m<-keras_model_sequential()sequence_encoder_m% > %layer_embedding(input_dim =vocab_size,output_dim =64)% > %layer_dropout(率=0.3)# output: (samples, story_maxlen, embedding_dim)#将输入嵌入到大小为query_maxlen的向量序列中sequence_encoder_c<-keras_model_sequential()sequence_encoder_c% > %layer_embedding(input_dim =vocab_size,output_dim =query_maxlen)% > %layer_dropout(率=0.3)# output: (samples, story_maxlen, query_maxlen)#将问题嵌入到向量序列中question_encoder<-keras_model_sequential()question_encoder% > %layer_embedding(input_dim =vocab_size,output_dim =64,input_length =query_maxlen)% > %layer_dropout(率=0.3)# output: (samples, query_maxlen, embedding_dim)#编码输入序列和问题(这是索引)#到密集向量序列sequence_encoded_m<-sequence_encoder_m(序列)sequence_encoded_c<-sequence_encoder_c(序列)question_encoded<-question_encoder(提问)计算第一个输入向量序列之间的“匹配”#和问题向量序列# shape: ' (samples, story_maxlen, query_maxlen) '点<-layer_dot(轴=c(2,2))匹配<-列表(sequence_encoded_m question_encoded)% > %点()% > %layer_activation(“softmax”)添加匹配矩阵与第二个输入向量序列响应<-列表(sequence_encoded_c匹配)% > %layer_add()% > %layer_permute(c(2,1))#将匹配矩阵与问题向量序列连接起来回答<-列表(question_encoded响应)% > %layer_concatenate()% > %原论文使用矩阵乘法来进行这一约简步骤。#我们选择使用RNN代替。layer_lstm(32)% > %一个正则化层——可能需要更多。layer_dropout(率=0.3)% > %layer_dense(vocab_size)% > %我们输出词汇表的概率分布layer_activation(“softmax”)#构建最终模型模型<-keras_model(输入=列表(顺序,问题),答案)模型% > %编译(优化器=“rmsprop”,损失=“categorical_crossentropy”,指标=“准确性”)#培训 ----------------------------------------------------------------模型% > %适合(x =列表(train_vec美元故事,train_vec美元问题),y =train_vec美元答案,batch_size =32,时代=120,validation_data =列表(列表(test_vec美元故事,test_vec美元问题),test_vec美元答案))