骄傲和偏见和matlab

此示例显示如何培训深度学习LSTM网络以使用字符嵌入式生成文本。

要为文本生成培训深度学习网络,请列车序列到序列的LSTM网络,以预测一系列字符中的下一个字符。要培训网络来预测下一个字符,请指定要在一次执行的输入序列的响应。

要使用字符嵌入式,将每个培训观察转换为一系列整数,其中整数索引到字符的词汇表中。在网络中包含一个单词嵌入层,它学会嵌入角色并将整数映射到向量。

负载培训数据

阅读html代码Putenberg项目的骄傲和偏见,由简奥斯汀并使用它使用韦布雷德htmltree.

URL =.“https://www.gutenberg.org/files/1342/1342-h/1342-h.htm”;代码= Webrabread(URL);树= htmltree(代码);

通过找到该段落提取段落P.元素。指定要使用类忽略段落元素“toc”使用CSS选择器':不是(.toc)'

段落= findelement(树,'P:不是(.toc)');

从段落中提取文本数据extracthtmltext.。并删除空字符串。

textdata = extracthtmltext(段落);TextData(TextData ==)= [];

删除短于20个字符的字符串。

idx = strlength(textdata)<20;textdata(idx)= [];

可视化单词云中的文本数据。

图WordCloud(TextData);标题(“傲慢与偏见”

将文本数据转换为序列

将文本数据转换为响应的预测器和分类序列的字符指数序列。

分类函数将换行符和空白条目视为未定义的。要为这些字符创建分类元素,请用特殊字符替换它们““(普希克,“\ x00b6”)和“·”(中间点,“\ x00b7”) 分别。为防止歧义,必须选择文本中未出现的特殊字符。这些字符不会出现在培训数据中,因此可以用于此目的。

newlineCharacter = compose(“\ x00b6”);WhitespaceCharacter = Compose(“\ x00b7”);textdata = replace(textdata,[newline],[NewLineCharacter白孔术]);

循环在文本数据上,并创建一个字符序列,表示每个观察的字符和响应的字符的分类序列。要表示每个观察的末尾,包括特殊字符“␃”(文本的结尾,“\ x2403”)。

EndoftextCharacter = Compose(“\ x2403”);numdocuments = numel(textdata);为了i = 1:numfocuments字符= textdata {i};x = double(字符);%创建与文本字符结尾的分类响应的向量。字符次= [CellStr(字符(2:结束)')'EndoftextCharacter];y =分类(Charactersshifted);xtrain {i} = x;ytrain {i} = y;结尾

在培训期间,默认情况下,软件将培训数据分割为迷你批次,并填充序列,使它们具有相同的长度。填充太多可能对网络性能产生负面影响。

为防止培训过程添加太多填充,您可以按顺序对培训数据进行排序,并选择迷你批次尺寸,以便在迷你批处理中的序列具有相似的长度。

获取每个观察的序列长度。

numobservations = numel(xtrain);为了i = 1:numobservations sequence = xtrain {i};Sequencelengths(i)=大小(序列,2);结尾

按顺序长度对数据进行排序。

[〜,IDX] =排序(Sequencelength);XTrain = XTrain(IDX);YTrain = Ytrain(IDX);

创建和训练LSTM网络

定义LSTM架构。指定具有400个隐藏单元的序列到序列LSTM分类网络。将输入大小设置为培训数据的特征维度。对于字符索引的序列,特征维度为1.指定具有维度200的单词嵌入层,并指定输入数据中的最高字符值的单词(对应于字符)的单词(对应)。将完全连接图层的输出大小设置为响应中的类别数。为了帮助预装,在LSTM层之后包括丢弃层。

单词嵌入层学会嵌入字符并将每个字符映射到200维向量。

InputSize = Size(XTrain {1},1);numclasses = numel(类别([ytrain {:}]));numcharacters = max([textdata {:}]);图层= [sequenceInputlayer(inputsize)wordembeddinglayer(200,numcharacters)lstmlayer(400,'OutputMode''顺序')DropoutLayer(0.2);全连接列(numcrasses)softmaxlayer分类层];

指定培训选项。使用迷你批量大小为32和初始学习速率的培训0.01。为防止渐变爆炸,将渐变阈值设置为1.以确保数据保持排序,设置'洗牌''绝不'。要监控培训进度,请设置'plots'选择'培训 - 进步'。要抑制详细输出,请设置'verbose'错误的

选项=培训选项('亚当'......'minibatchsize',32,......'italllearnrate',0.01,......'gradientthreshold',1,......'洗牌''绝不'......'plots''培训 - 进步'......'verbose',错误的);

训练网络。

net = trainnetwork(xtrain,ytrain,图层,选项);

生成新文本

通过根据训练数据中的文本的第一个字符从概率分布采样字符来生成文本的第一个字符。通过使用训练的LSTM网络生成剩余的字符,以使用所生成的当前文本的当前序列来预测下一个序列。一逐一点一直将字符保持一,直到网络预测“文本结束”字符。

根据培训数据中的第一个字符的分布来示例第一个字符。

InitialCharacters = ExtractBefore(TextData,2);firstcharacter = dataSample(initialcharacters,1);生成ext = first特征;

将第一个字符转换为数字索引。

x = double(char(intrcharacter));

对于剩下的预测,根据网络的预测分数来示例下一个字符。预测得分表示下一个字符的概率分布。使用网络输出层的类名给出的字符词汇表中的字符。从网络的分类层获取词汇。

词汇= string(net.layers(结束).classnames);

用字符使用预测性格predictandanddatestate.。对于每次预测,输入先前字符的索引。停止预测网络当网络预测到文本字符的末尾或生成的文本长度为500个字符时。对于大量数据,长序列或大型网络,GPU的预测通常比CPU上的预测更快地计算成计算。否则,对CPU的预测通常更快以计算。有关单时间步骤预测,请使用CPU。要使用CPU进行预测,请设置'executionenvironment'选择predictandanddatestate.'中央处理器'

maxlength = 500;尽管strlength(生成文本)%预测下一个字符分数。[net,charactercores] = predictandanddattestate(net,x,'executionenvironment''中央处理器');%样本下一个字符。newcharacter = datasample(词汇,1,'重量',字符);%停止在文本结束时预测。如果newcharacter == EXTOFTEXTRACTR.休息结尾%将字符添加到生成的文本。生成ext =生成的文本+ newcharacter;%获取角色的数字索引。x = double(char(newcharacter));结尾

通过用相应的空格和新行字符替换特殊字符来重建生成的文本。

生成的文本= replace(生成的文本,[newlineCharacter whitespaceCharacter],[换行符])
生成的文字=“”我希望达西先生,在后者我真诚地修复了关于相关的人。我们要加入洛杉矶。他们与威克姆爵士的方式结婚,因为这两个oc以来,这两个oc以来,他们就是爵士的方式与他来说以来的可能性他现在有一个人,以及当我读时的机会条款,当我读书时;谁也没有兴奋地想到气味;为了看看时代,我从未走过案子的优势;他们已经挑剔了自己。他们愚蠢并激烈地相信她是在局面上纠正,因为我是不是要说“

要生成多条文本,请使用几代内部重置网络状态重置静止

net = ResetState(网络);

也可以看看

|||||||(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)

相关话题