云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

香港带宽_数据库的设计_高性能

小七 141 0

卷积神经网络在汽车分类中的应用

卷积神经网络(CNN)是最先进的神经网络结构,主要用于计算机视觉任务。CNN可以应用于许多不同的任务,如图像识别、目标定位和变化检测。最近,我们的合作伙伴Data Insights接到一家大型汽车公司的挑战性要求:开发一个计算机视觉应用程序,可以识别给定图像中的汽车模型。考虑到不同的车型可能看起来非常相似,任何一辆车都可能因其周围环境和拍摄角度的不同而显得非常不同,直到最近,这样的任务才是根本不可能完成的。 然而,从2012年左右开始,"深度学习革命"使解决这一问题成为可能。计算机可以反复研究图片并自己学习这些概念,而不是解释汽车的概念。在过去的几年里,人工神经网络的创新使得人工智能能够以人类水平的精确度执行图像分类任务。在这些发展的基础上,我们能够训练一个深层次的CNN,根据它们的车型对汽车进行分类。神经网络是在斯坦福汽车数据集上训练的,该数据集包含16000多张汽车图片,由196个不同的模型组成。随着时间的推移,我们可以看到预测的准确性开始提高,因为神经网络学会了汽车的概念,以及如何区分不同的车型。例如人工神经网络,在输入层和输出层之间有多层,输入是图像,输出是车型分类。我们与我们的合作伙伴一起使用apachespark构建了一个端到端的机器学习管道™ 考拉用于数据预处理,Keras使用Tensorflow进行模型训练,MLflow用于跟踪模型和结果,azureml用于部署REST服务。Azure Databricks中的这个设置经过优化,可以快速高效地训练网络,还可以帮助更快地尝试多种不同的CNN配置。即使只进行了几次练习,CNN的准确率也达到了85%左右。建立人工神经网络对图像进行分类在这篇文章中,我们将概述一些主要的技术,使神经网络投入生产。如果你想让神经网络运行自己,完整的笔记本电脑,包括一个细致的步骤指南,可以在下面找到。这个演示使用的是公开的斯坦福汽车数据集,这是一个更全面的公共数据集,虽然有点过时,所以你不会找到2012年后的汽车模型(尽管,一旦培训,转移学习可以很容易地取代一个新的数据集)。数据通过ADLS Gen2存储帐户提供,您可以将其装载到您的工作区。数据预处理的第一步是将图像压缩成hdf5文件(一个用于培训,另一个用于测试)。这就可以被神经网络读入。如果您愿意,这一步可以完全省略,因为hdf5文件是adlsgen2存储的一部分,作为这里提供的笔记本电脑的一部分。将Stanford Cars数据集加载到HDF5文件中使用考拉进行图像增强用Keras训练CNN将模型作为REST服务部署到azureml考拉图像增强收集到的数据的数量和多样性对使用深度学习模型可以获得的结果有很大的影响。数据扩充是一种无需实际收集新数据就能显著提高学习效果的策略。使用裁剪、填充和水平翻转等不同的技术(通常用于训练大型神经网络),可以通过增加用于训练和测试的图像数量来人为地膨胀数据集。对大量的训练数据应用扩充是非常昂贵的,尤其是在比较不同方法的结果时。有了考拉,就可以很容易地在Python中尝试现有的图像增强框架,并使用todatascience熟悉的Pandas API在具有多个节点的集群上扩展该过程。在Keras中编码ResNet当你拆开一个CNN时,它们由不同的"块"组成,每个块仅仅代表一组要应用于某些输入数据的操作。这些区块大致可分为:标识块:保持数据形状不变的一系列操作。卷积块:把输入数据的形状缩小成更小形状的一系列操作。CNN是一系列的标识块和卷积块(或ConvBlocks),它们将输入图像简化为一组紧凑的数字。这些结果中的每一个(如果训练正确的话)最终都会告诉你一些对图像分类有用的信息。剩余的CNN会为每个块添加一个额外的步骤。在应用构成块的操作之前,数据保存为临时变量,然后将该临时数据添加到输出数据中。通常,此附加步骤应用于每个块。作为一个例子,下图展示了一个简化的CNN来检测手写数字:  实现神经网络有许多不同的方法。更直观的方法之一是通过Keras。Keras提供了一个简单的前端库,用于执行组成神经网络的各个步骤。Keras可以配置为使用Tensorflow后端或Theano后端。这里,我们将使用Tensorflow后端。Keras网络被分为多个层,如下所示。对于我们的网络,我们还定义了一个层的客户实现。缩放层对于任何具有可训练权重的自定义操作,Keras允许您实现自己的层。在处理大量图像数据时,可能会遇到内存问题。最初,RGB图像包含整数数据(0-255)。当运行梯度下降作为反向传播优化的一部分时,我们会发现整数梯度不允许足够的精度来适当地调整网络权重。因此,有必要改变浮子精度。这就是问题可能出现的地方。即使将图像缩小到224x224x3,当我们使用一万个训练图像时,我们也会看到超过10亿个浮点项。与将整个数据集转换为浮点精度不同,更好的做法是使用"缩放层"(Scale Layer),它一次只缩放一个图像,并且只在需要时缩放输入数据。这应该在模型中批量规范化之后应用。这个尺度层的参数也是可以通过训练学习的参数。为了在评分过程中使用这个自定义层,我们必须将类与模型打包在一起。使用MLflow,我们可以通过Keras自定义对象字典将名称(字符串)映射到与Keras模型相关联的自定义类或函数来实现这一点。MLflow使用CloudPickle保存这些自定义层,并在加载模型时自动恢复它们mlflow.keras.load_模型()和mlflow.pyfunc.load_模型().mlflow.keras.log_模型(model,"model",自定义对象={"Scale":Scale})使用MLflow和Azure机器学习跟踪结果机器学习开发涉及到软件开发之外的其他复杂性。由于存在大量的工具和框架,因此很难跟踪实验、重现结果和部署机器学习模型。与Azure Machine Learning一起,我们可以使用MLflow加速和管理端到端的机器学习生命周期,从而使用Azure数据块可靠地构建、共享和部署机器学习应用程序。为了自动跟踪结果,可以将现有或新的azureml工作区链接到您的azuredatabricks工作区。此外,MLflow支持Keras模型的自动日志记录(mlflow.keras.autolog公司()),使体验几乎不费吹灰之力。虽然MLflow内置的模型持久性实用程序可以方便地打包来自各种流行ML库(如Keras)的模型,但它们并不能涵盖所有用例。例如,您可能希望使用MLflow内置风格不明确支持的ML库中的模型。或者,您可能希望打包自定义推理代码和数据,以创建MLflow模型。幸运的是,MLflow提供了两种可用于完成这些任务的解决方案:自定义Python模型和自定义风格。在这个场景中,我们希望确保我们可以使用一个模型推理引擎来支持来自restapi客户机的请求。为此,我们使用一个基于先前构建的Keras模型的定制模型来接受一个JSON Dataframe对象,其中包含Base64编码的图像。进口mlflow.pyfuncAutoResNet150类(mlflow.pyfunc.PythonModel):def predict_from_picture(自我,img_df):导入cv2作为cv将numpy作为np导入导入base64#用于http传输的base64编码图像的解码图像=np.frombuffer(base64.b64解码(img_df[0][0]),数据类型=np.uint8公司)图像分辨率=cv.调整大小(cv.imdecode公司(img,flags=1),(224,224),cv.IMREAD_不变)rgb图像=扩展尺寸(图像分辨率,0)预测=self.keras_模型.预测(rgb\U img)概率=np.最大值(预测)类标识=np.argmax公司(预测)return{"label":self.class\u名称[类\ id][0][0],"prob":"{:.4}".format(prob)}def load_上下文(self,context):进口scipy.io公司将numpy作为np导入进口h5py进口煤油导入cloudpickle从keras.型号导入负载模型自身结果= []打开(context.artifactscars_meta"]","rb")作为文件:#加载汽车类文件汽车元数据=scipy.io.loadmat公司(文件)self.class\u名称=cars_meta['类名称']self.class\u名称= np.转置(self.class\u名称)打开(context.artifactsscale_层"]","rb")作为文件:self.scale_层= cloudpickle.load(文件)打开(context.artifactskeras_模型"]","rb")作为文件:f=h5型py.File文件(文件名,'r')self.keras_模型=加载模型(f,自定义对象={"缩放":self.scale_层})