在bAbI数据集上训练一个记忆网络

nlp
在bAbI数据集上训练用于阅读理解的记忆网络。

在bAbI数据集上训练一个记忆网络。

引用:

在120次epoch后,任务' single_supporting_fact_卡塔尔世界杯欧洲预选赛赛程表10k '的准确率达到98.6%。每个epoch的时间:在CPU (core i7)上为3秒。

图书馆(keras)图书馆(readr)图书馆(stringr)图书馆(purrr)图书馆(宠物猫)图书馆(dplyr)
附加包:'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 =c0cumsum[(国家免疫日-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”
加载Tensorflow 2.9.1版本
解压(路径,exdir =str_replace(路径,固定“gz”),“/”))路径<-str_replace(路径,固定“gz”),“/”读取训练和测试数据火车<-read_linesprintf(挑战,道路,“训练”))% > %parse_stories()% > %过滤器map_int(故事,长度(方式)< =max_length)
' summarise() '按'story_id', 'nid', 'question'对输出进行分组。您可以使用'。组的参数。
测试<-read_linesprintf(挑战,道路,“测试”))% > %parse_stories()% > %过滤器map_int(故事,长度(方式)< =max_length)
' summarise() '按'story_id', 'nid', 'question'对输出进行分组。您可以使用'。组的参数。
#提取词汇表all_data<-bind_rows(火车、测试)词汇<-cunlist(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_embeddinginput_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_embeddinginput_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_embeddinginput_dim =vocab_size,output_dim =64input_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轴=c22))匹配<-列表(sequence_encoded_m question_encoded)% > %()% > %layer_activation“softmax”添加匹配矩阵与第二个输入向量序列响应<-列表(sequence_encoded_c匹配)% > %layer_add()% > %layer_permutec21))#将匹配矩阵与问题向量序列连接起来回答<-列表(question_encoded响应)% > %layer_concatenate()% > %原论文使用矩阵乘法来进行这一约简步骤。#我们选择使用RNN代替。layer_lstm32% > %一个正则化层——可能需要更多。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时代=120validation_data =列表列表(test_vec美元故事,test_vec美元问题),test_vec美元答案)