当前位置: 首页 > 科技观察

如何在iPhone上构建第一个机器学习模型_0

时间:2023-03-14 11:07:08 科技观察

简介作为一名数据科学家,我一直有一个梦想——最新的科技公司不断推出与我相关领域的新产品。如果你观看了Apple最新的iPhoneX发布会,你会发现iPhoneX具有非常酷的功能,例如FaceID、动画表情符号、增强现实,所有这些都使用了机器学习。作为一名黑客,我决定亲力亲为,探索如何构建这样一个系统。进一步调查后,我发现了一个非常有趣的工具,它就是苹果官方为开发者提供的机器学习框架工具CoreML。它可以在任何Apple设备上使用,如iPhone、Macbook、AppleTV、Applewatch等。另一个有趣的发现是,Apple在最新的iPhone中设计了一个定制的GPU,以及一个A11AdvancedBionic处理芯片,带有神经引擎用于优化机器学习。随着核心组件计算引擎越来越强大,iPhone将开辟机器学习的新途径,CoreML在未来会越来越重要。阅读本文后,您将了解什么是AppleCoreML以及它为何势头强劲。我们还将通过在iPhone上开发垃圾邮件分类应用程序,与您一起探索CoreML的实现细节。同时,我们将客观评价CoreML的优劣来结束这篇文章。文章目录:什么是CoreML?构建系统案例研究:在iPhone上实现垃圾邮件分类应用程序使用CoreML的利弊01.什么是CoreML?/O会议)来炒作CoreML。为了更好地理解CoreML的作用,我们需要一些背景知识。CoreML的背景有趣的是,这并不是苹果第一次发布移动机器学习框架。去年,它发布了一些相同的框架库:Accelerate框架和基本神经网络子程序(BNNS)-使用卷积神经网络的CPU效率和预测性。MetalPerformanceShadersCNN(MPSCNN)-有效利用GPU并使用卷积神经网络进行预测。这两个框架库的区别在于,一个是针对CPU优化的,另一个是针对GPU优化的。这是因为有时CPU在推理过程中比GPU更快,而GPU在训练过程中几乎每次都更快。但是为了提高性能,框架与底层硬件保持非常接近,使得这些混合框架让开发人员感到困惑并且难以编程。走进CoreMLCoreML会在前面提到的两个库之上提供一个抽象层,也会提供一个简单的接口来达到同样的效率。另一个好处是CoreML在我们的应用程序运行时负责CPU和GPU之间的上下文切换。换句话说,如果我们有一个涉及文本处理(自然语言处理)的内存密集型任务,CoreML会自动运行在CPU上;而如果我们有一个计算量大的任务,比如图像识别,它将使用GPU;当App包含这两个功能时,它会自动切换以充分利用两者。CoreML还会提供什么?CoreML的顶层附带三个额外的库:视觉:该库提供高性能图像分析和计算机视觉技术,用于图像和视频中的人脸识别、特征检测和场景识别。Foundation(NLP):顾名思义,它提供了一些自然语言处理的功能GameplayKit:一个用于游戏开发的库,此外,它还提供AI并使用决策树。上面提到的所有库都可以通过一些简单的界面轻松获得,这些界面可用于完成一系列任务。通过上面的库,CoreML最终的框架图如下:注意,上面的设计为iOS应用提供了很好的模块化结构。您可以为不同的任务使用不同的层,并且可以以多种方式使用它们(例如,在应用程序中使用NLP进行图像分类)。了解更多:Vision、Foundation和GameplayKit。好了,现在我们已经有了足够的理论知识,是时候实践一下了!《微信排版限制,需要代码的同学请参考文末原文链接自行查找》02.建立系统要想充分使用CoreML,需要满足以下要求:1.OS:MacOS(Sierra10.12orabove)2.Python2.7和pip:点击下载pythononmac。打开终端并输入以下代码来安装pip:sudoeasy_installpip3.coremltools:这个包有助于将您的模型从python转换为CoreML可以理解的格式。在终端中输入以下代码进行安装:sudopipinstall-Ucoremltools4.Xcode9:这是苹果设备上用于构建应用程序的默认软件。点击下载。在下载Xcode之前,您需要使用您的AppleID登录。登录后,您需要验证您的AppleID。您将收到与使用AppleID注册的设备相同的通知。单击“允许”并输入网站上显示的6位密码。完成此操作后,您会看到一个下载选项。你可以在那里下载Xcode。既然我们已经建立了系统,那么当我们准备好时,让我们进入实施部分!03.案例研究:在iPhone上实现一个垃圾短信分类应用程序在这个开发中,我们将重点关注使用CoreML功能的两种重要方式。让我们开始吧!将你的机器学习模型转换为CoreML格式CoreML的优势之一,或者说是其创建者的一个明智决定,是支持在sklearn、caffe、xgboost和其他流行框架中对训练有素的模型进行机器学习模型的转换。数据科学社区不会尝试CoreML,因为他们可以在他们喜欢的环境中试验、训练他们的模型,然后轻松地在iOS/MacOS应用程序上导入和使用它们。以下是开箱即用的CoreML支持框架:什么是Mlmodel?为了简化转换过程,Apple设计了自己的开放格式来表示跨框架机器学习模型mlmodel。该模型文件包含模型每一层的描述、输入、输出、类标签以及需要对数据进行的任何预处理。它还包含学习参数(权重和偏差)。转换过程如下:在你喜欢的框架中训练模型使用python模块coremltools将模型转换为.mlmodel格式在应用程序中使用模型在这个例子中,我们将在sklearn中训练一个垃圾邮件分类器,然后模型是转移到CoreML。关于垃圾邮件数据集SMS垃圾邮件数据集v.1是一个公开可用的SMS标记文本数据集,用于手机垃圾邮件研究。它包含5574条真实的未编码英文短信,标记为合法(合成)或垃圾邮件。您可以在此处下载数据集。构建基础模型我们在sklearn中使用LinearSVC来构建基础模型。同时,我们提取短信文本的TF-IDF值作为模型特征。TF-IDF是自然语言处理中的一种方法,它根据唯一标识文档的词对文档进行分类。如果你想深入了解NLP和tf-idf,可以阅读这篇文章。代码如下:importnumpyasnpimportpandasaspd#Readinginandparsingdataraw_data=open('SMSSpamCollection.txt','r')sms_data=[]forlineinraw_data:split_line=line.split("\t")sms_data.append(split_line)#Splittingdataintomessagesandlabelsandtrainingandtestsms_mdatas=n)X=sms_data[:,1]y=sms_data[:,0]#BuildaLinearSVCmodelfromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.svmimportLinearSVC#Buildtf-idfvectorrepresentationofdatavectorizer=TfidfVectorizer()vectorized_text=vectorizer.fit_transform(X)text_clftext_clf.LinearSVC()文本_clftext_clf=LinearSVC()fit(vectorized_text,y)我们的模型已构建,让我们用垃圾邮件对其进行测试:#Testthemodelprinttext_clf.predict(vectorizer.transform(["""XXXMobileMovieClub:Touseyourcredit,clicktheWAPlinkinthenexttxtmessageorclickhere>>http://wap.xxxmobilemovieclub.com?n=QJKGIGHJJGCBL"""]))有趣的是,我们的模型效果很好!让我们添加交叉验证:#Cross-Validationfromsklearn.model_selectionimportcross_val_scorecross_score=cross_val_score(text_clf,vectorized_text,y,cv=10)printcross_scoreprint"mean:",np.mean(cross_score)现在模型已经构建好了,为了让它适用于CoreML,我们需要将其转换为.mlmodel格式并使用以前安装的coremltools工具包来实现。以下代码将我们的模型转换为.mlmodel格式。importcoremltools#converttocoremlmodelcoreml_model=coremltools.converters.sklearn.convert(text_clf,"message","spam_or_not")#setparametersofthemodelcoreml_model.short_description="Classifywhethermessageisspamornot"coreml_model.input_description["message"]="TFIDFofmessagetobeclassified"coreml_model.output_or_not_["]垃圾邮件="Whethermessageisspamornot"#savethemodelcoreml_model.save("SpamMessageClassifier.mlmodel")这是如何工作的?首先,我们使用coremltoolsPython工具包。然后选择一个转换器来转换模型。在本例中,使用了converters.sklearn,因为要转换的模型是使用sklearn工具创建的。然后在.convert()括号内声明模型对象、输入变量名和输出变量名。接下来,设置模型参数以添加有关输入和输出的更多信息,最后使用.save()保存已转换为CoreML格式的模型文件。双击模型文件,它将使用Xcode打开。如您所见,模型文件显示了很多关于模型类型、输入、输出、输入和输出类型等的信息。我在上图中将其标记为红色。您可以将这些描述与转换为.mlmodel时提供的描述进行比较。将您自己的模型引入CoreML就是这么简单。现在您的模型已在Apple生态系统中,真正的乐趣开始了!注意:可以在此处找到此步骤的完整代码文件。在此处了解有关coremltools的更多信息,以及在此处提供的不同类型的转换器。在我们的应用程序中使用该模型现在模型已经训练并导入到CoreML中,让我们使用该模型开发一个iPhone垃圾邮件分类应用程序!我们将在模拟器上运行该应用程序。模拟器是一种软件,可以显示应用程序的界面和操作,就像它在iPhone上实际运行一样。这节省了很多时间,因为我们可以在iPhone上运行应用程序之前测试代码和调试。下面是最终产品的外观:下载项目我为我们的应用程序制作了一个简单的基本UI并将其放在GitHub上。加载并运行:gitclonehttps://github.com/mohdsanadzakirizvi/CoreML-on-iPhone.gitcdCoreML-on-iPhone/Practice\App/opencoreml\test.xcodeproj/这将在Xcode中打开我们的项目。在Xcode窗口中,我用红色标记了三个重要区域:左上角的播放按钮用于启动在模拟器中运行的应用程序。播放按钮下方列出了与我们的项目相关的文件和文件夹。这是项目导航栏,方便您在项目中查找文件和文件夹。播放按钮旁边写着iPhone8,表示您要使用模拟器模拟的目标设备。您可以单击它并在下拉列表中选择iPhone7。让我们运行应用程序,看看会发生什么。点击左上角的播放按钮,让模拟器运行应用。在框中键入任何文本,然后点击预测按钮。发生了什么?到目前为止,我们的应用程序除了按原样输出框中键入的文本外什么也没做。将经过训练的模型添加到您的应用程序非常简单:将您的.mlmodel模型文件拖到Xcode窗口项目导航器中。完成后会弹出几个选项的窗口,默认默认,点击“结束”。当您像这样将文件拖入Xcode时,会在项目中自动生成该文件的引用路径。这样您就可以轻松地在代码中获取文件。编译模型在我们可以使用我们的模型进行推理之前,我们需要让Xcode在构建阶段编译模型。具体步骤如下:在项目导航栏中选择蓝色标记的文件,会在右侧打开项目设置。单击CompileSources(编译源)并选择+号。在出现的新窗口中,选择SpamMessageClassifier.mlmodel文件并单击添加。现在每次我们运行该应用程序时,Xcode都会编译我们的机器学习模型,以便它可以用于进行预测。在代码中创建模型为Apple设备开发的任何应用程序都是在Swift中编程的。你不需要学习swift,但如果你有兴趣在以后更深入,你可以按照这个教程。在项目导航器中选择ViewController.swift。此文件包含控制应用程序功能的大部分代码。第24行的predictSpam()函数完成了大部分工作。删除第25行,在函数中添加如下代码:letenteredMessage=messageTextField.text!if(enteredMessage!=""){spamLabel.text=""}//Fetchtfidfrepresentationoftextletvec=tfidf(sms:enteredMessage)do{//Getpredictiononthetextletprediction=trySpamMessageClassifier().prediction(message:vec).spam_or_notprint(prediction)if(prediction="spam"){spamLabel.text="SPAM!"}elseif(prediction="ham"){spamLabel.text="NOTSPAM"}}catch{spamLabel.text="NoPrediction"}上面的代码检查用户是否在框中输入了任何信息。如果是,则调用tfidf()函数计算文本的tfidf值。然后生成一个SpamMessageClassifier对象实例,然后调用.prediction()函数。这与sklearn中的.predict()函数相同。然后根据预测呈现适当的信息。但是为什么我们需要tfidf()?请记住,我们正在根据文本的tf-idf表示来训练模型,因此我们的模型需要相同形式的输入。一旦获得有关键入的文本框的信息,就会调用tfidf()函数来执行相同的操作。我们来写这一步的代码,复制下面的代码放在predictSpam()函数后面://MARK:Functionalitycodefunctfidf(sms:String)->MLMultiArray{//getpathforfilesletwordsFile=Bundle.main.path(forResource:"wordlist",ofType:"txt")letsmsFile=Bundle.main.path(forResource:"SMSSpamCollection",ofType:"txt")do{//readwordsfileletwordsFileText=tryString(contentsOfFile:wordsFile!,encoding:String.Encoding.utf8)varwordsData=words文件文本。components(separatedBy:.newlines)wordsData.removeLast()//Trailingnewline.//readspamcollectionfileletsmsFileText=tryString(contentsOfFile:smsFile!,encoding:String.Encoding.utf8)varsmsData=smsFileText.components(separatedBy:.newlines)smsData.removeLast()//Trailingnewline.letwordsInMessage=sms.split(separator:"")//创建多维arrayletvectorized=tryMLMultiArray(shape:[NSNumber(integerLiteral:wordsData.count)],dataType:MLMultiArrayDataType.double)foriin0..letword=wordsData[i]ifsms.contains(word){varwordCount=0forsubstrinwordsInMessage{ifsubstr.elementsEqual(word{wordCount+=1}}lettf=Double(wordCount)/Double(wordsInMessage.count)vardocCount=0forsmsinsmsData{ifsms.contains(word){docCount+=1}}letidf=log(Double(smsData.count)/Double(docCount))vectorized[i]=NSNumber(value:tf*idf)}else{vectorized[i]=0.0}}returnvectorized}catch{returnMLMultiArray()}}上面的代码获取了input中的信息文本框tfidf特征,为此它读取SMSSpamCollection.txt原始数据库并返回相同的一旦你保存项目并再次运行模拟器,你的应用程序应该运行良好。4.CoreML的优点和缺点像每个开发中的库一样,CoreML有有利也有弊,先说清楚。优点:针对移动设备性能优化,最小化内存和能源消耗。在移动设备上运行确保用户隐私,不再需要将数据发送到服务器进行预测。在移动设备上运行设备意味着即使没有连接到互联网也可以进行预测,加上使用r的反应时间更短。可以决定在CPU或GPU(或两者)上运行。由于可以使用CPU,所以可以在iOS模拟器上运行(iOS模拟器不支持GPU)。提供了很多模型,因为它可以导入其他主流机器学习框架的模型:支持向量机(SVM)树集成,例如随机森林,提升树线性回归和逻辑回归神经网络:前馈,卷积,循环缺点:只有监督模型支持,不支持无监督模型和强化学习。不支持在设备上重新训练模型,只能进行预测。如果CoreML不支持某个层,则不能使用它。目前,您无法使用自己的层扩展CoreML。CoreML工具只支持少数特定版本的训练工具(甚至不支持tensorflow)。看不到中间层的输出,只能得到预测结果……只支持回归和分类(不支持聚类、排序、降维等)。结论在本文中,我们了解了CoreML并将其应用于开发iPhone机器学习应用程序。CoreML是一个较新的库,因此有其优点和缺点。一个非常有用的优点是它在设备本地运行,因此速度更快并保证数据隐私。但同时也不够全面,没有考虑到数据科学家的需求。期待以后的版本改进。如果您遇到某个步骤,本文的所有代码都在GitHub上。