这个例子展示了如何训练深度学习LSTM网络生成文本使用字符嵌入。
训练文本生成的深层学习网络,训练sequence-to-sequence LSTM网络来预测下一个字符的字符序列。训练网络来预测下一个字符,指定要输入序列移位的响应时间步。
使用字符映射进行,每个训练观察转换为一个整数序列,其中整数索引词汇表的字符。包括一个词在网络学习中嵌入层嵌入的字符和整数映射到向量。
读的HTML代码《傲慢与偏见》的古登堡计划的电子书,简·奥斯汀和解析使用webread
和htmlTree
。
url =“https://www.gutenberg.org/files/1342/1342-h/1342-h.htm”;代码= webread (url);树= htmlTree(代码);
提取的段落找到p
元素。指定忽略段落元素类“目录”
使用CSS选择器”:不(.toc)”
。
段落= findElement(树,“p: not (.toc)”);
从段落中提取文本数据使用extractHTMLText
。和删除空字符串。
textData = extractHTMLText(段落);textData (textData = =”“)= [];
删除字符串短于20个字符。
idx = strlength (textData) < 20;textData (idx) = [];
想象一个词的文本数据云。
图wordcloud (textData);标题(《傲慢与偏见》)
将文本数据转换为字符序列指数的预测和分类序列响应。
分类函数将换行符和空格条目视为未定义。为这些角色创建分类元素,用特殊字符”¶
”(pilcrow,“\ x00B6”
)和“·”(中间点,“\ x00B7”
分别)。为了防止歧义,您必须选择特殊字符不出现在文本中。这些字符没有出现在训练数据可以用于这一目的。
newlineCharacter =组成(“\ x00B6”);whitespaceCharacter =组成(“\ x00B7”);textData =取代(textData,[换行符”“]、[newlineCharacter whitespaceCharacter]);
遍历文本数据和创建一个字符序列指数代表每个人物的观察和分类字符序列的反应。表示每个观察,包括特殊字符“␃”(文本,“\ x2403”
)。
endOfTextCharacter =组成(“\ x2403”);numDocuments =元素个数(textData);为=我= 1:numDocuments字符textData {};X =双(字符);%建立向量分类反应与最终的文本字符。charactersShifted = [cellstr(字符(2:结束)')' endOfTextCharacter);Y =分类(charactersShifted);XTrain{我}= X;YTrain{我}= Y;结束
在培训期间,默认情况下,软件将训练数据分为mini-batches和垫序列,它们有相同的长度。过多的填充会对网络性能有负面影响。
防止训练过程添加太多的填充,可以通过序列长度,对训练数据进行排序和选择mini-batch大小这样在mini-batch序列有一个类似的长度。
每个观测得到的序列长度。
numObservations =元素个数(XTrain);为i = 1: numObservations = XTrain序列{};sequenceLengths (i) =(序列,2)大小;结束
对数据排序的序列长度。
[~,idx] = (sequenceLengths)进行排序;XTrain = XTrain (idx);YTrain = YTrain (idx);
定义LSTM架构。指定一个sequence-to-sequence LSTM分类与400年网络隐藏单位。设置输入大小训练数据的特征维度。序列的特征指标,功能维度是1。指定一个字嵌入层与维200和指定的字数(对应字符)最高的字符输入数据的价值。设置输出大小完全连接层的类别的数量的反应。防止过度拟合,包括辍学层LSTM后层。
这个词嵌入层学习一个嵌入的字符和每个字符映射到一个200维向量。
inputSize =大小(XTrain {1}, 1);numClasses =元素个数(类别([YTrain {:})));(textData numCharacters = max ({}):);层= [sequenceInputLayer (inputSize) wordEmbeddingLayer(200年,numCharacters) lstmLayer(400年“OutputMode”,“序列”)dropoutLayer (0.2);fullyConnectedLayer (numClasses) softmaxLayer classificationLayer];
指定培训选项。指定培训mini-batch大小32和0.01最初的学习速度。防止爆炸的梯度,梯度阈值设置为1。确保数据仍然是排序,集“洗牌”
来“永远”
。监控培训进展,设置“阴谋”
选项“训练进步”
。抑制详细输出,集“详细”
来假
。
选择= trainingOptions (“亚当”,…“MiniBatchSize”32岁的…“InitialLearnRate”,0.01,…“GradientThreshold”,1…“洗牌”,“永远”,…“阴谋”,“训练进步”,…“详细”、假);
培训网络。
网= trainNetwork (XTrain、YTrain层,选择);
生成文本的第一个字符由一个概率分布采样一个角色根据训练数据中的文本的第一个字符。产生剩余的字符使用训练LSTM网络来预测下一个序列使用当前序列生成的文本。保持生成一个一个字符,直到网络预测“文本的终结”的性格。
第一个字符样本的分布训练数据中的第一个字符。
initialCharacters = extractBefore (textData 2);firstCharacter = datasample (initialCharacters, 1);generatedText = firstCharacter;
第一个字符转换为一个数字索引。
X =双(char (firstCharacter));
剩余的预测,根据预测样本下一个字符的网络。预测分数代表下一个字符的概率分布。样品的字符词汇的字符类网络的输出层的名称。把词汇的分类层网络。
词汇=字符串(net.Layers(结束).ClassNames);
预测使用的字符predictAndUpdateState
。对于每一个预测,输入之前的字符的索引。结束时停止预测网络预测文本字符或生成的文本是500个字符长。对于大型数据集合,长序列,或大型网络,预测在GPU上通常比预期更快的计算CPU。否则,预测在CPU上通常是更快的计算。一步预测单次使用CPU。预测使用的CPU,设置“ExecutionEnvironment”
选择predictAndUpdateState
来“cpu”
。
最大长度= 500;而strlength (generatedText) <最大长度%预测下一个字符的分数。[净,characterScores] = predictAndUpdateState(净,X,“ExecutionEnvironment”,“cpu”);%样本下一个字符。newCharacter = datasample(词汇,1,“重量”,characterScores);%停止预测最后的文本。如果newCharacter = = endOfTextCharacter打破结束%字符添加到生成的文本。generatedText = generatedText + newCharacter;%字符的数字指标。X =双(char (newCharacter));结束
重构生成的文本替换特殊字符相应的空格和换行字符。
generatedText =取代(generatedText [newlineCharacter whitespaceCharacter],[换行符”“])
generatedText = " "我希望达西先生,后者我真诚地固定在relanth方面。我们加入的消息。他们结婚了韦翰先生和他的方式,可能这两个od自从知道他现在该做的事情,和机会方面,和当我读;气味和丽萃,谁的想法;找时间,我从来没有去利用情况;强迫自己。他们pility明快相信她治疗的情况,因为我是exceal”
生成多条文本,两代人之间使用重置网络状态resetState
。
网= resetState(净);
wordEmbeddingLayer
|doc2sequence
|tokenizedDocument
|lstmLayer
(深度学习工具箱)|trainNetwork
(深度学习工具箱)|trainingOptions
(深度学习工具箱)|sequenceInputLayer
(深度学习工具箱)|wordcloud
|extractHTMLText
|findElement
|htmlTree