在一小时内构建您的深度学习应用程序

一、说明

        我已经做了将近十年的数据分析。有时,我使用机器学习技术从数据中获取见解,并且我习惯于使用经典 ML。

        虽然我已经通过了神经网络和深度学习的一些MOOC,但我从未在我的工作中使用过它们,这个领域对我来说似乎很有挑战性。我有所有这些偏见:

  • 你需要学习很多东西才能开始使用深度学习:数学,不同的框架(我至少听说过其中的三个:和)和网络的架构。PyTorchTensorFlowKeras
  • 需要庞大的数据集来拟合模型。
  • 如果没有强大的计算机(它们还必须具有Nvidia GPU),就不可能获得像样的结果,因此很难进行设置。
  • 启动并运行 ML 驱动的服务有很多样板文件:您需要处理前端和后端端。

        我相信分析的主要目标是帮助产品团队根据数据做出正确的决策。如今,神经网络绝对可以改善我们的分析,即NLP有助于从文本中获得更多见解。因此,我决定再次尝试利用深度学习的力量对我有帮助。

        这就是我开始 Fast.AI 课程的方式(它在 2022 年初更新,所以我想自之前对 TDS 的评论以来,内容已经发生了变化)。我已经意识到使用深度学习解决你的任务并不是那么困难。

        本课程遵循自上而下的方法。因此,您从构建一个工作系统开始,然后才能更深入地了解所有必需的基础知识和细微差别。

        我在第二周制作了我的第一个 ML 驱动的应用程序(你可以在这里尝试)。 这是一个图像分类模型,可以识别我最喜欢的狗品种。令人惊讶的是,即使我的数据集中只有几千张图像,它也能很好地工作。这让我感到鼓舞,我们现在可以轻松构建一项十年前完全神奇的服务。

        因此,在本文中,您将找到有关构建和部署由机器学习提供支持的第一个服务的初学者级教程。

二、什么是深度学习?

        当我们使用多层神经网络作为模型时,深度学习是机器学习的一个特定用例。

        神经网络非常强大。根据通用近似定理,神经网络可以近似任何函数,这意味着它们能够解决任何任务。

        现在,您可以将此模型视为一个黑盒,它接受输入(在我们的例子中 - 一个狗图像)并返回输出(在我们的例子中 - 一个标签)。

作者摄

三、构建模型

您可以在Kaggle上找到此阶段的完整代码。

        我们将使用Kaggle笔记本来构建我们的深度学习模型。如果您还没有在 Kaggle 上拥有帐户,那么值得通过注册过程。Kaggle是数据科学家的流行平台,您可以在其中查找数据集,参加竞赛以及运行和共享代码。

        您可以在 Kaggle 上创建一个笔记本,并在此处执行代码,就像在本地 Jupyter 笔记本中一样。Kaggle甚至提供了GPU,因此我们将能够非常快速地训练NN模型。

图片来源:作者

让我们从导入所有包开始,因为我们将使用许多 Fast.AI 工具。

from fastcore.all import *
from fastai.vision.all import *
from fastai.vision.widgets import *
from fastdownload import download_url

四、加载数据

        不言而喻,我们需要一个数据集来训练我们的模型。获取一组图像的最简单方法是使用搜索引擎。

DuckDuckGo搜索引擎有一个易于使用的API和方便的Python包(更多信息),所以我们将使用它。duckduckgo_search

        让我们尝试搜索狗的图像。我们已指定仅使用具有知识共享许可的图像。license_image = any

from duckduckgo_search import DDGS
import itertools
with DDGS() as ddgs:res = list(itertools.islice(ddgs.images('photo samoyed happy', license_image = 'any'), 1))

        在输出中,我们获得了有关图像的所有信息:名称,URL和大小。

{"title": "Happy Samoyed dog photo and wallpaper. Beautiful Happy Samoyed dog picture", "image": "http://www.dogwallpapers.net/wallpapers/happy-samoyed-dog-wallpaper.jpg", "thumbnail": "https://tse2.mm.bing.net/th?id=OIP.BqTE8dYqO-W9qcCXdGcF6QHaFL&pid=Api", "url": "http://www.dogwallpapers.net/samoyed-dog/happy-samoyed-dog-wallpaper.html", "height": 834, "width": 1193, "source": "Bing"
}

        现在我们可以使用 Fast.AI 工具下载图像并显示缩略图。

摄影:Barcs Tamás on Unsplash

        我们看到一个快乐的萨摩耶德,这意味着它正在工作。因此,让我们加载更多照片。

        我的目标是确定五种不同的狗品种(我最喜欢的品种)。我将为每个品种加载图片并将它们存储在单独的目录中。

breeds = ['siberian husky', 'corgi', 'pomeranian', 'retriever', 'samoyed']
path = Path('dogs_breeds') # defining pathfor b in tqdm.tqdm(breeds):dest = (path/b)dest.mkdir(exist_ok=True, parents=True) download_images(dest, urls=search_images(f'photo {b}'))sleep(10) download_images(dest, urls=search_images(f'photo {b} puppy'))sleep(10) download_images(dest, urls=search_images(f'photo {b} sleep'))sleep(10) resize_images(path/b, max_size=400, dest=path/b)

运行此代码后,您将在Kaggle的右侧面板上看到所有加载的照片。

图片来源:作者

        下一步是将数据转换为适合 Fast.AI 模型的格式 — 。DataBlock

        您需要为此对象指定一些参数,但我将只强调最重要的参数:

  • splitter=RandomSplitter(valid_pct=0.2, seed=18):Fast.AI 要求您选择一个验证集。验证集是将用于估计模型质量的保留数据。训练期间不会使用验证数据来防止过度拟合。在我们的例子中,验证集是数据集的随机 20%。我们指定了参数,以便下次能够重现完全相同的拆分。seed
  • item_tfms=[Resize(256, method=’squish’)]:神经网络批量处理图像。这就是为什么我们必须拥有相同大小的图片。图像大小调整有不同的方法,我们现在使用 squish,但我们稍后会更详细地讨论它。

        我们已经定义了一个数据块。该函数可以向我们显示一组带有标签的随机图像。show_batch

摄影:Angel Luciano on Unsplash |摄影:Brigitta Botrágyi on Unsplash |摄影:Charlotte Freeman on Unsplash

数据看起来不错,所以让我们继续训练。

五、训练模型

您可能会感到惊讶,但下面的两行代码将完成所有工作。

        我们使用了预训练模型(具有 18 个深层的卷积神经网络 — )。这就是为什么我们称该函数。Resnet18fine_tune

        我们对模型进行了三个时期的训练,这意味着模型看到了整个数据集 3 次。

        我们还指定了指标 — (正确标记的图片的份额)。您可以在每个纪元后的结果中看到此指标(仅使用验证集计算,以免扭曲结果)。但是,它不会在优化过程中使用,仅供您参考。accuracy

        整个过程大约需要 30 分钟,现在我们的模型可以预测狗的品种,准确率为 94.45%。干得好!但是我们能改善这个结果吗?

六、改进模型:数据清理和扩充

如果希望看到第一个模型尽快工作,请随时将本部分留到以后,并转到模型的部署。

        首先,让我们看看模型的错误:它是否无法区分柯基犬和哈士奇犬或博美犬和猎犬。我们可以使用它。请注意,混淆矩阵也仅使用验证集进行计算。confusion_matrix

        Fast.AI 课程中分享的另一个生活技巧是可以使用模型来清理我们的数据。对于它,我们可以看到损失最高的图像:可能是模型错误但置信度高或正确但置信度低的情况。

摄影:Benjamin Vang在Unsplash |摄影:Xennie Moore on Unsplash |摄影:Alvan Nee on Unsplash

        显然,第一张图片的标签不正确,而第二张图片同时包含哈士奇和柯基。所以有一些改进的余地。

        幸运的是,Fast.AI 提供了一个方便的小部件,可以帮助我们快速解决数据问题。可以在笔记本中对其进行初始化,然后可以更改数据集中的标签。ImageClassifierCleaner

cleaner = ImageClassifierCleaner(learn)
cleaner 

        在每个类别之后,您可以运行以下代码来解决问题:删除图像或将其移动到正确的文件夹。

for idx in cleaner.delete(): cleaner.fns[idx].unlink()
for idx,breed in cleaner.change(): shutil.move(str(cleaner.fns[idx]), path/breed)

现在我们可以再次训练我们的模型,并看到准确率有所提高:95.4% vs 94.5%。

正确识别的柯基犬的比例从88%增加到96%。明!

        改进模型的另一种方法是更改调整大小的方法。我们使用了挤压方法,但如您所见,它可以改变自然物体的比例。让我们尝试更具想象力并使用增强功能。

        增强是对图像的更改(例如,对比度改进、旋转或裁剪)。它将为我们的模型提供更多可变数据,并有望提高其质量。

        与 Fast.AI 一样,您只需更改几个参数即可添加增强功能。

照片由FLOUFFY在Unsplash上拍摄

        此外,由于使用增强模型在每个时期都会看到略有不同的图片,因此我们可以增加时期的数量。经过六个时期,我们达到了 95.65% 的准确率——结果要好一些。整个过程花了大约一个小时。

七、下载模型

        最后一步是下载我们的模型。这很简单。

learn.export('cuttest_dogs_model.pkl')

        然后,您将保存一个标准文件(用于存储对象的常见Python格式)。只需选择Kaggle笔记本右侧面板中的文件旁边,您就可以在计算机上获得模型。pickleMore actions

现在我们有了经过训练的模型,让我们部署它,以便您可以与世界共享结果。

八、部署模型

我们将使用HuggingFace Spaces和Gradio来构建我们的Web应用程序。

8.1 设置HuggingFace空间

        HuggingFace是一家为机器学习提供便捷工具的公司,例如,流行的转换器库或共享模型和数据集的工具。今天,我们将使用他们的空间来托管我们的应用程序。

        首先,如果您尚未注册,则需要创建一个帐户。只需几分钟。点击此链接。

        现在是时候创建一个新的空间了。前往“空间”选项卡,然后按“创建”按钮。您可以在文档中找到包含更多详细信息的说明。

        然后,您需要指定以下参数:

  • 名称(它将用于您的应用程序URL,因此请明智地选择),
  • 许可证(我选择了开源 Apache 2.0 许可证)
  • SDK(在本例中我将使用 Gradio)。

        Then user-friendly HuggingFace shows you instructions. TL;DR now you have a Git repository, and you need to commit your code there.

        Git 有一个细微差别。由于您的模型可能非常大,因此最好设置 Git LFS(大文件存储),然后 Git 不会跟踪此文件的所有更改。要进行安装,请按照站点上的说明进行操作。

-- cloning repo
git clone https://huggingface.co/spaces/<your_login>/<your_app_name>
cd <your_app_name>-- setting up git-lfs
git lfs install
git lfs track "*.pkl"
git add .gitattributes
git commit -m "update gitattributes to use lfs for pkl files"

8.2  Gradio 

          Gradio是一个框架,允许你只使用Python构建愉快和友好的Web应用程序。这就是为什么它是原型设计的宝贵工具(特别是对于像我这样没有深厚JavaScript知识的人来说)。

        在 Gradio 中,我们将定义我们的接口,指定以下参数:

  • 输入 — 图像,
  • 输出 — 具有五个可能类的标签,
  • 标题描述一组示例图像(我们还必须将它们提交到 repo),
  • enable_queue=True将帮助应用程序处理大量流量,如果它变得非常流行,
  • 要为输入图像执行的函数

        为了获取输入图像的标签,我们需要定义一个预测函数,该函数加载我们的模型并返回一个字典,其中包含每个类的概率。

        最后,我们将有以下代码app.py

import gradio as gr
from fastai.vision.all import *learn = load_learner('cuttest_dogs_model.pkl')labels = learn.dls.vocab # list of model classes
def predict(img):img = PILImage.create(img)pred,pred_idx,probs = learn.predict(img)return {labels[i]: float(probs[i]) for i in range(len(labels))}gr.Interface(fn=predict,inputs=gr.inputs.Image(shape=(512, 512)),outputs=gr.outputs.Label(num_top_classes=5),title="The Cuttest Dogs Classifier 🐶🐕🦮🐕‍🦺",description="Classifier trainded on images of huskies, retrievers, pomeranians, corgis and samoyeds. Created as a demo for Deep Learning app using HuggingFace Spaces & Gradio.",examples=['husky.jpg', 'retriever.jpg', 'corgi.jpg', 'pomeranian.jpg', 'samoyed.jpg'],enable_queue=True).launch()

        如果您想了解有关 Gradio 的更多信息,请阅读文档。

        让我们也创建文件,然后这个库将安装在我们的服务器上。requirements.txtfastai

        所以剩下的唯一一点就是将所有内容推送到 HuggingFace Git 存储库。

git add * 
git commit -am 'First version of Cuttest Dogs app'
git push

您可以在 GitHub 上找到完整的代码。

        推送文件后,返回 HuggingFace 空间,你会看到一张类似的图片,展示了构建过程。如果一切正常,您的应用将在几分钟内运行。

如果有任何问题,您将看到堆栈跟踪。然后,您将不得不返回到代码,修复错误,推送新版本,然后再等待几分钟。

8.3 开始启动

        现在我们可以使用这个模型和真实照片来验证我家的狗实际上是柯基犬。

九 后记

        今天,我们已经完成了构建深度学习应用程序的整个过程:从获取数据集和拟合模型到编写和部署 Web 应用程序。希望您能够完成本教程,现在您正在生产中测试您的出色模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/40136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能数据建模软件DTEmpower 2023R2新版本功能介绍

DTEmpower是由天洑软件自主研发的一款通用的智能数据建模软件&#xff0c;致力于帮助工程师及工科专业学生&#xff0c;利用工业领域中的仿真、试验、测量等各类数据进行挖掘分析&#xff0c;建立高质量的数据模型&#xff0c;实现快速设计评估、实时仿真预测、系统参数预警、设…

机器学习深度学习——自注意力和位置编码(数学推导+代码实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——注意力分数&#xff08;详细数学推导代码实现&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习…

Cat(2):下载与安装

1 github源码下载 要安装CAT&#xff0c;首先需要从github上下载最新版本的源码。 官方给出的建议如下&#xff1a; 注意cat的3.0代码分支更新都发布在master上&#xff0c;包括最新文档也都是这个分支注意文档请用最新master里面的代码文档作为标准&#xff0c;一些开源网站…

MySQL— 基础语法大全及操作演示!!!(上)

MySQL—— 基础语法大全及操作演示&#xff08;上&#xff09; 一、MySQL概述1.1 、数据库相关概念1.1.1 MySQL启动和停止 1.2 、MySQL 客户端连接1.3 、数据模型 二、SQL2.1、SQL通用语法2.2、SQL分类2.3、DDL2.3.1 DDL — 数据库操作2.3.1 DDL — 表操作 2.4、DML2.4.1 DML—…

等保案例 5

用户简介 四川省人民代表大会常务委员会&#xff0c;作为省人民代表大会地常设机关&#xff0c;随着政府部门信息化程度地提高&#xff0c;对信息系统地依赖程度越来越高&#xff0c;同时由于网络安全形势日益严峻、新型攻击层出不穷&#xff0c;单位信息化所面临地各种风险也…

途乐证券-宁德时代发力超充赛道,高压快充概念强势拉升,泰永长征涨停

高压快充概念17日盘中强势拉升&#xff0c;到发稿&#xff0c;泰永长征涨停&#xff0c;万祥科技涨超9%&#xff0c;英可瑞涨逾8%&#xff0c;迦南智能涨超4%。 消息面上&#xff0c;8月16日&#xff0c;宁德时代举行线下新品发布会&#xff0c;正式发布全球首款磷酸铁锂4C超充…

Spark第二课RDD的详解

1.前言 RDD JAVA中的IO 1.小知识点穿插 1. 装饰者设计模式 装饰者设计模式:本身功能不变,扩展功能. 举例&#xff1a; 数据流的读取 一层一层的包装&#xff0c;进而将功能进行进一步的扩展 2.sleep和wait的区别 本质区别是字体不一样,sleep斜体,wait正常 斜体是静态方法…

经过几天的乱搞,已经搞出来第一次stm32点灯程序

看吧那个灯泡已经亮了 stm32跟51不同的地方是这里引脚一组16个&#xff0c;如PA0,PA1,PA2,,,,,,PA15 51一组8个 例如P00,P01,P02,,,,P07

[Go版]算法通关村第十一关青铜——理解位运算的规则

目录 数字在计算机中的表示&#xff1a;机器数、真值对机器数进一步细化&#xff1a;原码、反码、补码为何会有原码、反码和补码为何计算机中的按位运算使用的是补码&#xff1f;位运算规则与、或、异或和取反移位运算移位运算与乘除法的关系位运算常用技巧⭐️ 操作某个位的数…

Unity用NPOI创建Exect表,保存数据,和修改删除数据。以及打包后的坑——无法打开新创建的Exect表

先说坑花了一下午才找到解决方法解决&#xff0c; 在Unity编辑模式下点击物体创建对应的表&#xff0c;获取物体名字与在InputText填写的注释数据。然后保存。创建Exect表可以打开&#xff0c;打包PC后&#xff0c;点击物体创建的表&#xff0c;打不开文件破损 解决方法&#…

大数据培训前景怎么样?企业需求量大吗

大数据行业对大家来说并不陌生&#xff0c;大数据行业市场人才需求量大&#xff0c;越早入行越有优势&#xff0c;发展机会和上升空间等大。不少人通过大数据培训来提升自己的经验和自身技术能力&#xff0c;以此来获得更好的就业机会。 2023大数据培训就业前景怎么样呢?企业需…

从视觉装备到智能驾驶,天准科技能否打造第二增长极?

智能网联汽车已经成为了上市公司跨界布局的热门赛道。 天准科技是工业视觉智能装备领域的龙头企业&#xff0c;主要客户包括苹果、三星等企业。招股说明书显示&#xff0c;2016年至2018年&#xff0c;天准科技来源于苹果公司及其供应商的收入合计占比达到49.98%、67.99%及76.0…

JVS开源基础框架:平台基本信息介绍

JVS是面向软件开发团队可以快速实现应用的基础开发脚手架&#xff0c;主要定位于企业信息化通用底座&#xff0c;采用微服务分布式框架&#xff0c;提供丰富的基础功能&#xff0c;集成众多业务引擎&#xff0c;它灵活性强&#xff0c;界面化配置对开发者友好&#xff0c;底层容…

互联网账号被封禁解决办法,以qq为例

百度搜索&#xff1a;互联网信息服务投诉平台 电脑端浏览器&#xff1a;打开 ts.isc.org.cn 推荐使用360极速浏览器 谷歌浏览器 提交完成后&#xff0c;将投诉码保存&#xff0c;可以在“查询评价”处用投诉码查询进度

windows安装go,以及配置工作区,配置vscode开发环境

下载安装go 我安装在D:\go路径下配置环境变量 添加GOROOT value为D:\go修改path 添加%GOROOT%\bin添加GOPATH value为%USERPROFILE%\go 其中GOPATH 是我们自己开发的工作区&#xff0c;其中包含三个folder bin,pkg,以及src&#xff0c;其中src为我们编写代码的位置 配置vscod…

uniapp 使用 uni push 2.0 推送消息

因为之前使用uni push 1.0&#xff0c;开通账号和配置厂商就不写了。只说一点&#xff0c;配置厂商很重要&#xff0c;不然收不到离线推送的消息。那么就直接开始咯&#xff01;&#xff01;&#xff01; 一、创建并关联云服务空间 1.创建云服务空间&#xff0c;右键项目【创…

Java进阶(3)——手动实现ArrayList 源码的初步理解分析 数组插入数据和删除数据的问题

目录 引出手动实现ArrayList定义接口MyList<T>写ArrayList的实现类增加元素删除元素 写测试类进行测试数组插入数据? 总结 引出 1.ArrayList的结构分析&#xff0c;可迭代接口&#xff0c;是List的实现&#xff1b; 2.数组增加元素和删除元素的分析&#xff0c;何时扩容…

利用HTTP代理实现请求路由

嘿&#xff0c;大家好&#xff01;作为一名专业的爬虫程序员&#xff0c;我知道构建一个高效的分布式爬虫系统是一个相当复杂的任务。在这个过程中&#xff0c;实现请求的路由是非常关键的。今天&#xff0c;我将和大家分享一些关于如何利用HTTP代理实现请求路由的实用技巧&…

数据结构----哈夫曼树

这里写目录标题 基本概念引子基本概念各种路径长度各种带权路径长度结点的带权路径长度树的带权路径长度哈夫曼树 哈夫曼树的构造理论基础构造思想总结 哈夫曼树的实现哈夫曼编码前缀编码哈夫曼编码的思想案例代码实现 编码与解码 基本概念 引子 哈夫曼树就是寻找构造最优二叉…

Docker容器基础

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Docker概述1、docker是什么2、Docker的设计宗旨3、容器在内核中支持2种重要技术&#xff1a; 三、Docker的核心概念四、Docker相关命令1.安装依赖包2.设置阿里云…