人工智能

应用机器学习和深入学习

深酒设计师

这篇文章从Ieuan埃文斯是另一个,他给我们带来了深啤酒设计师,今天谈论葡萄酒!比平常更长的职位,但充满了有用的信息为文本深度学习。如果你正在寻找一个独特的文本的例子,这是给你的!

我最新博文后如何用MATLAB来选择完美的啤酒,我决定探索与深度学习我能做什么和葡萄酒。
类似于啤酒,葡萄酒是压倒性的许多不同的选择。我可以选择一个酒之前,我需要工作什么葡萄品种的葡萄酒我喜欢。 MATLAB能帮我吗?如果我描述我完美的葡萄酒MATLAB,它能帮我选择一个吗?特点不同的葡萄酒品种脱颖而出?
通常有两种方法一个文本分类问题是这样的:
  1. 火车很长一段短期记忆(LSTM)网络,将文本数据时间序列和长期学习时间步长之间的依赖关系。
  2. 火车一个卷积神经网络(CNN),将文本数据视为高光谱图像和学习本地化特性通过应用滑动卷积过滤器。
在这篇文章中,我将关注第二种方法:酿酒葡萄品种分类描述了将它们转换为图片和使用一个CNN。

背景:字嵌入

将文本转换为高光谱图像,我们可以用一个字嵌入映射序列的单词代表图像的二维数组。换句话说,一个字嵌入词汇映射到高维向量。这些向量有时有趣的特性。例如,鉴于这个词向量对应于意大利,罗马,巴黎和法国你可能发现的关系:

意大利罗马+巴黎≈法国

即向量对应词意大利没有这个词的组件罗马但这个词的添加组件巴黎约等于向量对应法国
为此在MATLAB中,我们可以使用文本分析工具箱™模型fastText英语160亿嵌入标记词金宝app支持包。这个词嵌入地图大约1000000个英语单词1 -到- 300向量。让我们使用fastTextWordEmbedding加载这个词嵌入函数。
emb = fastTextWordEmbedding;
让我们想象一词向量意大利,罗马,巴黎,法国。通过计算向量使用这个词word2vec的关系函数,我们可以看到:
意大利= word2vec (emb,“意大利”);罗马= word2vec (emb,“罗马”);巴黎= word2vec (emb,“巴黎”);词= vec2word (emb、意大利罗马+巴黎)
词=“法国”

文字,图片

使用一个字嵌入单词序列映射到一个图像,我们使用文本分割成单词tokenizedDocument并将文字转换为一个序列向量使用doc2sequence
str = "在西班牙之雨大多洒落在平原。”;文档= tokenizedDocument (str);序列= doc2sequence (emb、文档);
我们视图相对应的高光谱图像序列的单词。
序列图I = {1};显示亮度图像(I, [1]) colorbar包含(“词指数”)ylabel(“嵌入特性”)标题(“向量”一词)
由此产生的图像不是特别令人兴奋。C-by-S数组,其中C是这个词的数量特征嵌入(嵌入维度)和S是文本的字数(序列长度)。当格式化为1)×(n高光谱图像与C频道,您可以输入这些数据的CNN和应用滑动过滤器身高1。这些被称为一维曲线玲珑。

葡萄酒评论数据加载

让我们下载葡萄酒评论Kaggle数据并将数据提取到一个文件夹命名为wine-reviews。下载数据后,我们可以从winemag读取数据-数据- 130 - k - v2。csv表使用readtable函数。数据包含特殊字符,如e在上涨,所以我们也必须指定文本编码选项。
文件名= fullfile (“wine-reviews”、“winemag -数据- 130 - k - v2.csv”);data = readtable(文件名,“编码”,“utf - 8”);数据。各种=分类(data.variety);

探索葡萄酒评论数据

了解数据,我们使用词云可视化文本数据。首先创建一个词云不同的葡萄品种。
图;wordcloud (data.variety);标题(“葡萄品种”)
快速验证文本分类是否可能,让我们快速创建云词的选择类和检查它们之间的差别。如果你安装了文本分析工具箱,然后wordcloud函数自动预处理的字符串输入。为了更好地可视化,让我们也删除常用单词的列表和文本的葡萄品种。
标签=[“琼瑶浆”“霞多丽”“内比奥罗”“贝克”);commonWords =[“酒”“喝”“喝”“味”“完成”“口感”“笔记”“香气”);图我= 1:4次要情节(2,2,我)标签=标签(我);idx =数据。各种= =标签;str = data.description (idx);文件= tokenizedDocument (str)文件= removeWords(文档、commonWords);= removeWords文档(文档、标签);str = joinWords(文件);wordcloud (str); title(label) end
这个词云的分布表明,单词每个葡萄品种中是不同的。尽管“水果”和“浆果”这样的词似乎通常描述其中的一些品种,云这个词表明每个葡萄品种中词语的分布是不同的。
这表明有理由对文本数据训练分类器。太好了!

为文本数据深度学习作准备

使用旋转文本数据进行分类,我们需要将文本数据转换为图像。要做到这一点,让我们垫或截断观察有一个恒定的长度和文件转换成词向量序列的长度使用pretrained字嵌入C。我们可以将文档表示为1-by-S-by-C图像(图像1高度,宽度,和C通道)。
将文本数据从CSV文件的图片,我有一个helper函数结束时这篇文章transformTextData。它创建一个tabularTextDatastore对象并使用转换函数与一个定制的转换功能,将数据从tabularTextDatastore对象读取图像深度学习。
在这个例子中,我们将训练一个网络与不同宽度的一维卷积过滤器。每个过滤器的宽度对应的字数过滤器可以看到(n元长度)。网络有多个分支的卷积层,因此可以使用不同的语法长度。

清理数据

没有一个标签删除评论。
idxMissing = ismissing (data.variety);:数据(idxMissing) = [];
删除任何评论的葡萄品种不是一个前200品种的数据。(如果你找不到你喜欢的酒在前200名的选择可用,MATLAB可能帮不了你。)
numClasses = 200;[classCounts,一会]= histcounts (data.variety);[~,idx] = maxk (classCounts numClasses);一会=一会(idx);idx = ismember (data.variety,类名);=数据(idx:);
从数据中删除未使用的类别。
数据。各种= removecats (data.variety);一会=类别(data.variety);

对数据进行分区

帮助评估网络的性能,我们将数据分割成训练、测试和验证集。我们拨出30%的数据验证和测试(15%)的两个分区。
本量利= cvpartition (data.variety,“坚持”,0.3);filenameTrain = fullfile (“wine-reviews”、“wineReviews_”+ numClasses +“_classes_Train.csv”);dataTrain =数据(训练(cvp):);writetable (dataTrain filenameTrain,“编码”,“utf - 8”);dataHeldOut =数据(测试(cvp):);本量利= cvpartition (dataHeldOut.variety,“坚持”,0.5);filenameValidation = fullfile (“wine-reviews”、“wineReviews_”+ numClasses +“_classes_Validation.csv”);dataValidation = dataHeldOut(培训(cvp):);writetable (dataValidation filenameValidation,“编码”,“utf - 8”);filenameTest = fullfile (“wine-reviews”、“wineReviews_”+ numClasses +“_classes_Test.csv”); dataTest = dataHeldOut(test(cvp),:); writetable(dataTest,filenameTest,"Encoding","UTF-8"); 从阅读代码需要休息吗?阅读研究人员如何使用MATLAB进行更好的啤酒和葡萄酒这篇文章
把从表中描述和各种领域。
miniBatchSize = 128;ttdsTrain = tabularTextDatastore (filenameTrain,……“SelectedVariableNames”,“描述”“品种”,…ReadSize, miniBatchSize);

指定输入大小

文本数据输入到网络中,我们需要将文本转换为图像与一个固定大小的填充或删除序列。理想情况下,我们需要选择一个值最小化的填充量添加到序列和丢弃的数据量由于截断。让我们试着近似的字数在每个审查通过计算空间的数量和直方图绘制序列长度。
大部分的评论包含80个或更少的单词。让我们用这个作为我们的序列长度通过指定80在我们自定义的变换函数。transformTextData函数,数据读取tabularTextDatastore对象并返回一个表的预测和响应。
sequenceLength = 80;tdsTrain =变换(ttdsTrain @(数据)transformTextData(数据、sequenceLength emb,类名);
预测1-by-S-by-C阵列,S是序列长度和C是特征的数量。分类标签的响应。
预览(tdsTrain)
进行验证,还让我们创建一个数据存储包含验证数据使用相同的步骤。
ttdsValidation = tabularTextDatastore (filenameValidation,……“SelectedVariableNames”,“描述”“品种”,…ReadSize, miniBatchSize);tdsValidation =变换(ttdsValidation @(数据)transformTextData(数据、sequenceLength emb,类名)

定义网络体系结构

现在我们定义的分类任务的网络体系结构,我们可以使用deepNetworkDesigner创建网络。
下面描述了网络架构:
  • 1-by-S-by-C输入大小,S是序列长度和C的特性(嵌入维数)。
  • 语法长度1到5,让我们创建的层块包含一个卷积层,一批标准化层,ReLU层,一层辍学,马克斯池层。
  • 对于每个块,我们指定256卷积过滤器的大小1)×(N和1-by-S池区域的大小,其中N是语法的长度。
  • 让我们输入层连接到每一块和连接块的输出使用深度连接层。
  • 最后,分类输出,包括一个完全连接层与输出尺寸K, softmax层,一层分类,K是类的数量。

指定培训选项

numIterationsPerEpoch =地板(numObservationsTrain / miniBatchSize);选择= trainingOptions(“亚当”,…“MaxEpochs”, 50岁,…“洗牌”,“从来没有”,…MiniBatchSize, MiniBatchSize,……ValidationData, tdsValidation,……ValidationFrequency, numIterationsPerEpoch,……“阴谋”、“训练进步”,…“详细”,假);

列车网络的

最后,我们可以训练网络!让我们培养网络使用trainNetwork函数。根据你的硬件,这可能需要很长时间。与硬件或培训,如果你有困难你可以电子邮件Johanna训练网络的副本。
赤霞珠= trainNetwork (tdsTrain、lgraph选项);保存(“caberNet.mat”、“赤霞珠”)
*注意从Johanna Ieuan:我有个男人政策在这个博客上,和“赤霞珠”边缘,所以认为这是一个警告。
在这里我们可以看到训练收敛精度约为93%,验证准确性收敛于63%左右。这表明,网络可能会过度拟合训练数据。特别是,它可能是学习训练数据的特征,不能很好地概括来验证数据。需要更多的调查!

测试网络

现在网络是训练,我们可以测试它使用了测试数据。首先,让我们创建一个转换包含了测试数据的数据存储。
ttdsTest = tabularTextDatastore (filenameTest,……“SelectedVariableNames”,“描述”“品种”,…ReadSize, miniBatchSize);tdsTest =变换(ttdsTest @(数据)transformTextData(数据、sequenceLength emb,类名);台= readall (ttdsTest);labelsTest = tbl.variety;欧美=分类(labelsTest,类名);YPred =分类(赤霞珠、tdsTest MiniBatchSize, MiniBatchSize);
精度= 0.6397
在这里,我们可以看到网络伸出测试数据大约是64%准确的。考虑到不同的和主观的性质品酒笔记,我认为这是一个好分数!

新数据做出预测

下一步是尝试分类器在现实世界中!这里有一些我最近参加了一次品酒笔记。
  • “脆,黄金有色,起泡酒。的鼻子,有柑橘类水果的香气和成熟的水果。palete,充满活力的苹果和奶油的纹理。”
  • “草色略有一丝绿色。桃子和油桃的笔记。富人和微甜,强烈的荔枝。强大的minerality一些甜味。”
  • “浅草的颜色与兴致很高的柑橘类水果的鼻子。口感,强烈的醋栗和脆石灰与轻微的橡木味道。”
  • “深金色的颜色。强大的烤面包和黄油的香味强烈的暗示的橡树。口感,浓郁成熟的香蕉和煮熟的苹果。”
  • “很轻酒体的葡萄酒和苍白的颜色。带有草莓和森林水果的香味。轻微的橡木酒桶和轻微的单宁。充满活力的红樱桃的味道。”
  • “酒体中等和砖红色的颜色。鼻子,黑樱桃、紫罗兰。复杂的口味包括强烈的单宁加上黑色水果和胡椒的味道。”
  • “深宝石红的颜色。黑樱桃的香气,橡木和丁香。略烟味道强烈的黑莓和licorce提示。”
  • “强大的黑醋栗和蓝莓的香气。一个非常大的葡萄酒酒精含量高。强烈的味道,口感悠长。充满活力的风格的黑色水果和香料。”
使用这些笔记使用网络进行预测,我们需要将文本转换成序列使用相同的步骤作为培训过程。通过使用text2sequence函数,它包括我的博客,我们可以把一个字符串数组表指定的词向量序列的长度。
str, sequencesNew = text2sequence (emb sequenceLength);[YNewPred, scoresNew] =(赤霞珠,sequencesNew)进行分类;台=表;资源描述。PredictedVariety = YNewPred;资源描述。TrueVariety = YNewTest
在这里,正确的网络分类四个八。尽管我想让它侥幸说静脉是一个闪闪发光的混合(从技术上讲,网络是正确的)。同样,说西拉而不是设拉子是可以原谅的,因为他们是同一品种在不同的名字。
假设6 8…太棒了!

可视化网络预测

对于图像分类问题,您可以可视化的预测网络通过一个图像,删除一个补丁的图像,测量如果分类变得更好或更糟的是,然后叠加结果图像。换句话说,如果你删除一个补丁图像的分类变得更糟,那片属于真正的类必须包含特性。类似地,如果您删除一个补丁的形象,然后分类变得更好,补丁必须包含功能属于一个不同的类,从而混淆分类器。
我们可以使用occlusionSensitivity函数。让我们选择一个文本的观测数据的网络预测正确的标签。
idxObservation = 2;strNew = str (idxObservation) labelTest = YNewTest (idxObservation)
strNew = "略稻草颜色的带着一丝绿色。桃子和油桃的笔记。富人和微甜,强烈的荔枝。一个软完成一些甜味。”
labelTest =“琼瑶浆”
让我们查看阻塞敏感性分数使用函数plotOcclusion我已经列出的博客。这显示了哪些补丁的话最有助于预测。
h =图;h.Position (3) = 1.5 * h.Position (3);plotOcclusion(赤霞珠、emb strNew、sequenceLength labelTest)
在这里,我们可以看到,网络已经获悉,短语“富人和微甜”和“荔枝的笔记”琼瑶浆品种的强烈信号,同样的,短语“草色”和“桃子的笔记”这种多样性的特征。
现在,让我们来想象一个更进一步的品种使用相同的技术。
idxObservation = 8;strNew = str (idxObservation) labelTest = YNewTest (idxObservation)
strNew = "强烈的黑樱桃香气。强大的酒精含量高的味道。丰富的味道强烈的单宁和悠长。充满活力的口味的樱桃和胡椒的迹象。”
labelTest = "仙粉黛”
h =图;h.Position (3) = 1.5 * h.Position (3);h.Position (4) = 1.5 * h.Position (4);plotOcclusion(赤霞珠、emb strNew、sequenceLength labelTest)
在这里,我们可以看到网络理解的许多短语的明显迹象显示梅洛品种除了“高酒精含量”。类似的,第二个图显示的网络了解只有一些短语在文本是馨芳葡萄酒品种的特征,然而,“强劲的单宁”这个词和短语包含“樱桃”或“樱桃”是特别不寻常的比较。
完美!现在我可以用MATLAB来帮助我确定我喜欢葡萄酒。此外,我可以想象所做的预测网络,也许自己学到更多东西。我想我更好的测试这个网络在一些品酒会……
所有辅助函数可以使用Get MATLAB代码找到下面的链接。
感谢Ieuan非常丰富和wine-filled文章。他原本想这篇文章标题,“数学”的葡萄但我在博客上个男人政策实施。我特别喜欢他实地测试代码的品酒会,这是奉献!有一个问题要问Ieuan吗?请在下面留下你的评论。

版权2018年MathWorks公司。得到了MATLAB代码

|
  • 打印

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。