TowardsDataScience-博客中文翻译-2019-五十六-

龙哥盟 / 2024-10-14 / 原文

TowardsDataScience 博客中文翻译 2019(五十六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

AI/ML 项目中面向研究的代码

原文:https://towardsdatascience.com/research-oriented-code-in-ai-ml-projects-f0dde4f9e1ac?source=collection_archive---------26-----------------------

Photo by Vitaly Taranov on Unsplash

面向研究的代码概念化,以弥合数据科学和工程之间的差距

最近,web 应用工程师比以前有更多的机会与数据科学家或研究人员一起工作。同时,他们还经常面对由数据科学家或研究人员编写的面向研究的代码。代码往往是为涉及人工智能(AI)或机器学习(ML)的产品编写的。这篇文章可能会帮助初级/中级工程师或数据科学家理解为 AI/ML 产品编写的代码。

什么是面向研究的代码?

面向研究的代码是主要由研究人员或科学家编写的代码,它指的是分析脚本和/或原型代码。是基于科研范式写的。可以通过以下三个迭代过程来开发产品:1)编写分析脚本2)基于分析脚本开发原型,以及 3)将原型转化为应用产品。(如图 1 所示)

Figure 1 created by Jesse Tetsuya

数据科学家和研究人员往往在数学和算法建模方面有很强的背景。他们可以利用自己的技能来帮助开发工作,比如编写分析脚本和开发原型。在许多与 AI/ML 相关的项目中,他们可能会频繁地编写原型级别的分析脚本和代码。

虽然一些数据科学家和研究人员拥有工程技能,但生产级代码主要由 web 应用工程师编写。 Web 应用工程师有责任提高产品代码本身的质量,并使代码在服务器上运行。例如,为了将科学家或研究人员编写的代码与 API 等系统集成,web 应用工程师需要对其进行重构。

AI/ML 项目中的分析脚本是如何编写的?

为了缩小分析脚本的含义,弄清楚在业务情况下编写分析脚本的过程可能更有益。这是因为分析脚本在学术界和商业中使用,这可能会极大地影响对分析脚本的理解。

编写分析脚本是学术界研究过程的一部分。如图 2 所示,传统研究倾向于演绎和功能主义性质的。写分析脚本是为了找出新的知识并把它写在论文上。需要严格和准确的证据来支持新知识的存在和论文中的论点,无论它在商业上如何有益。除了涉及商业的情况,研究人员可能不需要考虑学术会议或期刊的严格资源规划和预计交付日期。

Figure 2 created by Jesse Tetsuya

在商业环境中的实际工作中,特别是关于 AI/ML 项目的工作中,分析脚本本身可以是原型和产品的基础。通过查看原型的演示,决策者需要在其他公司开始相同的业务之前判断它在业务上是否有益。因此,需要分析脚本的快速迭代输出,它也可以是原型。下面的流程适用于归纳、迭代和有机的情况。

Figure 3 created by Jesse Tetsuya

上面图 3 中黄色方框的循环将在下面详细讨论。

研究方法

  • 在研究中,有两种分析方法; 1) 定性分析如观察和非结构化访谈,它使用基于不可量化信息的主观判断,以及 2) 定量分析,它试图通过使用数学和统计建模、测量和研究来理解行为。
  • 在 AI/ML 项目中,选择第二种方式,项目的利益相关者需要选择分析方法,如回归、分类或神经网络。还有,什么分析工具 (python,R,SPSS,等等。)他们应该用意志来决定。

数据收集

  • 首先,需要从数据库等中收集二级数据,如日志数据。在他们开始收集数据之前,涉众判断哪些数据能够恰当地代表他们想要知道的。在学术界的研究中,数据库或数据本身有时在校园或实验室之外。
  • 另一方面,大多数 IT 公司倾向于将数据存储在他们自己的数据库中。这可以使项目更容易在数据收集、数据分析和研究方法决策之间来回切换。

数据分析

  • 在学术界和商界,收集的数据是经过预处理的。预处理的方式取决于分析方法和工具。编码人员将经过预处理的数据输入到分析模型中,并验证输出是否适合了解他们想要了解的内容。

原型的类型

原型可以分为两组可见的如客户端应用程序和 web 应用程序和不可见的如 API 或统计/数学模型。(如图 4 所示)在 AI/ML 项目中,后者可以是通过上述编写分析脚本的周期开发的原型。

Figure 4 created by Jesse Tetsuya

评估面向研究的代码的五种方法

最后一节描述了哪些评估指标对于修复和编写实际的编程代码是有用的。理解这些指标可以帮助编码人员更好地进行编写分析脚本的迭代循环。

面向研究的代码可以通过使用由 Zina O'Leary 撰写的做你的研究项目的基本指南中建议的科学研究指标来评估。这是因为它基于上一节所述的科学研究范式。这五个指标可以应用到 AI/ML 项目中编写面向研究的代码的实际过程中。

1)客观性

客观性意味着研究者和被研究对象之间的距离,并表明这种关系是由协议、理论和方法调节的。该标准的存在是为了防止个人偏见“污染”结果。主观性是否得到承认和管理?

情况:在对数据进行预处理时,程序员或研究人员需要决定对分析不重要的数据,并删除它们,如离群值。让第三个人查看数据可能会提供有价值的见解,并且是避免个人偏见的有效方法。拥有一个稳定的环境来快速地在数据分析、数据收集和研究方法选择之间来回切换可能是解决方案之一。

2)有效性

有效性的前提是假设所研究的内容可以被测量或捕捉,并试图确认测量和捕捉的“数据”的真实性和准确性,以及从数据中得出的任何发现或结论的真实性和准确性。说明你得出的结论是可信的。是否捕捉到了‘真本质’?

情况:当时分析算法没有输出准确的结果或者学习模型没有很好地工作。这些都是通过使用精度等机器学习度量标准来防止的。

3)可靠性

可靠性的前提是这样一个概念,即在被测量的东西中有某种统一或标准化的感觉,并且方法需要一致地捕捉正在探索的东西。因此,可靠性是指一项措施、程序或仪器在重复试验中提供相同结果的程度。方法是否一致?

情况:如果预处理代码输出不一致的结果,则不可靠。例如,如果预处理过程、数据输入流程和参数检查都在代码中定义,则可靠性取决于该代码的质量

4)概化

概化是指样本的发现直接适用于更大的人群。虽然来自样本的发现可能与总体的发现不同,但被认为是可概括的发现显示了具有代表性的统计概率。研究结果是否适用于直接参照系之外?

情况:除了极端情况,输入数据的大小和数据类型会极大地影响算法的输出。概化由输入数据的数量和属性控制。算法的弱概括能力会导致数据的过拟合或数据泄漏。这些可以通过交叉验证、正则化和查看学习曲线来进行参数调整。

5)再现性

再现性与可信度问题直接相关,表明研究过程可以被复制以验证研究结果。换句话说,如果在相同/相似背景下的不同研究中使用相同的方法,结论将得到支持。研究可以验证吗?

情况:编程代码根据不同的运行环境或服务器输出不同的结果,代码不可靠。基础设施的配置可能有一些问题,或者操作环境或服务器可能不适合使代码很好地工作。

简而言之, 1)客观性5)再现性似乎是与分析脚本本身相关的指标。另一方面, 2)效度3)信度4)概化与分析算法直接相关。使用内置于 scikit-learn 中的机器学习指标对于测量机器学习算法本身可能是有用的。

“面向研究的代码”是一个有用的词,可以将问题分成小块,从工程师或研究人员的角度来看待它们。工程师和研究人员的技能似乎有点重叠,所以有时他们的工作职责在 AI/ML 项目中似乎是模糊的。特别是,经验不足的工程师/数据科学家可能会比资深工程师对他们自己在 AI/ML 项目中的实际任务感到更加模糊。这也是我将 AI/ML 项目中面向研究的代码概念化并详细描述的原因。

参考

Bhattacherjee,a .,南佛罗里达大学,学者共享和开放教科书图书馆,(2012 年)。社会科学研究:原则、方法和实践,可在:【https://open.umn.edu/opentextbooks/BookDetail.aspx? 查阅 bookId=79 。**

奥利里,z .(2014 年)。做研究项目的基本指南第二版。,洛杉矶:鼠尾草。**

来自www.flaticon.com的桉树制作的图标(图 4 中的大脑图标、web 应用图标/图 1 和图 4 中的原型图标和生产代码图标/图 1 中的面向研究的代码图标/图 3 中的问题图标)

来自www.flaticon.com的原符号制作的图标(图 4 中的 API 应用图标)

来自www.flaticon.com的 Freepik 制作的图标(图 4 中的睁开的眼睛图标、闭上的眼睛图标和客户端应用程序图标/图 1 和图 3 中的分析脚本图标)

🐳从研究到生产:集装箱化的培训工作

原文:https://towardsdatascience.com/research-to-production-containerized-training-jobs-e63d4efd56e1?source=collection_archive---------25-----------------------

这篇文章演示了如何使用 Docker 将训练代码容器化,并将适合的模型部署为 web 应用程序。虽然它在一定程度上建立在我之前的帖子上🤖 用于情绪分析的变压器微调,记住这里描述的方法是通用的;它可以作为机器学习实践者的标准解决方案来封装他们的研究代码,并促进可重复性。

为什么使用 Docker?为什么要在集装箱里训练?

Figure 1: Docker containers share the host OS kernel and do not require virtualized hardware, resulting in smaller footprint.

本质上,容器是轻量级的简洁胶囊,包含使用共享操作系统的应用程序,而不是需要模拟虚拟硬件的虚拟机。Docker 使我们能够轻松地将应用打包成小型、便携、自给自足的容器,几乎可以在任何地方运行。容器是进程,虚拟机是服务器(更多)。

以容器化的方式训练机器学习(ML)模型并不是一种常见的做法。大多数人倾向于使用简单的 Python 脚本和 requirement.txt 文件。然而,我认为,一般来说,在生产中的 ML 模型的整个生命周期中,容器化训练代码可以为我们节省大量的时间和麻烦。

Figure 2: Containerized training comes handy once our monitored metrics show model performance deterioration. Source: https://towardsdatascience.com/flask-and-heroku-for-online-machine-learning-deployment-425beb54a274

比方说,我们有一个根据我们收集的用户数据训练的生产模型。但是,随着时间的推移,用户行为会发生变化,这可能会导致数据分布发生显著的变化。
因此,随着生产模型的老化,它的质量会下降,很可能做出不再有用甚至更糟的预测,对我们的业务有潜在的危害。运行训练作业允许我们毫不费力地根据新的数据分布重新训练我们的模型。进一步来说,容器化有助于定期运行作业——或者在监控指标的性能下降时——自动测试和部署作业,确保预测一致,让我们的用户满意。

另一种情况是,我们的基础设施中有多台服务器用于计算,可能使用不同的 Linux 发行版、CUDA 工具包、Python 版本、库等等。可以说,我们无法预测每一个场景,我们心爱的训练脚本很可能会在某些环境中崩溃。在这种情况下,拥有 Docker 化的作业确实可以节省我们的时间和精力,因为只要安装了 Docker,它就可以在任何环境中运行。

或者,你可以把一个容器化的培训工作想象成一个给定任务的封装解决方案。比方说,我们的任务是对员工报告进行分类。在原型开发上投入了几个月后,我们希望以某种方式坚持我们的解决方案,因为结果可能必须在以后重现,或者模型可能在将来应用于类似的问题。

注意,当然,在容器内执行代码仍然需要主机有足够的硬件(计算和内存)和驱动程序(例如,支持 CUDA 工具包的 Nvidia 驱动程序等等)。

集装箱化

到目前为止,我们已经有了一些输出经过测试的、健壮的 ML 模型的训练代码,我们现在希望以某种方式保持它(或 productionalize )并可能作为服务部署。

此外,假设模型的测试性能符合我们的预期,我们结束研究阶段。对于这个演示,我将采用我以前的帖子 情感分析的变压器微调 中的培训程序。然而,请注意,以下部分完全与底层 ML 模型无关,是所有类型模型拟合任务的通用方法。

出于上述原因,我们决定将整个微调代码封装到一个自包含的 Docker 容器中。🐳

结构

在下文中,我们假设对接器安装在主机上。让我们简单地将这个 docker 作业模板克隆到我们选择的目录中:

git clone [https://github.com/ben0it8/docker-job-template](https://github.com/ben0it8/docker-job-template)
mv docker-job-template docker-transformer-finetuning

我们的项目包含两个主要文件夹:researchproduction。前者是研究代码所在的地方,从实验性的 Jupyter 笔记本到端到端的完善的培训脚本,任何东西都放在这里(在我们的例子中是一个笔记本)。production包含训练工作。所有从研究阶段提炼出来的需要微调的代码都作为一个单独的utils.py模块,和包含我们的依赖关系的requirements.txt一起送到docker-res。最终,训练逻辑在docker-res/run.py中定义,web 应用在docker-res/app.py中定义。

Web 应用程序

使用令人惊叹的 FastAPI 框架,组装一个可以作为服务执行推理的玩具 web 应用程序非常简单。FastAPI 是高性能,简单易学,编码速度快,随时可以投入生产。它建立在 OpenAPI 和 JSON Schema 等开放标准之上,使用 Pydantic 的类型声明,并附带自动 API 文档。

首先,脚本加载我们之前保存的文件metadata.bin(包含配置和 int-to-label 映射)和model_weights.pth(最终参数)以及用于微调的tokenizer。然后我们初始化我们的应用程序,并定义一个调用函数inference的 POST 端点/inference。这个函数有一个参数,一个Input(这个类定义了我们的请求数据模型)并使用predict函数返回一个预测字典和它们相应的概率。

Figure 6: Simple web app for inference, implemented using FastAPI.

通过uvicorn app:app --host 0.0.0.0 --port 8000执行这个脚本启动一个可以从浏览器访问和测试的本地服务器,并返回任意输入文本的预测情感。

Dockerfile 文件

Dockerfile 本质上是Docker 建立我们形象所需的所有指令的“配方”。为了简洁起见,我将在我们的Dockerfile中强调一些关键部分,更多信息参见原始参考。

我们没有从头开始构建容器,而是从nvidia/cuda:10.0-cud nn7-devel-Ubuntu 16.04映像中派生出来,因为我们希望使用 Nvidia 容器运行时进行 GPU 加速(更多信息请点击):

在这之后,一堆包,tini 和 Miniconda 被下载和设置。然后我们安装一些 Python 基础并将 conda 添加到$PATH:

接下来,我们安装培训和应用程序要求:

通过在运行作业时将环境变量传递给容器,可以很容易地配置作业,从而对训练过程提供一些控制。这些变量的默认值也在 docker 文件中定义:

这些变量是不言自明的,除了几个:

  • NVIDIA_VISIBLE_DEVICES:控制容器内哪些 GPU 可以访问(仅限 GPU)
  • OMP_NUM_THREADS:设置 PyTorch 用于 MKL 加速的线程数量,通常不应超过我们机器中物理 CPU 内核的数量(仅当我们没有 GPU 时相关)
  • TRAIN_BODY:控制是否训练变压器本体的参数(当然分类器反正是要训练的)

注意,我们的模型通常很大,但是我们希望我们的容器在不知道主机可用资源的情况下运行。因此,为了便于演示,我们将使用一个只有 8 的BATCH_SIZE。这个批量大小有望适合大多数硬件的内存,不管是在 GPU 还是 CPU 上训练(因为较大的批量导致更快的训练,如果有足够的内存可用,可以随意增加它)。

最后,我们将 Python 文件复制到RESOURCES_PATH,并告诉 Docker 在映像加载后使用 tini 执行run.py:

建设

build.py 管理我们的 Docker 构建、部署(例如部署到 Docker 注册表)和版本控制。该命令构建一个名为 finetuning-job 的映像,默认情况下将其标记为“最新”:

python build.py --name finetuning-job

更多信息见python build.py --helptraining-job/README.md

奔跑

Docker 容器是运行在主机上的独立进程,具有自己的文件系统、网络和进程树。尽管在运行时有很多选项来配置容器,我将只强调与我们相关的选项。
一旦构建了映像,我们就可以运行容器,可选地通过标志-e覆盖 Dockerfile 中定义的某些环境变量,或者通过--env-file=config.env传递 env-file:

# pass env variables to parametrize training
docker run -e LR=0.001 -e N_EPOCHS=2 finetuning-job# or by using an env-file:
docker run --env-file=config.env finetuning-job

如果我们可以访问 GPU,我们当然应该使用 Nvidia 容器运行时来运行容器:

docker run --runtime=nvidia finetuning-job

为了访问运行在容器内部的 web 应用程序,我们必须用-p标志向外界公开它的一个端口:

docker run -p 8000:8000 finetuning-job

推理

当容器运行时,它将执行run.py,首先微调我们的分类器,然后使用 uvicorn 在 http://0.0.0.0:8000 本地部署它。让我们通过发送 json 格式的 POST 请求来测试服务:

将浏览器指向http://localhost:8000/docs,查看自动生成的 API 文档。

使用 Ctrl+C 停止正在运行的容器,或者在终端中键入docker ps列出正在运行的容器,键入docker stop [id]杀死一个容器,其中[id]是容器 ID 的前 4 位数字:

🎉演示到此结束——我们已经完成了一个简单的容器化培训工作,允许我们微调一个强大的情感分析转换器,它能够在任何环境中重现我们的结果,并将模型部署为 web 服务。我希望一些 ML 从业者会发现这篇文章对将研究代码转化为产品有用!

🔮集装箱变压器微调的代码可以在我的 g ithub 上找到🌈本帖基于 SAP 在柏林
✉️所做的工作。如果您有任何问题/意见,请在下面留下评论,或者通过
Twitter联系我!

用 Python 重塑 numpy 数组——一步到位的图示教程

原文:https://towardsdatascience.com/reshaping-numpy-arrays-in-python-a-step-by-step-pictorial-tutorial-aed5f471cf0b?source=collection_archive---------1-----------------------

numpy 整形和堆叠的备忘单和教程

可视化 numpy 如何重塑多维数组

Cheatsheet for Python numpy reshape, stack, and flatten (created by Hause Lin and available here)

numpy reshape() 方法如何重塑数组?你是否感到困惑,或者在理解它是如何工作的过程中挣扎过?本教程将带你完成 numpy 中的整形。如果您想要上述备忘单的 pdf 副本,您可以在此下载。

你可能也会喜欢我的重塑熊猫数据帧的教程:

[## 用 Python 中的 pivot_table 重塑熊猫数据框—教程和可视化

使用 pd.pivot_table 将 long 转换为 wide

towardsdatascience.com](/reshape-pandas-dataframe-with-pivot-table-in-python-tutorial-and-visualization-2248c2012a31) [## 使用 Python 中的 melt 重塑熊猫数据框—教程和可视化

想象一下 pd.melt 是如何将熊猫数据帧从宽到长进行整形的

towardsdatascience.com](/reshape-pandas-dataframe-with-melt-in-python-tutorial-and-visualization-29ec1450bb02)

创建一个 Python numpy 数组

使用np.arange()生成一个 numpy 数组,其中包含一系列从 1 到 12 的数字。在这里看文档。

import numpy as npa1 = np.arange(1, 13)  # numbers 1 to 12print(a1.shape)
> (12,)print(a1)
> [ 1  2  3  4  5  6  7  8  9 10 11 12]

np.arange() creates a range of numbers

整形()方法整形

使用reshape()方法将我们的 a1 数组改造成一个 3 乘 4 维的数组。我们用 3_4 来指代 it 维度:3 是第 0 个维度(轴),4 是第 1 个维度(轴)(注意 Python 索引从 0 开始)。在这里见文档。

a1_2d = a1.reshape(3, 4)  # 3_4print(a1_2d.shape)
> (3, 4)print(a1_2d)
> [[ 1  2  3  4]
   [ 5  6  7  8]
   [ 9 10 11 12]]

3 by 4 numpy array

如果你想让 numpy 自动决定一个特定尺寸的大小/长度,将该尺寸指定为-1。

a1.reshape(3, 4)
a1.reshape(-1, 4)  # same as above: a1.reshape(3, 4)a1.reshape(3, 4)
a1.reshape(3, -1)  # same as above: a1.reshape(3, 4)a1.reshape(2, 6)
a1.reshape(2, -1)  # same as above: a1.reshape(2, 6)

沿不同维度重塑

默认情况下,reshape()沿着第 0 维(行)对数组进行整形。此行为可通过order参数(默认值为'C')进行更改。更多信息参见文档。

a1.reshape(3, 4) # reshapes or ‘fills in’ row by row
a1.reshape(3, 4, order='C') # same results as above

我们可以通过将order改为'F'来沿着第一维(列)进行整形。对于熟悉 MATLAB 的人来说,MATLAB 使用的是这个顺序。

a1.reshape(3, 4, order='F')  # reshapes column by column
> [[ 1  4  7 10]
   [ 2  5  8 11]
   [ 3  6  9 12]]

3 by 4 numpy array

测试:数组 a1 的尺寸/形状是多少?

a1 是一个 1D 数组——它只有一维,尽管你可能认为它的维数应该是 1_12 (1 行乘 12 列)。要转换成 1_12 数组,请使用reshape()

print(a1)  # what's the shape?
> [ 1  2  3  4  5  6  7  8  9 10 11 12]print(a1.shape)
> (12,)a1_1_by_12 = a1.reshape(1, -1)  # reshape to 1_12print(a1_1_by_12)  # note the double square brackets!
> [[ 1  2  3  4  5  6  7  8  9 10 11 12]]print(a1_1_by_12.shape)  # 1_12 array
> (1, 12)

用 ravel()将 1D 数组展平/散开

ravel()方法允许你将多维数组转换成 1D 数组(参见文档这里的)。我们的 2D 数组( 3_4 )将被拉平或散开,从而成为一个 12 元素的 1D 数组。

如果你不指定任何参数,ravel()将沿着行(第 0 维/轴)拉平/散开我们的 2D 数组。即第 0 行[1,2,3,4] +第 1 行[5,6,7,8] +第 2 行[9,10,11,12]。

如果您想沿列(第一维)拉平/散开,使用order参数。

print(a1_2d)  # 3_4
> [[ 1  2  3  4]
   [ 5  6  7  8]
   [ 9 10 11 12]]print(a1_2d.ravel())  # ravel by row (default order='C')
> [ 1  2  3  4  5  6  7  8  9 10 11 12]print(a1_2d.ravel(order='F'))  # ravel by column
> [ 1  5  9  2  6 10  3  7 11  4  8 12]

np.stack()np.hstack()连接/堆叠阵列

Stacking numpy arrays

创建两个 1D 阵列

a1 = np.arange(1, 13)
print(a1)
> [ 1  2  3  4  5  6  7  8  9 10 11 12]a2 = np.arange(13, 25)
print(a2)> [13 14 15 16 17 18 19 20 21 22 23 24]

使用np.stack()连接/堆叠数组。默认情况下,np.stack()沿着第 0 维(行)堆叠数组(参数axis=0)。更多信息参见文档。

stack0 = np.stack((a1, a1, a2, a2))  # default stack along 0th axis
print(stack0.shape)
> (4, 12)print(stack0)
> [[ 1  2  3  4  5  6  7  8  9 10 11 12]
   [ 1  2  3  4  5  6  7  8  9 10 11 12]
   [13 14 15 16 17 18 19 20 21 22 23 24]
   [13 14 15 16 17 18 19 20 21 22 23 24]]

沿第一维堆叠(axis=1)

stack1 = np.stack((a1, a1, a2, a2), axis=1)
print(stack1.shape)
> (12, 4)print(stack1)
> [[ 1  1 13 13]
   [ 2  2 14 14]
   [ 3  3 15 15]
   [ 4  4 16 16]
   [ 5  5 17 17]
   [ 6  6 18 18]
   [ 7  7 19 19]
   [ 8  8 20 20]
   [ 9  9 21 21]
   [10 10 22 22]
   [11 11 23 23]
   [12 12 24 24]]

np.hstack()连接成一个长 1D 数组(水平堆叠)

stack_long = np.hstack((a1, a2))
print(stack_long.shape)
> (24,)print(stack_long)
> [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]

创建多维数组(3D)

多维数组非常常见,被称为张量。它们在深度学习和神经网络中被大量使用。如果你对深度学习感兴趣,你会定期重塑张量或多维数组。

让我们首先创建两个不同的 3x 4 数组。稍后我们将把它们组合起来形成一个 3D 数组。

a1 = np.arange(1, 13).reshape(3, -1)  # 3_4
a2 = np.arange(13, 25).reshape(3, -1)  # 3_4print(a1)
> [[ 1  2  3  4]
   [ 5  6  7  8]
   [ 9 10 11 12]]print(a2)
> [[13 14 15 16]
   [17 18 19 20]
   [21 22 23 24]]

Two 3 by 4 numpy arrays

通过沿不同的轴/维度堆叠阵列来创建 3D 阵列

a3_0 = np.stack((a1, a2))  # default axis=0 (dimension 0)
a3_1 = np.stack((a1, a2), axis=1)  # along dimension 1
a3_2 = np.stack((a1, a2), axis=2)  # along dimension 2print(a3_0.shape)
> (2, 3, 4)
print(a3_1.shape)
> (3, 2, 4)
print(a3_2.shape)
> (3, 4, 2)

Create 3D numpy arrays from 2D numpy arrays

让我们打印数组,看看它们是什么样子的。可视化效果见上图。

print(a3_0)
> [[[ 1  2  3  4]
    [ 5  6  7  8]
    [ 9 10 11 12]]

   [[13 14 15 16]
    [17 18 19 20]
    [21 22 23 24]]]print(a3_1)
> [[[ 1  2  3  4]
    [13 14 15 16]]

   [[ 5  6  7  8]
    [17 18 19 20]]

   [[ 9 10 11 12]
    [21 22 23 24]]]print(a3_2)
> [[[ 1 13]
    [ 2 14]
    [ 3 15]
    [ 4 16]]

   [[ 5 17]
    [ 6 18]
    [ 7 19]
    [ 8 20]]

   [[ 9 21]
    [10 22]
    [11 23]
    [12 24]]]

因为这三个 3D 数组是通过沿着不同的维度堆叠两个数组而创建的,所以如果我们想要从这些 3D 数组中检索原始的两个数组,我们必须沿着正确的维度/轴进行子集化。

测试:我们如何从这些 3D 数组中检索出我们的a1数组?

print(a1)  # check what's a1
> [[ 1  2  3  4]
   [ 5  6  7  8]
   [ 9 10 11 12]]# solutions
a3_0[0, :, :]
a3_0[0]  # same as abovea3_1[:, 0, :]a3_2[:, :, 0]

展平多维数组

我们也可以用ravel()扁平化多维数组。下面,我们逐行(默认order='C')遍历 1D 数组。

Flatten arrays with .ravel()

print(a3_0)
> [[[ 1  2  3  4]
    [ 5  6  7  8]
    [ 9 10 11 12]]

   [[13 14 15 16]
    [17 18 19 20]
    [21 22 23 24]]]print(a3_0.ravel())
> [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]

逐列(order='F')移动到 1D 阵列

print(a3_0.ravel(order='F'))
> [ 1 13  5 17  9 21  2 14  6 18 10 22  3 15  7 19 11 23  4 16  8 20 12 24]

重塑多维数组

我们也可以用reshape()来重塑多维数组。

# reshape row by row (default order=C) to 2D arrayprint(a3_0)  # 2_3_4
> [[[ 1  2  3  4]
    [ 5  6  7  8]
    [ 9 10 11 12]]

   [[13 14 15 16]
    [17 18 19 20]
    [21 22 23 24]]]print(a3_0.reshape(4, -1))  # reshape to 4_6 (row by row)
> [[ 1  2  3  4  5  6]
   [ 7  8  9 10 11 12]
   [13 14 15 16 17 18]
   [19 20 21 22 23 24]]print(a3_0.reshape(4, -1, order='F'))  # reshape (column by column)
> [[ 1  9  6  3 11  8]
   [13 21 18 15 23 20]
   [ 5  2 10  7  4 12]
   [17 14 22 19 16 24]]print(a3_0.reshape(4, 2, 3))  # reshape to 4_2_3 (row by row)
> [[[ 1  2  3]
    [ 4  5  6]] [[ 7  8  9]
    [10 11 12]] [[13 14 15]
    [16 17 18]] [[19 20 21]
    [22 23 24]]]

结束语

我希望现在你对 numpy 如何重塑多维数组有了更好的理解。期待大家的想法和评论。另外,看看这个对 numpy 和数据表示的可视化介绍。

如果您想要上述备忘单的 pdf 副本,您可以在此下载。如果你觉得这篇文章有用,请关注我并访问我的网站获取更多数据科学教程。

如果您对提高数据科学技能感兴趣,以下文章可能会有所帮助:

[## 在 Python 中更有效地循环的两种简单方法

使用枚举和压缩编写更好的 Python 循环

towardsdatascience.com](/two-simple-ways-to-loop-more-effectively-in-python-886526008a70) [## 使用终端多路复用器 tmux 提高编码和开发效率

简单的 tmux 命令来提高您的生产力

medium.com](https://medium.com/better-programming/code-and-develop-more-productively-with-terminal-multiplexer-tmux-eeac8763d273) [## 新冠肺炎危机期间的免费在线数据科学课程

像 Udacity、Codecademy 和 Dataquest 这样的平台现在免费提供课程

towardsdatascience.com](/free-online-data-science-courses-during-covid-19-crisis-764720084a2)

更多帖子, 订阅我的邮件列表

剩余网络:在 Pytorch 中实现 ResNet

原文:https://towardsdatascience.com/residual-network-implementing-resnet-a7da63c7b278?source=collection_archive---------1-----------------------

Image by the Author

我在LinkedIn,快来打个招呼 👋

今天我们将在 Pytorch 中实现何等人(微软研究院)著名的 ResNet。它在 ILSVRC 2015 分类任务中获得第一名。

ResNet 及其所有变种已经在我的库中实现 眼镜

代码是这里,这篇文章的互动版可以在这里下载原文可以从这里阅读(很容易理解)附加材料可以在这个 quora 答案中找到

介绍

这不是一篇技术文章,我也没有聪明到比原作者更好地解释剩余连接。因此我们将仅限于快速概述。

越深的神经网络越难训练。为什么?深层网络的一个大问题是消失梯度问题。基本上是越深越难练。

为了解决这个问题,作者建议使用对前一层的引用来计算给定层的输出。在 ResNet 中,上一层的输出(称为残差)被添加到当前层的输出中。下图显示了这一操作

我们将使用大多数数据科学家都不知道的东西:面向对象编程,使我们的实现尽可能具有可伸缩性

基本块

好的,首先要考虑我们需要什么。首先,我们必须有一个卷积层,因为 PyTorch 在 Conv2d 中没有“自动”填充,我们必须自己编码!

Conv2dAuto(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

接下来,我们使用ModuleDict创建一个具有不同激活功能的字典,这在以后会很方便。

如果你对ModuleDict不熟悉,我建议阅读我以前的文章 Pytorch:如何以及何时使用模块、顺序、模块列表和模块指令

残余块

创建干净的代码必须考虑应用程序的主要构件,或者在我们的例子中是网络的主要构件。残差块采用带有in_channels的输入,应用卷积层的一些块将其减少到out_channels,并将其加起来作为原始输入。如果它们的大小不匹配,那么输入进入identity。我们可以抽象这个过程,并创建一个可扩展的接口。

ResidualBlock(
  (blocks): Identity()
  (activate): ReLU(inplace)
  (shortcut): Identity()
)

让我们用一个 1 的虚拟向量来测试它,我们应该得到一个 2 的向量

tensor([[[[2.]]]])

在 ResNet 中,每个块都有一个扩展参数,以便在需要时增加out_channels。同样,身份被定义为一个卷积,后跟一个 BatchNorm 层,这被称为shortcut。然后,我们可以扩展ResidualBlock并定义shortcut函数。

ResNetResidualBlock(
  (blocks): Identity()
  (activate): ReLU(inplace)
  (shortcut): Sequential(
    (0): Conv2d(32, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
    (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  )
)

基本块

一个基本的 ResNet 块由两层3x3 conv/batchnorm/relu 组成。图中,线条代表剩余运算。虚线表示应用了快捷方式来匹配输入和输出维度。

Basic ResNet Block

让我们首先创建一个方便的函数来堆叠一个 conv 和 batchnorm 层

ResNetBasicBlock(
  (blocks): Sequential(
    (0): Sequential(
      (0): Conv2dAuto(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    )
    (1): ReLU(inplace)
    (2): Sequential(
      (0): Conv2dAuto(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    )
  )
  (activate): ReLU(inplace)
  (shortcut): Sequential(
    (0): Conv2d(32, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
    (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  )
)

瓶颈

为了增加网络深度,同时保持参数大小尽可能低,作者定义了一个瓶颈块,即“三层是 1x1、3x3 和 1x1 卷积,其中 1×1 层负责减少然后增加(恢复)维度,而 3×3 层是具有较小输入/输出维度的瓶颈。”我们可以扩展ResNetResidualBlock并创建这些块。

ResNetBottleNeckBlock(
  (blocks): Sequential(
    (0): Sequential(
      (0): Conv2dAuto(32, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    )
    (1): ReLU(inplace)
    (2): Sequential(
      (0): Conv2dAuto(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    )
    (3): ReLU(inplace)
    (4): Sequential(
      (0): Conv2dAuto(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    )
  )
  (activate): ReLU(inplace)
  (shortcut): Sequential(
    (0): Conv2d(32, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
    (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  )
)

ResNet 的层由一个接一个堆叠的相同块组成。

ResNet Layer

我们可以通过一个接一个地粘贴n块来轻松定义它,只需记住第一个卷积块的步长为 2,因为“我们通过步长为 2 的卷积层直接执行下采样”。

torch.Size([1, 128, 24, 24])

编码器

类似地,编码器由特征尺寸逐渐增加的多层组成。

ResNet Encoder

解码器

解码器是我们创建完整网络所需的最后一块。它是一个完全连接的层,将网络学习到的特征映射到它们各自的类。很容易,我们可以将其定义为:

雷斯内特

最后,我们可以将所有的部分放在一起,创建最终的模型。

ResNet34

我们现在可以定义作者提出的五个模型,resnet18,34,50,101,152

让我们用火炬概要来测试这个模型

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 112, 112]           9,408
       BatchNorm2d-2         [-1, 64, 112, 112]             128
              ReLU-3         [-1, 64, 112, 112]               0
         MaxPool2d-4           [-1, 64, 56, 56]               0
        Conv2dAuto-5           [-1, 64, 56, 56]          36,864
       BatchNorm2d-6           [-1, 64, 56, 56]             128
              ReLU-7           [-1, 64, 56, 56]               0
        Conv2dAuto-8           [-1, 64, 56, 56]          36,864
       BatchNorm2d-9           [-1, 64, 56, 56]             128
             ReLU-10           [-1, 64, 56, 56]               0
 ResNetBasicBlock-11           [-1, 64, 56, 56]               0
       Conv2dAuto-12           [-1, 64, 56, 56]          36,864
      BatchNorm2d-13           [-1, 64, 56, 56]             128
             ReLU-14           [-1, 64, 56, 56]               0
       Conv2dAuto-15           [-1, 64, 56, 56]          36,864
      BatchNorm2d-16           [-1, 64, 56, 56]             128
             ReLU-17           [-1, 64, 56, 56]               0
 ResNetBasicBlock-18           [-1, 64, 56, 56]               0
      ResNetLayer-19           [-1, 64, 56, 56]               0
           Conv2d-20          [-1, 128, 28, 28]           8,192
      BatchNorm2d-21          [-1, 128, 28, 28]             256
       Conv2dAuto-22          [-1, 128, 28, 28]          73,728
      BatchNorm2d-23          [-1, 128, 28, 28]             256
             ReLU-24          [-1, 128, 28, 28]               0
       Conv2dAuto-25          [-1, 128, 28, 28]         147,456
      BatchNorm2d-26          [-1, 128, 28, 28]             256
             ReLU-27          [-1, 128, 28, 28]               0
 ResNetBasicBlock-28          [-1, 128, 28, 28]               0
       Conv2dAuto-29          [-1, 128, 28, 28]         147,456
      BatchNorm2d-30          [-1, 128, 28, 28]             256
             ReLU-31          [-1, 128, 28, 28]               0
       Conv2dAuto-32          [-1, 128, 28, 28]         147,456
      BatchNorm2d-33          [-1, 128, 28, 28]             256
             ReLU-34          [-1, 128, 28, 28]               0
 ResNetBasicBlock-35          [-1, 128, 28, 28]               0
      ResNetLayer-36          [-1, 128, 28, 28]               0
           Conv2d-37          [-1, 256, 14, 14]          32,768
      BatchNorm2d-38          [-1, 256, 14, 14]             512
       Conv2dAuto-39          [-1, 256, 14, 14]         294,912
      BatchNorm2d-40          [-1, 256, 14, 14]             512
             ReLU-41          [-1, 256, 14, 14]               0
       Conv2dAuto-42          [-1, 256, 14, 14]         589,824
      BatchNorm2d-43          [-1, 256, 14, 14]             512
             ReLU-44          [-1, 256, 14, 14]               0
 ResNetBasicBlock-45          [-1, 256, 14, 14]               0
       Conv2dAuto-46          [-1, 256, 14, 14]         589,824
      BatchNorm2d-47          [-1, 256, 14, 14]             512
             ReLU-48          [-1, 256, 14, 14]               0
       Conv2dAuto-49          [-1, 256, 14, 14]         589,824
      BatchNorm2d-50          [-1, 256, 14, 14]             512
             ReLU-51          [-1, 256, 14, 14]               0
 ResNetBasicBlock-52          [-1, 256, 14, 14]               0
      ResNetLayer-53          [-1, 256, 14, 14]               0
           Conv2d-54            [-1, 512, 7, 7]         131,072
      BatchNorm2d-55            [-1, 512, 7, 7]           1,024
       Conv2dAuto-56            [-1, 512, 7, 7]       1,179,648
      BatchNorm2d-57            [-1, 512, 7, 7]           1,024
             ReLU-58            [-1, 512, 7, 7]               0
       Conv2dAuto-59            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-60            [-1, 512, 7, 7]           1,024
             ReLU-61            [-1, 512, 7, 7]               0
 ResNetBasicBlock-62            [-1, 512, 7, 7]               0
       Conv2dAuto-63            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-64            [-1, 512, 7, 7]           1,024
             ReLU-65            [-1, 512, 7, 7]               0
       Conv2dAuto-66            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-67            [-1, 512, 7, 7]           1,024
             ReLU-68            [-1, 512, 7, 7]               0
 ResNetBasicBlock-69            [-1, 512, 7, 7]               0
      ResNetLayer-70            [-1, 512, 7, 7]               0
    ResNetEncoder-71            [-1, 512, 7, 7]               0
AdaptiveAvgPool2d-72            [-1, 512, 1, 1]               0
           Linear-73                 [-1, 1000]         513,000
    ResnetDecoder-74                 [-1, 1000]               0
================================================================
Total params: 11,689,512
Trainable params: 11,689,512
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.57
Forward/backward pass size (MB): 65.86
Params size (MB): 44.59
Estimated Total Size (MB): 111.03
----------------------------------------------------------------

为了检查正确性,让我们看看原始实现的参数数量

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 112, 112]           9,408
       BatchNorm2d-2         [-1, 64, 112, 112]             128
              ReLU-3         [-1, 64, 112, 112]               0
         MaxPool2d-4           [-1, 64, 56, 56]               0
            Conv2d-5           [-1, 64, 56, 56]          36,864
       BatchNorm2d-6           [-1, 64, 56, 56]             128
              ReLU-7           [-1, 64, 56, 56]               0
            Conv2d-8           [-1, 64, 56, 56]          36,864
       BatchNorm2d-9           [-1, 64, 56, 56]             128
             ReLU-10           [-1, 64, 56, 56]               0
       BasicBlock-11           [-1, 64, 56, 56]               0
           Conv2d-12           [-1, 64, 56, 56]          36,864
      BatchNorm2d-13           [-1, 64, 56, 56]             128
             ReLU-14           [-1, 64, 56, 56]               0
           Conv2d-15           [-1, 64, 56, 56]          36,864
      BatchNorm2d-16           [-1, 64, 56, 56]             128
             ReLU-17           [-1, 64, 56, 56]               0
       BasicBlock-18           [-1, 64, 56, 56]               0
           Conv2d-19          [-1, 128, 28, 28]          73,728
      BatchNorm2d-20          [-1, 128, 28, 28]             256
             ReLU-21          [-1, 128, 28, 28]               0
           Conv2d-22          [-1, 128, 28, 28]         147,456
      BatchNorm2d-23          [-1, 128, 28, 28]             256
           Conv2d-24          [-1, 128, 28, 28]           8,192
      BatchNorm2d-25          [-1, 128, 28, 28]             256
             ReLU-26          [-1, 128, 28, 28]               0
       BasicBlock-27          [-1, 128, 28, 28]               0
           Conv2d-28          [-1, 128, 28, 28]         147,456
      BatchNorm2d-29          [-1, 128, 28, 28]             256
             ReLU-30          [-1, 128, 28, 28]               0
           Conv2d-31          [-1, 128, 28, 28]         147,456
      BatchNorm2d-32          [-1, 128, 28, 28]             256
             ReLU-33          [-1, 128, 28, 28]               0
       BasicBlock-34          [-1, 128, 28, 28]               0
           Conv2d-35          [-1, 256, 14, 14]         294,912
      BatchNorm2d-36          [-1, 256, 14, 14]             512
             ReLU-37          [-1, 256, 14, 14]               0
           Conv2d-38          [-1, 256, 14, 14]         589,824
      BatchNorm2d-39          [-1, 256, 14, 14]             512
           Conv2d-40          [-1, 256, 14, 14]          32,768
      BatchNorm2d-41          [-1, 256, 14, 14]             512
             ReLU-42          [-1, 256, 14, 14]               0
       BasicBlock-43          [-1, 256, 14, 14]               0
           Conv2d-44          [-1, 256, 14, 14]         589,824
      BatchNorm2d-45          [-1, 256, 14, 14]             512
             ReLU-46          [-1, 256, 14, 14]               0
           Conv2d-47          [-1, 256, 14, 14]         589,824
      BatchNorm2d-48          [-1, 256, 14, 14]             512
             ReLU-49          [-1, 256, 14, 14]               0
       BasicBlock-50          [-1, 256, 14, 14]               0
           Conv2d-51            [-1, 512, 7, 7]       1,179,648
      BatchNorm2d-52            [-1, 512, 7, 7]           1,024
             ReLU-53            [-1, 512, 7, 7]               0
           Conv2d-54            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-55            [-1, 512, 7, 7]           1,024
           Conv2d-56            [-1, 512, 7, 7]         131,072
      BatchNorm2d-57            [-1, 512, 7, 7]           1,024
             ReLU-58            [-1, 512, 7, 7]               0
       BasicBlock-59            [-1, 512, 7, 7]               0
           Conv2d-60            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-61            [-1, 512, 7, 7]           1,024
             ReLU-62            [-1, 512, 7, 7]               0
           Conv2d-63            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-64            [-1, 512, 7, 7]           1,024
             ReLU-65            [-1, 512, 7, 7]               0
       BasicBlock-66            [-1, 512, 7, 7]               0
AdaptiveAvgPool2d-67            [-1, 512, 1, 1]               0
           Linear-68                 [-1, 1000]         513,000
================================================================
Total params: 11,689,512
Trainable params: 11,689,512
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.57
Forward/backward pass size (MB): 62.79
Params size (MB): 44.59
Estimated Total Size (MB): 107.96
----------------------------------------------------------------

是一样的!

用户化

面向对象编程的一个优点是我们可以很容易地定制我们的网络。

改变街区

如果我们想使用不同的基本块呢?也许我们只想要一个 3x3 的 conv,也许还要退学?。在这种情况下,我们可以子类化ResNetResidualBlock并改变.blocks字段!

让我们把这个新的区块交给resnet18,创建一个新的架构!

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 112, 112]           9,408
       BatchNorm2d-2         [-1, 64, 112, 112]             128
              ReLU-3         [-1, 64, 112, 112]               0
         MaxPool2d-4           [-1, 64, 56, 56]               0
        Conv2dAuto-5           [-1, 64, 56, 56]          36,864
         Dropout2d-6           [-1, 64, 56, 56]               0
              ReLU-7           [-1, 64, 56, 56]               0
              ReLU-8           [-1, 64, 56, 56]               0
AnOtherResNetBlock-9           [-1, 64, 56, 56]               0
       Conv2dAuto-10           [-1, 64, 56, 56]          36,864
        Dropout2d-11           [-1, 64, 56, 56]               0
             ReLU-12           [-1, 64, 56, 56]               0
             ReLU-13           [-1, 64, 56, 56]               0
AnOtherResNetBlock-14           [-1, 64, 56, 56]               0
      ResNetLayer-15           [-1, 64, 56, 56]               0
           Conv2d-16          [-1, 128, 28, 28]           8,192
      BatchNorm2d-17          [-1, 128, 28, 28]             256
       Conv2dAuto-18          [-1, 128, 28, 28]          73,728
        Dropout2d-19          [-1, 128, 28, 28]               0
             ReLU-20          [-1, 128, 28, 28]               0
             ReLU-21          [-1, 128, 28, 28]               0
AnOtherResNetBlock-22          [-1, 128, 28, 28]               0
       Conv2dAuto-23          [-1, 128, 28, 28]         147,456
        Dropout2d-24          [-1, 128, 28, 28]               0
             ReLU-25          [-1, 128, 28, 28]               0
             ReLU-26          [-1, 128, 28, 28]               0
AnOtherResNetBlock-27          [-1, 128, 28, 28]               0
      ResNetLayer-28          [-1, 128, 28, 28]               0
           Conv2d-29          [-1, 256, 14, 14]          32,768
      BatchNorm2d-30          [-1, 256, 14, 14]             512
       Conv2dAuto-31          [-1, 256, 14, 14]         294,912
        Dropout2d-32          [-1, 256, 14, 14]               0
             ReLU-33          [-1, 256, 14, 14]               0
             ReLU-34          [-1, 256, 14, 14]               0
AnOtherResNetBlock-35          [-1, 256, 14, 14]               0
       Conv2dAuto-36          [-1, 256, 14, 14]         589,824
        Dropout2d-37          [-1, 256, 14, 14]               0
             ReLU-38          [-1, 256, 14, 14]               0
             ReLU-39          [-1, 256, 14, 14]               0
AnOtherResNetBlock-40          [-1, 256, 14, 14]               0
      ResNetLayer-41          [-1, 256, 14, 14]               0
           Conv2d-42            [-1, 512, 7, 7]         131,072
      BatchNorm2d-43            [-1, 512, 7, 7]           1,024
       Conv2dAuto-44            [-1, 512, 7, 7]       1,179,648
        Dropout2d-45            [-1, 512, 7, 7]               0
             ReLU-46            [-1, 512, 7, 7]               0
             ReLU-47            [-1, 512, 7, 7]               0
AnOtherResNetBlock-48            [-1, 512, 7, 7]               0
       Conv2dAuto-49            [-1, 512, 7, 7]       2,359,296
        Dropout2d-50            [-1, 512, 7, 7]               0
             ReLU-51            [-1, 512, 7, 7]               0
             ReLU-52            [-1, 512, 7, 7]               0
AnOtherResNetBlock-53            [-1, 512, 7, 7]               0
      ResNetLayer-54            [-1, 512, 7, 7]               0
    ResNetEncoder-55            [-1, 512, 7, 7]               0
AdaptiveAvgPool2d-56            [-1, 512, 1, 1]               0
           Linear-57                 [-1, 1000]         513,000
    ResnetDecoder-58                 [-1, 1000]               0
================================================================
Total params: 5,414,952
Trainable params: 5,414,952
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.57
Forward/backward pass size (MB): 54.38
Params size (MB): 20.66
Estimated Total Size (MB): 75.61
----------------------------------------------------------------

改变激活功能

容易的事

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 112, 112]           9,408
       BatchNorm2d-2         [-1, 64, 112, 112]             128
         LeakyReLU-3         [-1, 64, 112, 112]               0
         MaxPool2d-4           [-1, 64, 56, 56]               0
        Conv2dAuto-5           [-1, 64, 56, 56]          36,864
       BatchNorm2d-6           [-1, 64, 56, 56]             128
         LeakyReLU-7           [-1, 64, 56, 56]               0
        Conv2dAuto-8           [-1, 64, 56, 56]          36,864
       BatchNorm2d-9           [-1, 64, 56, 56]             128
        LeakyReLU-10           [-1, 64, 56, 56]               0
 ResNetBasicBlock-11           [-1, 64, 56, 56]               0
       Conv2dAuto-12           [-1, 64, 56, 56]          36,864
      BatchNorm2d-13           [-1, 64, 56, 56]             128
        LeakyReLU-14           [-1, 64, 56, 56]               0
       Conv2dAuto-15           [-1, 64, 56, 56]          36,864
      BatchNorm2d-16           [-1, 64, 56, 56]             128
        LeakyReLU-17           [-1, 64, 56, 56]               0
 ResNetBasicBlock-18           [-1, 64, 56, 56]               0
      ResNetLayer-19           [-1, 64, 56, 56]               0
           Conv2d-20          [-1, 128, 28, 28]           8,192
      BatchNorm2d-21          [-1, 128, 28, 28]             256
       Conv2dAuto-22          [-1, 128, 28, 28]          73,728
      BatchNorm2d-23          [-1, 128, 28, 28]             256
        LeakyReLU-24          [-1, 128, 28, 28]               0
       Conv2dAuto-25          [-1, 128, 28, 28]         147,456
      BatchNorm2d-26          [-1, 128, 28, 28]             256
        LeakyReLU-27          [-1, 128, 28, 28]               0
 ResNetBasicBlock-28          [-1, 128, 28, 28]               0
       Conv2dAuto-29          [-1, 128, 28, 28]         147,456
      BatchNorm2d-30          [-1, 128, 28, 28]             256
        LeakyReLU-31          [-1, 128, 28, 28]               0
       Conv2dAuto-32          [-1, 128, 28, 28]         147,456
      BatchNorm2d-33          [-1, 128, 28, 28]             256
        LeakyReLU-34          [-1, 128, 28, 28]               0
 ResNetBasicBlock-35          [-1, 128, 28, 28]               0
      ResNetLayer-36          [-1, 128, 28, 28]               0
           Conv2d-37          [-1, 256, 14, 14]          32,768
      BatchNorm2d-38          [-1, 256, 14, 14]             512
       Conv2dAuto-39          [-1, 256, 14, 14]         294,912
      BatchNorm2d-40          [-1, 256, 14, 14]             512
        LeakyReLU-41          [-1, 256, 14, 14]               0
       Conv2dAuto-42          [-1, 256, 14, 14]         589,824
      BatchNorm2d-43          [-1, 256, 14, 14]             512
        LeakyReLU-44          [-1, 256, 14, 14]               0
 ResNetBasicBlock-45          [-1, 256, 14, 14]               0
       Conv2dAuto-46          [-1, 256, 14, 14]         589,824
      BatchNorm2d-47          [-1, 256, 14, 14]             512
        LeakyReLU-48          [-1, 256, 14, 14]               0
       Conv2dAuto-49          [-1, 256, 14, 14]         589,824
      BatchNorm2d-50          [-1, 256, 14, 14]             512
        LeakyReLU-51          [-1, 256, 14, 14]               0
 ResNetBasicBlock-52          [-1, 256, 14, 14]               0
      ResNetLayer-53          [-1, 256, 14, 14]               0
           Conv2d-54            [-1, 512, 7, 7]         131,072
      BatchNorm2d-55            [-1, 512, 7, 7]           1,024
       Conv2dAuto-56            [-1, 512, 7, 7]       1,179,648
      BatchNorm2d-57            [-1, 512, 7, 7]           1,024
        LeakyReLU-58            [-1, 512, 7, 7]               0
       Conv2dAuto-59            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-60            [-1, 512, 7, 7]           1,024
        LeakyReLU-61            [-1, 512, 7, 7]               0
 ResNetBasicBlock-62            [-1, 512, 7, 7]               0
       Conv2dAuto-63            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-64            [-1, 512, 7, 7]           1,024
        LeakyReLU-65            [-1, 512, 7, 7]               0
       Conv2dAuto-66            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-67            [-1, 512, 7, 7]           1,024
        LeakyReLU-68            [-1, 512, 7, 7]               0
 ResNetBasicBlock-69            [-1, 512, 7, 7]               0
      ResNetLayer-70            [-1, 512, 7, 7]               0
    ResNetEncoder-71            [-1, 512, 7, 7]               0
AdaptiveAvgPool2d-72            [-1, 512, 1, 1]               0
           Linear-73                 [-1, 1000]         513,000
    ResnetDecoder-74                 [-1, 1000]               0
================================================================
Total params: 11,689,512
Trainable params: 11,689,512
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.57
Forward/backward pass size (MB): 65.86
Params size (MB): 44.59
Estimated Total Size (MB): 111.03
----------------------------------------------------------------

结论

在本文中,我们看到了如何以一种良好的、可伸缩的和可定制的方式实现 ResNet。在下一篇文章中,我们将进一步扩展这个架构,训练它并使用另外两个技巧:预激活和挤压和激励。

这里所有的代码都是这里是

如果你对理解更好的神经网络感兴趣,我建议你读一读我写的另一篇文章

[## 卷积神经网络可视化之旅

弗朗西斯科·萨维里奥·祖皮奇尼

towardsdatascience.com](/a-journey-into-convolutional-neural-network-visualization-1abc71605209)

想知道如何实现 RepVGG?ResNet 的更好版本?

[## 在 PyTorch 中实现 RepVGG

让您的 CNN 速度快 100 倍以上

towardsdatascience.com](/implementing-repvgg-in-pytorch-fc8562be58f9)

了解 PyTorch 中的非最大抑制

[## PyTorch 中的非最大抑制(NMS)

在 PyTorch 中实现非最大抑制

medium.com](https://medium.com/@FrancescoZ/non-max-suppression-nms-in-pytorch-35f77397a0aa)

感谢您的阅读

弗朗西斯科·萨维里奥·祖皮奇尼

利用高斯混合变分自动编码器抵抗对抗性攻击

原文:https://towardsdatascience.com/resisting-adversarial-attacks-using-gaussian-mixture-variational-autoencoders-be98e69b5070?source=collection_archive---------14-----------------------

深度神经网络太神奇了!他们能够通过查看 100 多万张图像来学习将图像分为不同的类别,在众多语言对之间进行翻译,将我们的语音转换为文本,制作艺术品(甚至可以在拍卖会上出售!),并擅长大量其他令人兴奋和有用的应用程序。人们很容易被深度学习的成功故事所陶醉,但它们不会犯错吗?

事实证明,他们实际上是极易被愚弄的!😦

针对深度神经网络的对抗性攻击的研究越来越多。已经提出了许多防御方法来保护模型免受这种攻击。不幸的是,几乎所有的方法都被证明是无效的。该领域的发展速度显而易见,因为在 ICLR 2018 年成果宣布后的几周内,一篇研究论文发表了,显示作者如何能够绕过被接受论文中提出的 8 种防御技术中的 7 种。2018 年 CVPR 奥运会上接受的关于防御对抗性攻击的论文遭遇了类似的命运!

We are all too familiar with this cute gibbon…errrr panda by now! Image courtesy: http://www.cleverhans.io/assets/adversarial-example.png

一项平行的研究表明,深度神经网络也可以很容易地被【愚弄】样本欺骗,这些样本是分布外的样本,与模型训练的任何类别都不相似。事实上,已经表明,简单地提供随机高斯噪声作为输入足以欺骗深度网络以高置信度预测其中一个类作为输出。正如“GAN 之父”伊恩·古德菲勒所说,“深度神经网络几乎在任何地方都是错误的!”

Each of these images are classified into the class mentioned with >99% confidence! Image courtesy: http://www.evolvingai.org/fooling

虽然这在一开始看起来非常令人惊讶,但让我们仔细检查一下。首先,我们来看看糊弄的样本。

基于深度神经网络的图像分类器的任务是学习将每个输入分类到 K 允许类的1 中。然而,有一个问题。当我们提供一个不属于任何允许的类的输入图像时,模型应该做什么?在典型的机器学习设置中,潜在的假设是,训练和测试样本是从原始数据分布 P(x,y) 中抽取的。然而,这个假设在当前场景中被打破。

理想情况下,我们希望网络预测类的均匀分布(当输出层是 softmax 层时),以及每个类的接近 0 的概率得分(当输出层由 sigmoid 激活组成时)。然而,我们需要在这里停下来,问问我们自己——考虑到我的培训目标,我应该期望网络以这种方式运行吗?

在训练阶段,模型应该优化的唯一目标是由训练样本的预测误差确定的经验风险函数,这意味着目标函数中没有迫使网络学习非分布样本的期望行为的项。因此,毫不奇怪,在模型的输入空间中很容易找到导致对某些类别标签的高置信度预测的样本,尽管事实上它们实际上不属于任何类别——我们根本没有为这样的任务训练模型!解决问题的办法似乎是引入一个【拒绝类】的概念。

接下来,我们将通过几个图像来分析愚弄样本和敌对样本同时存在的原因。

Let’s consider the simplistic scenario of an image in a 2-D space. If we randomly perturb the image in some direction, the classifier usually does a good job of handling the noise.

However, adversarial attacks find certain specific directions in the input space, such that the classifier is fooled into predicting an incorrect class label after perturbing the input in that direction.

Similarly, fooling images can be found much more easily, such that they do not belong to any of the classes, but lead to high confidence predictions when provided as inputs to the classifier.

If we try to analyze the reason for existence of such fooling samples more closely, it becomes clear that any input which does not lie in the region of the input space representing any of the classes, but lies sufficiently far away from the decision boundaries of the classifier, will lead to high confidence predictions corresponding to one of the classes. Further, if we look closely at the adversarial image depicted in the above figure, it becomes clear that unless the training data provides a very good representation of the true boundary of a given class, it might be possible to find certain adversarial directions for perturbing an input image. A 2-D depiction is provided here just for an idea - imagine how the possibility of finding such directions will increase as the input dimensionality increases! Now think of the input dimensionality in the case of image classifiers - it is probably not so surprising that adversarial samples exist!

如果我们可以为输入空间中的每个类设置某种信封,那么我们可以将属于该信封的每个输入分类为属于该类,并拒绝不属于任何信封的每个输入,这不是很好吗?我们可以使用任何所需形状的信封,或者如果需要的话,对每一类输入使用多个信封。但问题是,我们如何得到这样的信封?事实证明,这是一个在原始输入空间中很难解决的问题。

如果我们从概率论的角度来看,这个问题归结为给定训练数据的密度估计。如果我们知道 P(x) ,我们可以简单地拒绝任何输入样本 x ,对于这些样本 P(x) 可以忽略不计。但是,高维密度估计面临维数灾难!

在我们的建议中,我们使用变分自动编码器(VAE)来实现上述目标-同时降低维度并在较低的维度中执行密度估计。我们使用高斯混合分布作为潜在变量先验,混合分量的数量等于数据集中的类的数量。所提出的框架还允许我们在半监督场景中训练模型。请参考我们的论文了解如何修改 ELBO 以说明分类标签,从而获得用于训练模型的目标函数。

Training phase of our model is represented in this figure. f and g represent the encoder and decoder networks respectively, and they output the means of the two distributions Q(z|x) and P(x|z). ϵ represents the noise added corresponding to the reparameterization trick used for training VAEs.

一旦模型被训练,我们使用模型的潜在(编码器阈值)和输出(解码器阈值)空间中的阈值来拒绝输入样本。基于训练数据和训练模型来计算阈值,其中编码器阈值对应于不可忽略的 P(z) ,解码器阈值对应于不可忽略的 P(x|z) (在某些假设下)。这些阈值对应于我们之前讨论的使用信封的想法。这两个阈值的组合确保任何被分类的输入 x 在训练数据分布下具有不可忽略的概率 P(x)

Testing phase of the model is represented in this figure. The input image is passed through the encoder, and if the latent encoding lies within the encoder threshold from the mean of the predicted class, then the encoding is passed through the decoder network. If the reconstruction error is also within the the decoder threshold of the predicted class, then the predicted label is accepted. If any of the thresholds is not satisfied, then the input is rejected. It is important to note here that each of the circles in the latent space in the figure represent the Gaussian mixture component for the corresponding class.

由于我们已经在模型管道中引入了拒绝机制,现在让我们来看看使用和不使用阈值的模型的性能。鉴于现在这是一个选择性分类模型,我们必须确保引入拒绝机制后,测试数据的精度以及召回率都很高。

It is noteworthy here that although there is a certain drop in accuracy after thresholding, the error percentages go down in each of the cases. For example, for MNIST data, the error percentage goes down from 0.33% to 0.22%, while 1.81% samples now move into the reject class.

现在,让我们看看一些被我们的模型错误分类的样本。

The first label indicates the true label from the test dataset, and the second label indicates our model’s prediction. In most of the cases, it is clear that the labels predicted cannot be claimed to be “wrong”, since it is not clear even to a human which of the two labels should be “correct”.

接下来,我们将深入我们的模型,探索有助于拒绝敌对和愚弄输入的关键特征,而不是对它们进行错误分类。首先需要注意的是,该模型的编码器部分非常类似于通常的基于 CNN 的分类器。因此,我们可以使用现有的敌对/愚弄攻击来欺骗编码器,类似于对 CNN 的攻击。然而,解码器网络是模型鲁棒性的主要来源。重要的是要注意,解码器的输入维数明显小于编码器的输入维数(例如,对于 MNIST 数据,10 比 28×28 = 784)。此外,因为我们在潜在空间中执行阈值处理,所以我们只允许解码器接受来自该空间非常有限的部分的输入。在训练时,解码器输入空间的这个区域被密集采样,即,给定来自这个区域的输入,可以期望解码器仅生成有效的输出图像。这是我们的模型的对抗性鲁棒性的据点。

给定训练数据中的类在视觉上是不同的,在给定来自我们的模型的潜在空间中的两个不同高斯混合分量的两个输入的情况下,可以期望解码器生成具有高欧几里德距离的图像。只要该距离大于相应类别的解码器阈值,解码器将总是能够检测到对模型的对抗性攻击。

This figure represents the evolution of the latent space structure for the model for a single class. Existence of “holes” in the input space of the decoder is highly improbable, given the training objective. Image courtesy: https://arxiv.org/pdf/1711.01558.pdf

现在,让我们来看看如何通过阈值处理来抵御敌对样本。

Suppose the input image (from class 1) has been adversarially perturbed to fool the encoder into believing that it belongs to class 0. This implies that the latent encoding of the input image must lie within the cluster for 0’s. Although it is easy for an adversary to achieve this objective, the decoder is where it becomes tricky. Once the latent encoding is passed through the decoder network, the output image now resembles a 0, and thus, the reconstruction error is invariably high. This results in rejection of the input image!

接下来,我们提供在编码器网络上运行 FGSM 攻击的结果。随着我们增加噪声幅度,模型的精度持续下降,但是在整个ϵ值范围内(对于监督模型),误差百分比保持在 4%以下。如所期望的,随着ϵ的增加,拒绝百分比从 0%上升到 100%,而不是敌对输入被错误分类。对于半监督的情况也观察到类似的趋势,但是,如预期的,模型性能不如监督情况下的好。

Results corresponding to the FGSM attack with varying ϵ on the encoder of the model trained on MNIST dataset.

我们还使用 Cleverhans 库尝试了许多其他强攻击,如 PGD、BIM、MIM 等。使用默认参数,但是在每种情况下,所有生成的对立样本都被拒绝。由于这些攻击缺乏解码器网络的知识,我们接下来将注意力转移到完全白盒攻击,其中敌对目标是利用两个阈值的知识专门设计的。我们还设计了类似的白盒愚弄目标,并在随机选择的测试数据集子集上运行这些攻击(对抗性攻击),或在多个开始随机图像上运行这些攻击(愚弄攻击)。然而,在每种情况下,优化过程收敛的图像被我们的模型基于两个阈值成功地拒绝。有关这些敌对目标的详细信息,请参考我们的文件。

White-box adversarial attack objective

White-box fooling attack objective

最后,为了解决敌对样本进入拒绝类而不是被正确分类的问题,我们引入了仅基于解码器网络的重新分类方案。该方法背后的基本思想是找到最大化 P(x|z)z ,即,我们对解码器网络的输入执行梯度下降,以最小化给定对抗图像的重建误差。然后,我们选择与最优 z 所在的集群相对应的标签。如果这个 z 超出相应类别均值的编码器阈值,我们再次将输入作为非分布样本拒绝。按照这种重新分类方案,我们在通过对具有变化ϵ.的编码器进行 FGSM 攻击而生成的敌对图像上获得了以下结果

这些结果意味着重新分类方案能够以非常高的准确度成功地将检测到的对抗性输入分类到正确的类别中。即使对于 0.3 的最高ϵ,解码器网络也能够正确地对 87%的样本进行分类,而所有这些样本先前都被拒绝。

有趣的是,在拒绝的测试数据样本上遵循相同的重新分类方案,我们也获得了先前报告的准确度值的改进。例如,对于 MNIST 数据集,精度值从 97.97%上升到 99.07%,因为 181 个被拒绝的样本中的 110 个被重新分类方案正确分类。因此,该方法进一步提高了测试数据集的召回率。然而,重要的是要注意,由于重分类方案涉及优化步骤,因此直接在所有输入样本上使用它是不实际的。因此,我们建议在通常情况下使用编码器网络进行分类,并且只对被拒绝的输入样本使用重新分类方案。

有趣的是,我们最近看到了一篇关于非常相似的想法的论文,该论文使用了 Geoffrey Hinton 教授团队的胶囊网络以及检测敌对样本,可以在这里找到。在贝斯吉实验室的这个链接上也可以找到另一个类似的工作。

再一次,这篇文章对应的论文可以在下面的链接找到。这项工作是由 MPI-IS 和 IBM Research AI 合作完成的。该论文已被第 33 届 AAAI 人工智能会议(2019 年,AAAI)接受发表。请在下面留下任何问题/建议/反馈,我们将很高兴与您联系!感谢您的时间和兴趣!

回应格式和登月

原文:https://towardsdatascience.com/response-formats-and-the-moon-landing-9423747a2636?source=collection_archive---------32-----------------------

1969 年 7 月,阿波罗 11 号航天飞机发射并让人类登陆月球。五十年后,一些人认为登月并没有真正发生。

这篇文章着眼于两个最近的调查估计,认为登月是伪造的,以及这两个调查之间的差异。

真的还是假的?

回到 2019 年 2 月,YouGov 在互联网小组中询问了 2039 名英国成年人,为其与雅虎的播客:

如果有的话,你认为下面的陈述是对还是错?

登月上演了

人们可以从绝对正确到绝对错误或者他们不知道来回答。调查估计,16%的人认为登月可能(12%)或绝对是真的(4%)是有预谋的。

几周前,数字分析机构 Politics——它不是英国民意调查委员会的成员——就几起阴谋询问了 1000 名英国成年人。受访者可以勾选他们认为正确的所有选项。

以前,数字处理器政治混合使用互联网小组和互联网“河流采样”。河流采样包括通过在选定网站上的促销广告邀请人们回答问题。

在调查中,只有 5%的人选择了“1969 年至 1972 年的登月是伪造的,人类没有真正到过月球”。

It has been fifty years since the first Moon landings. (Photo: ABC News Australia)

那么,到底是 5%还是 16%?

差异

在措辞上有一些不同,比较了'伪造'和'上演',并指明了多次登月的时间。

然而,关键的区别在于响应格式。

在 YouGov 的调查中,人们必须为每个陈述选择一个选项:绝对正确、可能正确、可能错误、绝对错误或不知道。这被称为强制选择格式。

正如文章所暗示的,数字分析政治调查是全选的形式。如果你在网上做过调查,你可能认识这种格式。人们被问到一个问题,可能会从列表中勾选多个选项。

Pew Research Center did a randomised experiment comparing the two.

每种格式都有优点和缺点。

选择所有适用问题很简洁,通常只占一个屏幕。强制选择问题占用更多的空间,需要回答者付出更大的努力来滚动或点击每个问题。

然而,全选问题要求回答的人同时考虑所有选项。强迫选择的形式鼓励对每个选项进行更多的思考。

这两种形式都存在问题:默认偏见可能意味着一些人由于受暗示或只是为了通过调查而点击“真”(或“同意”或“是”)选项。在全选问题中,回答满足调查需求意味着人们可能只选择一些适用的。

皮尤研究中心进行了一项随机试验,关于负面事件(比如你的身份被盗)的个人经历的问题以两种形式分配。

在所有的问题中,强迫选择的方式比全选的方式产生了更高的估计值,这是一致的。在六个选项中,差异从 2 分(被要求行贿)到 16 分(被多收)不等。两种格式的顺序几乎相同。

哪个更好?

虽然全选格式比强制选择格式产生的估计值低,但哪种格式更准确?Callegaro、Murakami、Tepman 和 Henderson 在 2014 年进行的一项荟萃分析发现,很少有研究涉及这一关键问题,而且没有定论。

响应格式的变化会产生不同的估计值。需要进一步的调查研究来了解哪种格式更可靠。

数据科学的隐患

原文:https://towardsdatascience.com/responsible-data-science-part-1-1906062fe486?source=collection_archive---------26-----------------------

Lise Getoor 在 IEEE 大数据大会上的主题演讲笔记

数据科学,机器学习,人工智能。这些都是我们社会出现的流行语。我们越来越依赖这些技术,但这种依赖也引发了我们完全信任这些技术的正当性问题。众所周知,机器学习和深度学习是一个黑箱——我们将数据输入模型,并得出一些我们认为理所当然的结果,而没有真正质疑这些结果是如何获得的,以及这个过程是否合理。这个问题构成了 Lise Getoor 教授在 2019 年 12 月 10 日在洛杉矶举行的 2019 年 IEEE 大数据大会上发表主题演讲的背景,我现在将概述她所做的启发性演讲。

Image by manfredsteger from Pixabay

背景

数据科学越来越多地成为人们关注的焦点,在全世界范围内受到越来越多的关注。但每当我们在新闻中看到数据科学,它大多是为了一些不好的东西。例如,我们许多人都熟悉剑桥分析公司的丑闻,该公司在未经同意的情况下收集了数百万人的脸书个人资料,并将其用于政治广告目的。另一个例子是科学家如何宣称已经创造了一个能够根据面部图像推断犯罪行为的模型。

在主题演讲中,Getoor 教授主要关注机器学习中的负责任的数据科学,我现在将概述一下。

机器学习——简介

机器学习经历了几次革命,过去一个世纪出现了几个主题,从概念学习、统计学习、基于优化的学习到深度学习。

Image taken from IEEE Big Data 2019 Keynote. Reposted with permission

概念学习围绕着机器如何学习逻辑上一致的假设,能够正确地标注正负样本。在 20 世纪 80 年代,机器学习转向统计学习,特别是概率方法,重点是学习最大化概率和数据可能性的假设。接下来,机器学习转向基于优化的,例如,支持向量机(SVM),其中假设最小化一些损失函数。现在我们处于深度学习的神经启发学习时代,它将假设表示为神经网络。

培训和测试

本质上,机器学习中训练的目标是最小化目标标签和预测标签之间的损失。这在数学上表述如下:

Image taken from IEEE Big Data 2019 Keynote. Reposted with permission

在测试阶段,对学习的模型进行测试,以确定它能够多好地预测预测的标签。然后,通过目标标签和预测标签之间的损失之和来计算误差,数学公式如下:

Image taken from IEEE Big Data 2019 Keynote. Reposted with permission

这看起来相当简单——训练一个模型来减少损失,你就可以通过计算误差来客观地量化它的性能。

那么可能会出什么问题呢?事实证明很多人。

可能出错的事情

总之,Getoor 教授涵盖了 7 个可能出错的问题:问题的形式化,处理高维数据,测量误差,深度学习中的可解释性,因果建模,偏见和数据尊严。这些是问题所在:

问题# 1——形式化

似乎提出训练目标很容易,但事实上,每次我们训练一个模型时,我们都在对数据、标签和损失函数做出一些参考框架承诺。

首先,原始数据到特征向量的转换需要我们做出一个参考框架的承诺,因为原始数据总是包含更多的社会和历史背景,而这些背景是特征向量所不能表示的。这意味着每当我们转换原始数据时,我们将会错过人类数据中的许多重要信息。

其次,标签的选择也有问题,因为谁来定义标签?标签只能代表真实数据,而不能真正替代真实数据。

最后,损失函数的选择也很重要,因为不同的损失函数对误差的惩罚是不同的,影响模型性能的因素之间的权衡常常被过分简化并强制拟合到这些损失函数中,而这些损失函数可能并不真正代表任务要求。

因此,需要一些标准来评估所选择的参照系是否合适,标准被称为“结构合理性”,即在输入特征和输出标签之间应该有合理的科学联系。如果不是,无论你的分类器表现得多好,你都应该拒绝这个假设。例如,基于面部图像的犯罪推断无法通过这一测试,因为面部图像(输入特征)和分类(输出标签)之间所谓的“科学联系”根本不科学。相反,它是基于选择图像的方法。实验者可能会手动选择非犯罪图像来传达积极的印象。相比之下,犯罪图像可能既不是由所描绘的个人选择的,也不是为了塑造一个人的正面形象。因此,该模型本质上是一个“微笑探测器”,而据称被发现的联系实际上并不是一个“看似合理的科学联系”。

问题#2 —高维数据

机器学习的下一个问题是对数据的巨大依赖,无论是训练还是测试。这个问题出现在高维数据中,因为过度拟合的危险要高得多。随之而来的还有无数的问题:

  1. 维数灾难意味着我们的直觉在高维空间中会失效,因此尽管我们在处理低维数据时仍然可以依靠直觉,但我们不能对高维数据做同样的事情。
  2. 仅仅由于数据的巨大维度,找到具有预测性但实际上没有相关性的特征的随机子集的可能性很高。
  3. 概化所需的样本量随维度成比例增长,因此高维数据所需的样本量呈指数增长。

一个例子是 NSA 如何尝试使用机器学习来预测恐怖分子的手机使用情况。这很成问题,因为他们对每个手机用户使用了 80 个变量,而已知的恐怖分子只有 7 个。当他们试图在野外测试该模型时,最终确定一名报道基地组织的半岛电视台记者是潜在的恐怖分子!这显示了高维数据如何使我们更容易出错,因为对样本大小的要求更高。

问题#3 —测量误差

下一个出现的问题是度量模型性能的问题。研究人员总是宣称他们新的最先进的模型已经达到 XX 精度或 F1,等等。然而,这种说法总是带有许多不言而喻的条件,即数据集具有定义明确的总体,训练和测试数据都是总体的代表性样本。然而,这在实践中几乎从未成立。下图很好地说明了这个问题:

Image taken from IEEE Big Data 2019 Keynote. Reposted with permission

上面用绿色表示的学习模型最初可能看起来符合真实模型。然而,在进一步的测试中,很明显,学习的模型实际上并不代表真实的模型。

问题#4 —深度学习中的可解释性

在过去的几年里,深度学习中的可解释性受到了越来越多的关注。这一点很重要,因为尽管深度学习模型可能会取得出色的结果,但我们无法确定这些结果是因为模型真的学习了重要的特征,还是因为模型实际上学习了错误的特征,而只是碰巧同一类别的图像的特征保持不变。当错误的特性被改变而重要的特性保持不变时,麻烦就来了。如果模型学习了错误的特征,那么它可能做出错误的预测。

一个例子是里贝罗等人在 2016 年发表的题为“我为什么要相信你”的论文“解释任何分类器的预测”。他们训练了一个模型来对哈士奇和狼进行分类,但结果是对图片背景中的雪和草进行分类。原来,图像中的雪被用来将图像分类为‘狼’,而图像中的草被用来将图像分类为‘哈士奇’。结果,当一只哈士奇以雪为背景拍照时,它被错误地归类为狼。

Image taken from Ribeiro, M. T., Singh, S., & Guestrin, C. (2016, August). " Why should i trust you?" Explaining the predictions of any classifier. In Proceedings of the 22nd ACM SIGKDD international conference on knowledge discovery and data mining (pp. 1135-1144).

问题# 5——因果建模:相关性与因果性

相关性与因果性的问题是另一个经常讨论的话题,尤其是在统计学中。这个想法是,相关性有助于预测;如果 X 和 Y 是正相关的,那么如果我们观察到一个高的 X,那么我们会期望看到高的 Y。如果 X 和 Y 有因果关系,那么如果我们在保持其他一切不变的情况下操纵 X 的值,那么 Y 的值肯定会改变。将相关性混淆为因果关系的问题在于混杂因素,其中相关性通常是由于一个或多个混杂的潜在变量,这些变量是 X 和 y 的隐藏原因。

例如,看起来好像冰淇淋销量的增加会导致鲨鱼袭击数量的增加。对于外行人来说,销售的增长似乎导致了攻击的增长。然而,实际上有一个混淆因素——天气。这可能是因为炎热的天气导致了冰淇淋销量的上升以及鲨鱼袭击事件的增加(因为天气好,更多的人去了海滩),冰淇淋销量和鲨鱼袭击事件的增加之间只有相关性而没有因果关系。

问题 6——偏见和公平

机器学习中的偏差可以分为三类——数据偏差、自动化偏差和算法歧视。

首先,数据偏差是指数据集的选择。数据集的内容受到许多因素的影响,包括选择偏差、机构偏差和社会偏差。俗话说,垃圾进,垃圾出。如果系统的输入有偏差,那么输出也会有偏差。例如,亚马逊因开发人工智能工具雇佣歧视女性的人而受到抨击。原因很简单——训练集主要包含男性简历,因此模型开始了解到,仅仅根据男性简历的数量,男性会比女性更好。

其次,自动化偏见是指我们人类对自动化决策系统的建议的偏好,并且经常忽略矛盾的信息。我们倾向于相信自动化系统所做的决策,仅仅因为它们是自动化的,而没有额外考虑这些决策的有效性和合理性。当决策者开始将决策责任交给算法时,危险就来了。依靠算法来做出艰难的决定尤其诱人,因此这将影响问责制。

最后,算法歧视是指算法可以放大、操作化并最终合法化制度偏见的现象。当算法使这些偏见合法化时,我们可能会达到这样一个点,即我们不再质疑这些我们过去以怀疑的眼光看待的偏见,而是接受它们。这对我们的社会极其危险。

这就给我们带来了公平的问题。首先,公平是为了谁?不同的度量对不同的利益相关者很重要。例如,法官希望在审判中尽量减少假阴性,而被告希望减少假阳性的可能性,即被错误定罪的可能性。在处理公平和偏见问题时,我们必须始终牢记,公平是一个社会和道德概念,而不是一个统计概念。偏见是主观的,因此必须相对于任务来考虑。

问题 7 —数据尊严

这是提出的最后一个问题。数据是新的货币,我们每个人产生的数据都非常有价值。然而,我们的数据经常在未经我们同意和知晓的情况下被滥用,例如在剑桥分析丑闻中。因此,有必要维护数据尊严,即了解和控制您的数据如何被使用的能力。还应该有一个“数据即劳动”的概念,这是使用你的数据获得报酬的能力。这是完全正确的,因为数据是世界的新货币。

结论

我们已经对机器学习进行了简要的概述,并且讨论了机器学习可能会出错的七个问题。当我们思考我们如何经常毫无疑问地信任机器学习算法以及这可能对我们的社会产生的影响时,这无疑是值得思考的。

非常感谢 Getoor 教授关于负责任的数据科学的精彩而有见地的主题演讲,这确实很有启发性。

gan 的恢复收益

原文:https://towardsdatascience.com/restoration-gains-with-gans-faad910c8b66?source=collection_archive---------25-----------------------

在这篇博文中,我将讨论 GANs 以及如何使用它来恢复图像。我将使用 fastai 库进行实践。我建议读者也去探索一下 fastai 。我们开始吧。

Image by Thomas B. from Pixabay

什么是图像恢复?

图像恢复是从失真图像中恢复原始图像的过程。图像恢复有多种类型,例如:

  • 拍摄低分辨率图像并将其转换为高分辨率图像
  • 将黑白图像转换为彩色图像
  • 恢复图像的破损部分

还有很多。

让我们来处理第一种,即将图像上带有一些不想要的文本的低分辨率图像转换成高分辨率的清晰图像。我们需要一个图像数据集来恢复,fastai 为我们提供了图像数据集。让我们使用它。

import fastai
from fastai.vision import *
from fastai.callbacks import *
from fastai.vision.gan import ***path** = untar_data(URLs.PETS)
**path_hr** = path/'images'
**path_lr** = path/'crappy'

path _ HR—POSIX path('/root/)。fastai/data/Oxford-iiit-pet/images ')
path _ lr—POSIX path('/root/)。fastai/data/Oxford-iiit-pet/crappy’)

现在,我们需要扭曲图像,我们可以创建任何扭曲图像的函数。下面,我将使用一个函数,在这个函数中,我将图像扭曲到低分辨率,上面有文字。让我们来理解一下。

from fastai.vision import *
from PIL import Image, ImageDraw, ImageFontclass crappifier(object):
    def __init__(self, path_lr, path_hr):
        **self.path_lr** = path_lr
        **self.path_hr** = path_hrdef __call__(self, fn, i):
        **dest** = self.path_lr/fn.relative_to(self.path_hr)
        dest.parent.mkdir(parents=True, exist_ok=True)
        **img_open** = PIL.Image.open(fn)
        **targ_sz** = resize_to(img_open, 96, use_min=True)
        **img** = img.resize(targ_sz,     resample=PIL.Image.BILINEAR).convert('RGB')
        **w,h** = img.size
        **q** = random.randint(10,70)
        ImageDraw.
          **Draw**(img).
          **text**((random.randint(0,w//2),random.randint(0,h//2)), str(q), fill=(255,255,255))***img.save(dest, quality=q)***
  • dest —我们正在初始化存储垃圾图像的目标路径。
  • img_open —使用 PIL 库打开图像
  • targ_sz —初始化蹩脚图像的大小。
  • img —调整大小后的图像
  • w,h —图像的宽度和高度
  • 问——选择任意一个随机数显示在图像上
  • Draw() — 在图像上绘制文本。
  • text() — 查找要在图像上绘制的文本。第一个参数声明了放置文本的尺寸。第二个参数是显示在图像上的数字。
  • 最后,我们将图像保存到目标文件夹,质量为 q。

这就是我们如何复制图像。你可以以任何方式扭曲图像。

记住一件事,任何你没有包括在crappifier()中的事,模型不会学习去修正它。

il = ImageList.from_folder(path_hr)
parallel(crappify, il.items)

复制图像的过程可能需要一段时间,但 fast.ai 有一个名为parallel的功能。如果你给parallel一个函数名和一个运行该函数的列表,它会并行地运行这些函数。所以,会节省很多时间。

现在让我们对发电机进行预训练。这是我们处理完数据后通常要做的事情。

**bs,size** = 32, 128
**arch** = models.resnet34
**src** = ImageImageList.from_folder(path_lr).split_by_rand_pct(0.1, seed=42)def get_data(bs,size):
    **data** = (src.**label_from_func**(lambda x: path_hr/x.name)
               .**transform**(get_transforms(max_zoom=2.), size=size, tfm_y=True)
               .**databunch**(bs=bs).normalize(imagenet_stats, do_y=True))

**return data**

让我们将 get_data()用于预处理的图像数据集。

data_gen = **get_data**(bs,size)
data_gen.**show_batch**(2)

现在,我们已经创建了数据群,我们必须使用这个数据群来创建学习者。

在这里,我希望读者了解 UNets 以及我们为什么使用它们。如果你对此知之甚少或一无所知,请参考这里的。

我们所做的是通过学习原始图像来恢复图像,而恢复就是 UNet 所执行的。我们需要通过 UNet,我们的数据。让我们利用 UNets,建立对 GANs 的需求。

获得给我们的只是来自不同文件夹的图像列表,按照要求进行了标准化和转换。现在,我们在标准化方法normalize(imagenet_stats, do_y=True)中使用上面的 ImageNet 统计数据,因为我们将使用预训练模型。现在,我们为什么要使用预训练模型呢?我们想恢复扭曲的图像。使用至少了解动物(不是全部,而是很多)的模型来训练模型总是比使用对动物一无所知的东西来训练模型更好。此外,我们希望恢复图像,即从图像中移除我们的模型通常应该移除的不需要的文本。

一个建议是,迁移学习对几乎所有类型的计算机视觉问题都有帮助。

让我们声明参数。

wd = 1e-3
y_range = (-3.,3.)
loss_gen = MSELossFlat()def **create_gen_learner**():
    return **unet_learner**(**data_gen**,
                        **arch**, **wd**=wd,
                        **blur**=True,
                        **norm_type**=NormType.Weight,
                        **self_attention**=True,
                        **y_range**=y_range,
                        **loss_func**=loss_gen)**learn_gen** = create_gen_learner()
  • wd —描述正则化的模型的权重衰减。
  • y_range —这是应用于上一步获得的激活的 sigmoid 函数。这些值是为这类问题定义的。
  • loss_gen —定义了损失函数。由于我们是从原始图像恢复,因此我们需要将输出与原始图像进行比较,MSE loss 非常适合它。MSE 损耗基本上是在两个输入向量之间寻找损耗。在我们的例子中,输入是图像。因此,我们需要在将图像放入损失函数之前对其进行展平。MSELossFlat()基本上做同样的事情。
  • 如果你想了解更多,在这里学习。

因此,我们使用预定义和预训练的模型 ResNet34 创建了 UNet 学习器。这整个过程被称为 生成学习, 我们使用 unet 学习器生成图像。这不是确切的定义,而是更广泛的定义。现在让我们来拟合这个模型。

learn_gen.fit_one_cycle(2, pct_start=0.8)
  • pct_start —代表单个历元内的迭代次数,学习率将上升,学习率将下降的迭代次数。让我们只用上面的例子来理解它。

假设每个时期的迭代次数= 100
每个时期学习率增加的迭代次数= (100 * 1) * 0.8 = 80
学习率减少的迭代次数= 100–80 = 20

模型的上述拟合发生在 UNet 部分,即 UNet 的 ResNet 部分中的编码器冻结的情况下。但是,由于我们使用的是迁移学习,所以我们可以解冻 UNet 的预训练部分()U-Net 的预训练部分是下采样部分。ResNet 就在那里。

learn_gen.unfreeze()learn_gen.fit_one_cycle(3, slice(1e-6,1e-3))**learn_gen.show_results(rows=2)**

  • 我们已经获得了一个较好的预测模型。我们的图像越快越不清晰是由于损失函数。我们使用的是 MSE 损失,即获得的图像和实际图像之间的像素差异非常小。如果删除文本是唯一的任务,那么我们已经实现了我们的目标。但是,我们也在努力提高图像分辨率。
  • 基本上,该模型在上采样中表现出色,但在下采样中表现不佳。
  • 我们要改进的只是损失函数。一个更好的损失函数会给我们更好的结果。这就是神经网络的定义。这就确立了对 GANs 的需求。

生成对抗网络

image source — fastai

让我们理解 gan 背后的语义。

  • 到目前为止,我们有一个模型,它适度地预测了与原始图像没有太大差别的图像。按照上面的图片,我们已经创建了蹩脚的图片,并且生成器也没有生成如此糟糕的图片。然后,我们使用像素 MSE 来比较预测图像和高分辨率图像。
  • 想象一下,如果我们能得到一些东西,而不是比较图像之间的像素,实际上将预测图像分类在高分辨率图像和低分辨率图像之间。如果我们可以欺骗二进制分类器,让它开始将生成的图像分类到高分辨率图像,那就更有趣了。
  • 一旦我们开始愚弄分类器,那么我们将训练分类器更多地预测图像的实际类别,即如果图像是生成的,那么它应该正确地预测它,如果图像是高分辨率图像,那么它应该预测它是高分辨率图像。
  • 一旦分类器训练正确地预测预测图像的类别,这意味着我们不能再欺骗分类器。在这种情况下,我们将进一步训练生成器,使其能够生成更接近高分辨率图像的图像。一旦我们训练了足够多的生成器,我们就可以再次欺骗分类器。
  • 一次,我们再次开始愚弄分类器,这次我们将开始更多地训练分类器。这个训练生成器和分类器的过程实际上越来越多地归结为 GANs。
  • 因此,基本上,GANs 中的损失函数调用了我们的另一个模型,而这个模型本身已经达到了最先进的结果。所有的博弈都是为了得到越来越好的损失函数。

相信我!这都是干的。

我们已经创建了生成器。现在让我们创建分类器。但是在我们创建分类器之前,我们需要将我们的预测存储在某个地方,因为我们需要在预测图像和高分辨率图像之间进行分类。所以,让我们把预测的图像存储在某个地方。

name_gen = 'image_gen'
path_gen = path/name_genpath_gen.mkdir(exist_ok=True)
  • 我们已经创建了一个路径PosixPath(‘/root/.fastai/data/oxford-iiit-pet/image_gen’)],用于存储生成的图像。
  • 我们已经有了存储高分辨率图像的路径PosixPath(‘/root/.fastai/data/oxford-iiit-pet/images’)
def save_preds(dl):
    i=0
    names = dl.dataset.items

    for b in dl:
        preds = learn_gen.pred_batch(batch=b, reconstruct=True)
        for o in preds:
            o.save(path_gen/names[i].name)
            i += 1save_preds(data_gen.fix_dl)
  • 我们已将预测保存在文件夹中。
  • data_gen.fix_dl将生成固定大小的数据加载器。
  • 然后,我们迭代数据加载器,提取特定大小的数据,并将其传递给pred_batch进行预测。
  • 然后,我们将预测的图像存储到图像名称下的文件夹中。

现在,我们需要编码分类器。如果您需要了解更多关于分类器的信息,请阅读此处的。

def **get_crit_data**(classes, bs, size):
    **src** = ImageList.**from_folder**(path, include=classes)
                   .**split_by_rand_pct**(0.1, seed=42)
    **ll** = src.**label_from_folder**(classes=classes)
    **data** = (ll.**transform**(get_transforms(max_zoom=2.), size=size)
              .**databunch**(bs=bs).normalize(imagenet_stats))
    return **data**data_crit = **get_crit_data**([name_gen, 'images'], bs=bs, size=size)
  • from_folder —从位于path的文件夹中提取图像。我们希望只包含那些名称在include=classes中提到的文件夹的数据。
  • label_from_folder —使用基本上是文件夹名称本身的类来标记图像。
  • 然后,我们转换数据,创建数据串,最后将数据标准化。
data_crit.show_batch(rows=3, ds_type=DatasetType.Train, imgsize=3)

让我们为分类器定义学习者。

loss_critic = AdaptiveLoss(nn.BCEWithLogitsLoss())def **create_critic_learner**(data, metrics):
    return **Learner**(data, gan_critic(), metrics=metrics, loss_func=loss_critic, wd=wd)learn_critic = **create_critic_learner**(data_crit, accuracy_thresh_expand)
  • 如果你说gan_critic,fast.ai 会给你一个适合 GANs 的二元分类器。
  • 因为我们有稍微不同的架构和稍微不同的损失函数,所以我们做了稍微不同的度量。accuracy_thresh_expand是相当于甘版的准确性对于评论家来说。
  • 最后,我们调用create_critic_learner来为 GANs 创建学习器。Fastai 数据块 API 有利于创建学习者。
learn_critic.fit_one_cycle(6, 1e-3)
  • 现在,我们有一个学习者,他非常擅长区分预测图像和高分辨率图像。
  • 这也是预测的行为,因为我们已经有图像很好的区分。

现在,我们有了一个生成器、分类器/评论家。让我们转到这一节的最后一部分。

完成 GAN

learn_crit=None
learn_gen=None**data_crit** = **get_crit_data**(['crappy', 'images'], bs=bs, size=size)**learn_crit** = **create_critic_learner**(data_crit, metrics=None).load('critic-pre2')**learn_gen** = **create_gen_learner**().load('gen-pre2')
  • 既然我们已经预先训练了发生器和批评家,我们现在需要让它在两者之间进行乒乓式的训练。
  • 你在每一件事情上花费的时间和你使用的学习率仍然有点模糊,所以 fastai 提供了一个GANLearner,你只需传入你的生成器和你的批评家(我们刚刚从我们刚刚训练的生成器和批评家中加载的)它就会继续前进
  • 当你进入learn.fit时,它会为你做这件事——它会计算出训练生成器需要多少时间,然后什么时候切换到训练鉴别器/批评家,它会前后移动。
**switcher** = **partial**(AdaptiveGANSwitcher, critic_thresh=0.65)
learn = **GANLearner**.from_learners(**learn_gen**, 
                                 **learn_crit**, 
                                 **weights_gen**=(1.,50.),        
                                 **show_img**=False, 
                                 **switcher**=switcher,    
                                 **opt_func**=partial(optim.Adam, betas=(0.,0.99)), wd=wd)**learn.callback_fns.append(partial(GANDiscriminativeLR, mult_lr=5.))**
  • 甘人讨厌你训练他们时的冲劲。用动力训练他们是没有意义的,因为你一直在发电机和批评家之间切换,所以这有点困难。所以这个数字(betas=(0.,...))当你创建一个亚当优化器的时候,就是动量去的地方,所以你应该把它设置为零。
  • 基本上,上面定义的超参数通常适用于 GAns。每个 GAN 问题都可能用到这些参数。
lr = 1e-4
learn.fit(40,lr)
  • 随着生成器变得更好,鉴别器(即批评家)变得更难,然后随着批评家变得更好,生成器变得更难。训练甘的困难之一是很难知道他们做得怎么样。了解他们做得如何的唯一方法是不时地看一看结果。
  • 如果你把show_img=True放入 GANLearner,然后它实际上会在每个历元后打印出一个样本。

做完这些,你可以检查下面的结果。

learn.show_results(rows=1)

最后,您可以将以前的结果与现在的结果进行比较。这就是甘斯发挥作用的地方。

GANs 的缺点

我们使用了一个 critic,它没有使用任何预先训练好的模型,比如 ResNet34,而是使用了 gan_critic()。因此,我们需要一个预训练的分类器模型,它不仅在 ResNet34 上训练,而且与 GANs 兼容。

这是我对甘斯的看法。感谢阅读,并继续探索 fastai。

受限三次样条

原文:https://towardsdatascience.com/restricted-cubic-splines-c0617b07b9a5?source=collection_archive---------9-----------------------

拟合回归线的一种灵活方法

样条是一种用于绘制曲线的绘图工具。在统计学中,样条是变换变量的一大类方法。我首先通过线性样条来介绍这个概念,然后用我的方法来介绍我(和许多其他人)推荐的受限三次样条。你应该知道有大量不同的样条,每一种都有其支持者。途径如下:

1.虚拟变量

2.无限制线性样条

3.受限线性样条

4.受限三次样条

在的一篇早期文章中,我向展示了分类(虚拟变量方法)不是一个好方法。它有两个基本问题:关系在每个段内是平坦的,而在段之间是跳跃的。在样条术语中,让一条曲线跳跃被称为“无限制的”。第二步消除了平坦性(但是给我们留下了跳跃的直线)。第三步去掉跳跃(但保留直线)。第 4 步让每个部分的关系曲线。结果是一个非常灵活的曲线,没有跳跃。受限三次样条(RCS)有许多优点,但是它们有一个很大的缺点:结果输出并不总是容易解释。

样条的两个方面,我们还没有触及的是允许的结的数量以及如何放置它们。已经提出了各种建议,但 Frank Harrell 建议,如果 N < 100,则使用 4 个结,对于较大的数据集,使用 5 个结,对于 k = 4,将它们放置在第 5、35、65 和 95 个百分点,对于 k = 5,将它们放置在第 5、27.5、50、72.5 和 95 个百分点(其中 k 是结的数量)。

举例来说,这一切可能会更清楚。为了比较,我将从正弦回归开始(就像我以前的帖子一样),我们应该遵循上面关于虚拟变量图的结的建议。这会产生:

第一步是允许每条线之间的斜率不为零。有些混乱的代码(该死的吉姆,我是数据分析师,不是程序员!)是:

mUnresLin1 <- lm(y~x, subset = (x6int == 1))
  mUnresLin2 <- lm(y~x, subset = (x6int == 2))
  mUnresLin3 <- lm(y~x, subset = (x6int == 3))
  mUnresLin4 <- lm(y~x, subset = (x6int == 4))
  mUnresLin5 <- lm(y~x, subset = (x6int == 5))
  mUnresLin6 <- lm(y~x, subset = (x6int == 6))

  plot(x[x6int == 1],mUnresLin1$fitted.values, 
       las = 1,
       xlab = "x",
       ylab = "y",
       col = "red",
       xlim = c(min(x),max(x)),
       ylim = c(min(y),max(y)))

  points(x[x6int == 2],mUnresLin2$fitted.values, 
        col = "red")

  points(x[x6int == 3],mUnresLin3$fitted.values, 
         col = "red")

  points(x[x6int == 4],mUnresLin4$fitted.values, 
         col = "red")

  points(x[x6int == 5],mUnresLin5$fitted.values, 
         col = "red")

  points(x[x6int == 6],mUnresLin6$fitted.values, 
         col = "red")

  points(x,y, pch  = 20, cex = .5)

这产生了

这已经是一个重大的改进,但是有跳跃(其中一个相当大)和方向的突然转变,这可能与早期模型中的跳跃一样难以证明。

接下来,我们可以用一个受限的线性样条来强制这些线匹配。这里已经有一个 R 函数,所以代码很简单:

install.packages("lspline")
  library(lspline)

mlinspline <- lm(y ~ lspline(x, quantile(x, c(0, .05, .275, .5, .775, .95, 1),
                             include.lowest = TRUE))) plot(x,mlinspline$fitted.values, 
     las = 1,
     xlab = "x",
     ylab = "y",
     col = "red",
     xlim = c(min(x),max(x)),
     ylim = c(min(y),max(y)))points(x,y, pch  = 20, cex = .5)

这会产生:

最后一步是让每一段内的线条弯曲。我们可以用受限制的三次样条来做到这一点;同样,有一个 R 包使这变得容易。

library(Hmisc)
library(rms)mRCS <- ols(y~rcs(x, quantile(x, c(0, .05, .275, .5, .775, .95, 1),
                              include.lowest = TRUE)))plot(x,mRCS$fitted.values,
     col = "red",
     xlim = c(min(x),max(x)),
     ylim = c(min(y),max(y)))points(x,y)

它产生:

这与原始正弦曲线非常匹配。

高级 Keras —准确恢复训练过程

原文:https://towardsdatascience.com/resuming-a-training-process-with-keras-3e93152ee11a?source=collection_archive---------4-----------------------

处理使用自定义回调的重要情况

Photo Credit: Eyal Zakkay

在这篇文章中,我将展示 Keras API 的一个用例,在这个用例中,从一个加载的检查点恢复一个训练过程需要以不同于平常的方式来处理。

TL;DR —如果您使用的自定义回调函数的内部变量在训练过程中会发生变化,那么您需要在恢复时通过不同的方式初始化这些回调函数来解决这个问题。

当使用 Keras 训练深度学习模型时,我们通常会保存该模型状态的检查点,以便我们可以恢复中断的训练过程,并从我们停止的地方重新开始。通常这是通过模型检查点回调来完成的。根据 Keras 的文档,保存的模型(用model.save(filepath)保存)包含以下内容:

  • 模型的架构,允许重新创建模型
  • 模型的权重
  • 培训配置(损失、优化器)
  • 优化器的状态,允许从您停止的地方继续训练

在某些用例中,最后一部分并不完全正确。

示例:

假设您正在训练一个具有自定义学习率调度器回调的模型,它会在每批之后更新 LR:

当回调被创建时,counter变量被初始化为零,并与全局批处理索引保持一致(在on_batch_end中的batch 参数将批处理索引保存在当前时期内)。

假设我们想从一个检查点恢复一个训练过程。通常的方法是:

The wrong way to do it

注意,LearningRateSchedulerPerBatch回调用counter=0初始化,即使在恢复时也是如此。当训练恢复时,这将不会重现保存检查点时发生的相同情况。学习率将从初始值重新开始,这可能不是我们想要的。

做这件事的正确方法

我们看到了一个例子,回调的错误初始化如何在恢复时导致不想要的结果。有几种方法可以实现这一点,这里我将描述两种方法:

解决方案 1:用正确的值更新变量

在处理简单的情况时,回调只有少量的更新变量,在恢复之前覆盖这些变量的值是相当简单的。在我们的例子中,如果我们想用正确的值count来恢复,我们将做以下事情:

解决方案 2:用 Pickle 保存和加载回调

当我们的自定义回调有许多更新变量或包含复杂行为时,安全地覆盖每个变量可能会很困难。另一个解决方案是在每次保存检查点时清理回调实例,然后我们可以在恢复时加载这个清理,并用所有正确的值重建原始回调。

注意:为了清理你的回调函数,它们不能包含任何不可序列化的元素。此外,在 Keras 版本< 2.2.3 中,模型本身是不可序列化的。这防止了任何回调的酸洗,因为每个回调也持有对模型的引用。

在这种情况下,恢复将如下所示:

您可能已经注意到,我使用了一个名为ModelCheckpointEnhanced的修改过的检查点回调。这是因为使用 pickless 方法意味着我们还需要ModelCheckpoint回调来保存相关回调的 pickle。这种修改后的回调的示例实现可能如下所示:

上面的例子处理了你只需要处理一个回调的情况,如果你有多个回调需要保存,你将需要执行一些小的修改。

摘要

我们看到了在某些情况下,采取天真的方法来恢复训练过程会导致不希望的结果。我们看到了两种处理这种情况的方法,以便在重新开始中断的培训过程时获得一致的结果。

我使用的例子来自我的草图-RNN 算法的 Keras 实现,这是一个用于生成草图的序列到序列变分自动编码器模型。

零售定价:充分利用机器学习

原文:https://towardsdatascience.com/retail-pricing-getting-the-most-out-of-machine-learning-b9fd9c4bbcf2?source=collection_archive---------20-----------------------

内部 AI

机器学习旨在帮助零售商提高生产率和利润

如果你正在阅读这篇文章,你可能正在寻找优化定价的新方法。简单地说,传统的方法已经不够好了。诚然,它们仍然运行良好,足以让你生存下来,但它们不足以让你领先于精通技术的竞争对手。在这篇文章中,作为 Competera 的价格优化专家,我想介绍两件事:机器学习在零售动态定价中的巨大潜力,以及如何为采用这项技术做好准备,以利用它提供的每一个机会。

零售业中的机器学习

多年来,大牌公司一直在动态定价中使用机器学习。最聪明的例子是亚马逊,它是最早采用这项技术的公司之一。毫无疑问,这是促使该公司市值大幅增长的因素之一:从 2008 年的 300 亿美元增长到 2019 年的近 1 万亿美元。其他使用机器学习的公司包括沃尔玛、Jet 和新蛋。

是什么让这些算法如此高效和流行?是它们处理海量数据的能力,使人类能够做出实时精确的决策。如今,零售市场变得越来越活跃,这意味着零售商需要比以往更频繁地改变价格。与此同时,每个企业都希望为自己的每一件产品制定最优价格。两个主要问题使得在没有 ML 的情况下很难进行价格优化:

  • 未来的不渗透性。在计算价格时,零售商不可避免地需要考虑需求对每件商品价格变化的反应。但是很难测量,因为它是非线性的、多因素的、延迟的(顾客有购物周期,并延迟接触新价格),并且严重受季节性、分销、广告和竞争行为等其他因素的影响。
  • 每周甚至每天要监控和重新定价的产品数量,这对于人类管理者来说已经不可能了。此外,通过改变特定产品的价格,零售商不可避免地会影响产品组合中许多其他商品的销售。每一个定价决策都必须考虑到这种影响,而定价经理如果不使用技术,根本无法做到这一点。

解决这两个障碍对人类来说似乎是不屈不挠的——并且越来越多地外包给自学算法。这些算法处理无限数量的定价场景(等于宇宙中的原子数量),以实时选择最相关的一个。他们考虑了产品组合中成千上万的潜在关系,以推荐单个价格,从而最大化整个产品组合的销售和收入。

我收集了几个基于机器学习的价格优化案例,以更好地了解零售商如何利用它来增长。

案例一

目标:在 100 多个价格区域提高收入和销售额

部门: 快消品

类型:离线

结果:商品销售额增长 15.9%,收入增长 8.1%,毛利润增长 9.8%

案例二

目标:在不损失利润率的情况下实现收入最大化

部门: 消费电子

类型:离线

结果:收入增长 16%,销售额增长 14%

案例三

目标:提升所有销售 KPI

部门: 礼品

类型:在线

结果:商品销售增长 24.7%,收入增长 9.3%

因此,定价中的自学算法对你的 KPI 非常有益。你需要采取什么步骤为他们做好准备?

准备好在定价中拥抱机器学习

要部署基于算法的定价解决方案并充分利用它们,你必须经历四个阶段:准备所有必要的数据、选择提供商或建立内部定价系统、教导你的团队,以及在过程中的每一步都改进系统。

数据

令人惊讶的是,准备和收集数据可能是一个巨大的挑战,因为数据通常是非结构化的,存储在不同的源中,并且有许多错误。做好准备可能需要几周甚至几个月的时间。在某些情况下,雇佣一个擅长数据管理的承包商会更好。但是好消息是:你只需要做一次。即使你计划使用机器学习来自动化所有的业务流程,如物流、库存管理或动态定价,并将它们整合到一个单一的生态系统中,你也需要在开始时准备好数据,因为无论你是在定价还是物流中使用它来采用 ML,它都会有或多或少的相似结构。

外部或内部定价解决方案

想象一下,你拥有自己的核心竞争力——将你与竞争对手区分开来并增加利润/收入的东西。但除此之外,你还需要擅长其他几十种处于你核心竞争力外围的事情。例如,你设法向顾客提供低价,并且是有利购买价格的行家,然而,你的利润不仅取决于低购买价格,还取决于最佳货架价格。因此,你需要学会制定既不太低也不太高的价格。能够做到这一点是一项全新的技术,需要数百万美元的研发投入。

在这个场景中有两个选项可供选择:

  • 雇佣一个核心业务是推荐最优价格的技术合作伙伴。
  • 投入数百万在你的公司建立一个定价中心,成为定价大师。

谈到定价,零售商需要准确地知道哪些产品更适合使用机器学习算法或基于规则的定价。你怎么知道的?分析您的投资组合并指出三组项目至关重要:

  • 草皮保护器或您与所有或大多数竞争对手共享的产品。它们会增加你的客流量,因为顾客会因为这些商品来到你的商店。在大多数情况下,购物者寻求此类产品的最低价格——你必须提供最低价格才能从竞争对手中脱颖而出。在这里你可以不用机器学习。你需要的是持续的竞争性价格监控和基于规则的定价。
  • 可以以更高价格出售的独家产品。在这里,你应该使用机器学习算法以某种方式改变价格,影响需求反应,并达到一个允许产生最大收入的最优价格。
  • 与竞争对手共享的产品,但不一定要有最低的价格来吸引顾客。由于购物者基于你的品牌影响力而非价格做出购买决定,你需要使用机器学习来计算你的品牌知名度可以让你提高这些特定商品的价格。

团队教育

一旦你的定价系统准备好了,是时候培训你的定价或品类经理了。他们需要了解自己在做什么,并接受算法提供的每一个价格建议背后的逻辑并不总是清晰的。基本上,他们需要学会信任算法,记住在使用算法之前,总有办法限制算法或测试他们的建议。与此同时,经理们需要意识到,算法通常会做出正确的决定:如果系统知道你的经理所知道的一切,它会表现得更好。因此,当与管理人员的专业知识相结合时,算法显示出更好的结果。

系统改进

你需要想出一个策略,并为定价系统提供一套在这个策略中需要达到的目标。您应该监视系统如何运行,并在运行过程中进行修正。如果你的目标和策略发生了变化,你需要相应地调整你的定价系统。

另外,你使用的定价系统必须尽可能的前沿。同样,你可以雇佣一个技术提供商来负责其解决方案的更新,或者创建一个专门的团队来监控机器学习中的所有技术进步,并将它们整合到你的系统中。

总而言之,我想在这篇长篇阅读中强调的是,对于不仅寻求生存,而且寻求繁荣的零售商来说,机器学习是一个真正有利的选择。要从中受益,你需要做四件事:

  • 准备好你的资料。
  • 构建内部解决方案或雇佣技术合作伙伴。
  • 教育你的团队。
  • 不断更新你的定价系统。

零售路径:使用空间数据提升零售

原文:https://towardsdatascience.com/retailtrails-4724d1f12a2f?source=collection_archive---------32-----------------------

在实体零售业的世界里,获得竞争优势依赖于产品和商店管理。正确的轮班管理需要详细了解商店的占用率、顾客在商店中的时间和空间数量。历史上,商店会通过付钱给一名员工站在外面统计进出商店的顾客数量来收集入住数据。技术已经进步,现在商店可以在商店入口和出口安装定制摄像头,并自动统计顾客人数。不幸的是,安装这些摄像机仍然成本高昂。更糟糕的是,随着时间的推移,错过的顾客进出造成的误差会越来越大,使得计数变得不准确。下一代商店入住模型方法的时机已经成熟。

为了我的洞察数据科学项目,我咨询了商店大脑(BotS)。BotS 希望通过使用计算机视觉(CV)实时跟踪客户,为实体零售带来实时人工智能。大多数零售商店已经安装了监控摄像头来监视整个商店。BotS 通过与一家公司合作,分析商店员工和顾客的实时跟踪数据,该公司通过 CV 算法传递预先存在的监控摄像头镜头。合作公司输出链接到时间戳的坐标数据(x,y ),我在这篇文章中称之为轨迹。然后,机器人使用这些轨迹来建立商店占用的空间和时间模型。

我的目标是修复计算机视觉过程中产生的一些错误。CV 的第一个也是最明显的错误是轨迹不稳定。一个明显的例子是有人走在柱子后面(相对于摄像机视图)。当他们走在柱子后面时,他们不再被 CV 识别,当他们再次出现时,他们被给予一个新的识别号。虽然这可能不会对整体占用产生影响,但在项目的第二部分,单个轨道的长度变得很重要,特别是当两个摄像机两次识别同一个人时。

多重标识问题需要多一点解释。许多商店使用重叠覆盖的多个摄像机来获得完整的商店覆盖。如果一个人同时走过两个摄像头的视野,那么我们的 CV 数据集将会有重复的轨迹,从而夸大了对入住率的最终估计。

原入住模式

在深入研究我的项目之前,我想先做好准备,讨论一下原始的居住模型是什么样子的。所有这些数据都是从加利福尼亚的一家化妆品商店收集来的。

首先,为了理解 CV 对商店占有率的估计有多准确,我需要商店占有率的真实值。机器人从用于轨道建设的原始监控摄像机镜头中构建了这个真实值,并以 10 分钟为间隔计算商店中的人数。

The store opened at 9:00am and there seem to be clear signals of increased occupancy around 11am and after work around 6:00pm. With fluctuating signals throughout the rest of the day.

然后,机器人数据科学家之一单独创建了原始计算机视觉数据的占用时间序列模型。

The raw CV model plotted against the ground truth data

从上图中我们可以看出,原始 CV 模型在某些区域低估了入住率,而在其他区域高估了入住率。该模型的召回率和准确率分别为 0.793 和 0.793。我开始使用算法方法来提高这个模型的精确度和召回率。我希望我的算法可以通过移除重复的轨迹来减少假阳性,并通过在以前不存在轨迹的时间段(由于轨迹不稳定)将轨迹缝合在一起来减少假阴性。

一针及时

为了找出哪些曲目要缝合在一起,我对每个可能的曲目进行了成对比较。在开始解释之前,我需要定义两个术语:焦点轨迹和比较轨迹。焦点轨迹是我们两两比较的第一个轨迹,也是正在结束的轨迹。比较轨迹是我与焦点轨迹进行“比较”的轨迹。比较音轨是第二音轨,也就是开始的音轨。我的总体计划是将焦点轨迹的终点与一个(或多个)比较轨迹的起点进行比较。然而,我使用的 10 小时数据集足够大,导致一些计算问题。我不能只比较每首歌的结尾和起点,因为 30,776 首歌有超过 9 亿种可能的组合!

相反,我开始收集可能的候选曲目。首先,我加入了一个时间参数,该参数决定了任何在焦点轨迹之后超过 1s 才开始的轨迹都将被延迟太久,以至于无法匹配拼接。然后对于每个候选轨迹,我计算了焦点轨迹的最后一点和候选轨迹的第一点之间的距离。然后,我通过包括 0.6 米的最大距离参数来进一步细分数据,因为 76%的候选轨迹距离焦点轨迹不到 0.6 米。最后,我在做比较时结合了焦轨的一些特征。我计算了过去 5 秒内焦点轨迹的平均速度,然后估计了在焦点轨迹和候选轨迹之间的时间间隔内平均速度可能行进的距离。虽然有人可能会迅速改变他们的平均速度(想象一下从随意浏览清仓区到跑过商店),但这种可能性很小。

在使用上述过程缩减潜在候选数据集后,我对每个焦点/候选轨迹对进行了成对比较。对于每一对,我计算了焦点轨迹的最后一点和候选轨迹的第一点之间的时空距离。时空距离听起来像一个奇特的概念,但实际上它是一个三维距离公式,第三维是时间。

Equation 1: Spacetime distance formula given the differences in x-coordinates (x), y-coordinates (y) and time (t)

使用这个公式的优点是,它对更长的距离和更长的时间间隔都不利。任何使时空距离最小化的轨迹都被认为是最终的候选轨迹。一旦我有了最终候选轨迹,我就从焦点轨迹的最后一点线性插值到最终候选轨迹的第一点。然后我给所有的音轨分配了和焦点音轨相同的 ID。

Two tracks that I identified as belonging to the same track and identified for future stitching. The green track is the focal track and the blue track is the candidate track.

复视

一旦我把这些轨迹拼接在一起,我需要解决多重识别的问题。与 BotS 合作的化妆品店客户在店里安装了四个摄像头。这意味着每个人在数据集中最多可能被识别 4 次!

为了解决这个问题,我使用了另一种侧重于距离的方法。像拼接问题一样,我首先需要减少潜在的比较。

第一步是找出哪些轨迹在时间上重叠,因为我只对同时的共同识别感兴趣。然后,我通过只检查来自不同摄像机的轨迹来进一步细分数据。考虑来自同一个摄像机的两条轨迹。即使这两个轨迹非常接近,也完全有可能每个轨迹都是一个独特的人,例如,一个母亲和一个孩子会在同一个摄像机中显示为两个非常接近的轨迹。两条非常接近但来自不同摄像机的轨迹实际上不太可能是唯一的个体。

对于从不同相机拍摄的每个重叠轨迹,我计算了焦点轨迹和比较轨迹中每个重叠点之间的欧几里德距离。然后我计算了两条轨道的平均距离。我认为平均距离不超过 0.8 米的比较轨迹相当于焦点轨迹。我估计这个距离是不同相机之间的近似投影误差。

Three tracks that have an average distance of less than 0.8m along their overlap in time

一个以上的重叠轨道可以被标记为相同的,当这种情况下,我设置一个决策规则来选择最长的轨道。虽然我们可能会丢失其他轨迹的一些信息,但最长的轨迹将拥有占用模型所需的最大信息。

对比入住模型

这些处理步骤产生了什么影响?回想一下,BotS 最终感兴趣的是为这家化妆品店构建一个入住时间序列模型。

我通过对以地面真实时间点为中心的 5 分钟窗口内的轨迹数量求和,计算了数据集中每个时间点的商店预期占用率。

Time series of ground truth (blue), raw CV data (orange), and my processed output (green).

相对于原始的计算机视觉模型,找出我的加工输出的准确趋势有点困难。所以我也画出了两者之间的差异。

Time series of the difference between the calculated occupancy from the ground truth. Positive values represent areas where the models overpredicted, negative values represent underprediction.

在这里,我可以更清楚地看到与原始 CV 占用模型相比,我的处理模型的影响。相对于真实情况,原始输出倾向于低估,而我的处理模型倾向于高估。这个结果体现在我的模型的精度和召回率上,分别是 0.734 和 0.834。因此,虽然我在模型中减少了假阴性的发生率,但却增加了假阳性的发生率。因此,我认为对机器人来说,最好的方法是使用原始 CV 输出和我处理过的模型创建一个集合预测模型。通过这样做,我的模型更可能高估的区域将被原始模型更可能低估的区域所平衡,反之亦然。

接下来的步骤

我的算法中内置了一些参数,我可以在其中进行一些优化。在拼接步骤期间,可以通过找到局部稳定区域来优化作为数据集子集的各种参数,在局部稳定区域中,参数的增加/减少对找到的匹配数量没有影响。然而,优化这个参数将是一个耗时的过程,因此只能在增加计算能力之后才能完成。更有可能的优化候选是在多重识别步骤期间。在这种情况下,调整最大距离参数或者改变用于比较的时间阈值都是相对便宜的,并且可以针对候选匹配的数量没有局部变化的参数进行优化。

除了优化我的算法,我认为随着这个数据集的发展,还有很多非常有趣的分析可以完成。例如,机器人可以获取经过处理的数据集,并检查每个轨迹的特征,以自动识别员工和客户。理论上,员工的轨迹特征(速度、点与点之间的方向)会有所不同。顾客更有可能有一条在商店里游荡的轨迹,而雇员更有可能做定向运动,或者长时间保持静止(例如收银员)。

不管接下来的步骤是什么,采用我处理过的模型并开发一个更准确的商店占用率模型,将不仅为机器人,而且为许多实体零售店提供真正的价值。

人工智能咨询中的预聘协议

原文:https://towardsdatascience.com/retainer-agreements-in-ai-consulting-f970f6933975?source=collection_archive---------14-----------------------

预聘服务是微妙但有用的

谷歌对预聘的定义是“预付给某人,尤其是律师的费用,以便在需要时获得或保留他们的服务。”在本文中,你将深入了解人工智能顾问如何考虑增加固定客户,而不是参与更标准的、有明确范围和持续时间的企业项目。

已经有一些很棒的文章介绍如何选择你作为顾问的时薪,我不会在这里重复。相反,我将专注于如何将引导和机会阶段的初始对话转变为客户维系或更标准的计时/固定费用项目。我认为,预聘是一种关系状态,而不是一种产品。

From this link

预聘谈话往往发生在一些初始项目之后,而不是第一天。原因很简单。在聘请顾问成为客户的一个重要选择之前,顾问真的需要在这种关系上投资。仅仅基于承包商的声誉签署聘用合同的风险太高了。

考虑到不同潜在客户的产品市场适合度是不同的,这是很有用的。鉴于人工智能咨询是一项服务业务,客户需要使服务符合他们的需求,承包商也需要确保他们处于良好的状态。

我喜欢把这个在聘用和定期聘用之间的决定看作是一个通用的服务行业难题,而不是人工智能行业特有的情况。让我们假设 AI 咨询是搜索引擎优化(SEO),一个聘约是 SEO 月费咨询,而开发的按小时或固定价格工作是标准工作(示例此处)。在这个类比中,客户每月向你支付 SEO 服务的佣金,因为你交付的是他们按月衡量的工作单位,比如流量、排名和销售额。此外,请注意,这是一个持续的努力,不会结束。没有所谓的“我们已经完成了搜索引擎优化”这个月费不是专业服务的小时,而是基于性能。另一方面,按小时或按天计费的东西,无论是人工智能、网络开发还是搜索引擎优化,都有固定的可交付成果,公司倾向于外包并支付费用,然后在内部管理。

From this link

这个内在与外在的思考过程让我想到了关于固定器的下一个观点。优秀的经理总是在进行“建造还是购买”的计算。在提案/RFP 阶段,经理正在考虑满足某些要求或改进某些 KPI,或解决某些棘手问题。正是在这个时候,他们考虑使用内部或外部资源。我们获得交易的原因是因为客户选择了购买而不是建造(除了一些例外,我将跳过,如培训和战略咨询和顾问委员会)。当一家公司考虑聘用协议时,同样的“建造与购买”思维过程也会发生。经理会考虑雇佣一个资源来填补职位空缺的成本和雇佣一个顾问来构建东西的成本。

有些客户就是不喜欢保持器。例如,根据我的经验,政府会保留供应商和供应商名单或专业服务合同,但通常不会指名道姓。我想这在高端法律工作和政治等其他领域是不同的,但在高端高科技领域,就我所见,这不是政府的事情。然而,这并不意味着政府不做家臣。相反,他们称之为固定成本的咨询服务。包括政府部门在内的一些客户可能有固定的小时工,这是无法确定的,而且他们还被分配了固定的年度或季度预算。在这种情况下,他们可能会聘请一名顾问,每年/每季度花 Y 小时做 X 量的工作。这是一个固定价格的项目,而不是预聘。不过,行话并不重要。事情就是这样。

From this link

一些客户更喜欢聘请顾问,因为他们期望在一个项目或一个部门中有不均衡的工作量,而他们确实需要做得更好。想想药物或医疗设备开发(大量的断断续续,遵循瀑布模型),或者安排一名顾问为现有的数据科学团队增加投入。

回头客对顾问来说是好事,因为它提供了更稳定的收入,对客户来说也是如此,因为他们不必不断地接触陌生人。有一些常见的安全问题会导致测试顾问可靠性的内部流程,避免一次又一次地这样做对客户有利。一个成功的聘请为双方提供了一些额外的好处。然而,如果每月聘用的价格太高,公司就简单地将工作安排到一个新的位置(如果他们可以的话),如果聘用的小时费率太低,那么顾问就简单地退出全价小时聘用。让我们深入研究一下这些数字,让您更具体地了解它是如何工作的。

对于咨询服务,我们收取 250 美元/小时或 2000 美元/天的费用。更多信息请点击。因此,10K/月 5 天/月的预聘听起来很聪明,但该公司也可以以 10K/月= 12 万/年的价格雇用一名员工来支付工资和福利,并获得一名全职员工而不是顾问。老实说,新员工和顾问一样容易被解雇,所以顾问需要从几个方面证明这种关系对公司来说是值得的。

第一:质量。咨询师牛逼。太棒了,以至于一个“普通”员工都无法增加同样的优秀、产出和洞察力。只有当关系增加了高质量时,保留才有意义。这是参加顾问委员会或参与管理规划会议的常见原因。有时(不总是)公司想宣传他们在和你合作。这基本上是顾问的免费营销,和公司的战略营销。其他时候有一英里长的 NDA 保持关系的秘密。

第二:价值。5 天的咨询提供的价值超过普通人 20 天的价值。这都是关于更好更快更强的代码和建议。

第三:灵活性。在合理的范围内,顾问将根据需要灵活调整工作规模,而不会修改预聘人员的价格。这种灵活性和规划为客户提供了价格一致性。如果客户突然需要大量的时间,额外的工作会有“数量折扣”,我们不需要为了提前交付客户需要的东西而签订合同。

第四:可用性。如果需要完成某件事,预聘客户会排在第一位。他们不会被其他一次性项目影响进度,事实上,他们的需求会影响其他项目,以最大化客户体验的服务质量。

第五:规模。顾问可以在关键时刻召集他们的团队。这有助于在不雇人的情况下扩大规模。

第六:小玩意。参差不齐的小工作真的很难包给外人。新来的家伙/女孩不知道小任务的背景,或者组织内的技术设置,因此将这些小任务推给圈内的顾问确实有助于消除公司内部团队的困难。很多律师搞 6 分钟计费时间增量。对于像电话这样的小项目,这种小额账单会被四舍五入。当咨询顾问这样做时,这是一个非常现实的问题,所以我不这样做。你也不应该。预聘使关系超越了一分一毫的追踪,进入了更有成效的工作领域,完成需要做的事情。

第七:知识传递。如果部署的系统由客户不断更新和维护,部署后支持可以融入到预聘协议中。他们可能想让顾问在兼职的基础上帮忙。通常情况并非如此,交接会结束契约,但有时情况确实需要这样做。从设计上来说,机构记忆永远不应由顾问掌握。保持合作的主要原因可能是随着时间的推移会有一些小的改进。这个迭代过程可能会给客户带来风险,他们希望通过让客户在产品开发的大推进之间做一些零星的工作来减轻风险。

第八:理科!ML/AI 中的很多东西 R & D 是 R 大于 D,R 真的不可能用固定大小的作用域来捕捉。相反,预聘协议有助于以固定的速度(消耗率)推进项目,顾问承诺推进项目的费用不超过每月 X 美元。这是一个典型的大公司或初创公司的研究单位。

第九:体验。引入与各种解决方案和客户需求互动的外部声音会有所不同。这就是拥有一个外部顾问委员会背后的想法。这种经验可以传递到企业的思维中,避免陷阱,并从企业泡沫之外的信息中发现机会。

第十:原因。非常明确地提出去做最有意义的事情。你不能追加销售预聘协议。相反,你提供它作为一个替代方案,继续你已经在按项目定价的关系。客户应该觉得预聘代表着双赢,而不是你想卖给他们的东西。

但是等等…

你应该而不是与某些客户做预聘有很多原因。到目前为止,我们一直在讨论预聘可能是一件好事。现在让我们来考虑一下为什么聘用合同的情况会出问题。我们的首席执行官马修·勒梅喜欢将警告信号称为“危险信号”。当谈到预聘协议时,一些客户挥舞着巨大的红旗。这些客户参与了一种特性蔓延、范围蔓延和重新协商策略的模式,您可以在非常严格的范围内针对每个项目进行处理,但您不希望在更加松散的保留关系中导航。把这个想象成一个晚餐伙伴。各付各的完全没问题。进入一个保持器就像轮流支付晚餐。如果你在情感上感觉到,当轮到你付钱时,客户想要一份 72 盎司的牛排,那么不要为了弄清楚这是否真的会发生而进入这种情况。在承诺这种更深层次的关系之前,咨询师需要对这种关系的良好基础有信心。从顾问的角度来看,如果你能持续地少赚一点钱,这是一笔公平的交易。如果假设不成立,那么坚持标准定价模型。

要点总结:

  • 如何考虑提供一个保持器
  • 有时候,一个保持器是适合客户的,但并不总是如此
  • 预聘需要是双赢的局面
  • 克服构建与购买的矛盾,以获得预聘
  • 有助于促进人工智能咨询聘用协议需求的因素有:质量、价值、灵活性、可用性、大量小东西、知识转移、科学、经验和理性
  • 不要轻易签订预聘协议

背景

我决定写这篇文章,因为我以前的文章引起了很多关注,也有一些戏剧性事件。巴黎 ML 学习小组为他们的讨论组“人工智能专业性:咨询、项目定价、交付结果”选择了我的文章“如何聘请人工智能顾问”和“如何为人工智能项目定价”。这部戏剧是关于抄袭其中一篇相同的文章,在LinkedIn 上的这篇文章和的后续文章中有最好的总结。事实上,同一周,我做了一个关于人工智能世界中的戏剧的网络研讨会(“人工智能:真相、谎言和彻头彻尾的谎言”)。我也在这个平台上接触到了 3K 的追随者(THX!),并伸手进行民调。这是我问的民意测验问题:

你喜欢读什么?

  • 生意上的事。我想赚钱。别给我看代码了。
  • 人工智能的应用。用代码做酷的东西。让我了解最新情况。
  • 创业故事。说出你的故事。激励我。
  • 一切。你做你的,伙计!

只有 52 人参加了投票。如果你没有收到邮件,并且想参与这样的事情,你可以加入简讯或者直接给我发邮件。我真的会看我的邮件。

以下是投票结果:

因此,似乎很大一部分观众最感兴趣的是看到酷的人工智能应用程序。我回应你的反馈。我的下一篇文章将会谈到这一点。我正在使用 2017 年我在上发表的一篇文章中的一些工作来制作 alpha 模型,根据公司的名称来解释小公司的类型。这里是库的代码。当我继续为这篇文章写东西的时候,你会注意到一些代码的提交。

马蒂厄·勒梅(Mathieu Lemay)和 T2 stallion . ai(T3)团队在迪拜的时候,我在渥太华经营商店,主要负责管理技术。Samuel 正在进行 AuditMap.ai 演示,我们通常只是在做我们该做的事情。

如果你喜欢这篇文章,那么看看我过去最常读的一些文章,比如“如何给人工智能项目定价”和“如何聘请人工智能顾问”还有嘿,加入快讯!

下次见!

——丹尼尔
lemay . ai
丹尼尔@lemay.ai

重新思考企业的人工智能/机器学习生命周期

原文:https://towardsdatascience.com/rethinking-ai-machine-learning-model-management-8afeaa31d8f8?source=collection_archive---------15-----------------------

企业对模型可再现性、可追溯性和可验证性的需求正在推动传统人工智能/机器学习交付生命周期的变化。这里有一些进化你的 AI/ML 生命周期的实用步骤。

Image by PublicDomainPictures from PixaBay

当前数据科学生命周期中存在显著差距

虽然数据科学家使用的技术和工具大幅增长,但数据科学的生命周期却停滞不前。事实上,从 20 多年前创建的最早版本的 CRISP-DM T1 到最近由领先供应商提供的生命周期,如 T2 谷歌 T3、T4 微软 T5 和 T6 数据机器人 T7,几乎没有什么变化。数据科学生命周期的大多数版本仍然处理相同的任务集:理解业务问题、理解领域数据、获取和工程数据、模型开发和培训,以及模型部署和监控(参见图 1)。

但是,随着数据科学深入大多数公司,企业需求也发生了变化。如今,模型的可再现性、可追溯性、可验证性已经成为大型企业对数据科学的基本要求。不幸的是,在领先的 AI/ML 生命周期中,这些需求被忽略或者被大大低估了。

Figure 1 — Current Data Science Lifecycles

为什么这些要求很重要?在金融服务中,可再现性、可追溯性和可验证性受到明确的监管(即:在欧盟、美国和加拿大)并且不容忽视。但是从医疗保健和生物技术到政府安全的许多其他行业也有类似的要求。事实上,现在即使是适度监管行业的企业也发现可重复性、可追溯性和可验证性的好处远远超过了它们的成本。

从许多方面来说,这并不令人惊讶:如果数据科学家可以轻松地修改几个月前最后一次工作的模型,而不必急于找到模型源代码和正确的训练文件,那么模型的更新速度和频率会提高多少?如果数据科学家能够确认训练数据血统,并始终如一地从原始来源重新创建训练文件,那么回答审计员和监管者的问题会更加容易和快捷?如果数据科学家可以轻松找到企业门控流程所需的生命周期输出,那么模型投入生产的速度会有多快?

大多数数据科学家都会一致认为,可再现性、可追溯性和可验证性的好处提高了他们的效率和敏捷性。

再现性、可追溯性和可验证性推动数据科学生命周期的成熟

考虑数据科学家经常经历的一些常见场景,以及当前数据科学生命周期中的缺点:

  1. 数据科学家必须解决导致模型性能下降的生产数据漂移:具有成熟生命周期的企业可以通过获取模型源代码和训练文件来快速重建模型基线,然后再现结果,之后可以更新和重新训练模型。不幸的是,在许多企业中,这个简单的场景很难实现,因为没有维护模型源代码和训练数据之间的联系。
  2. 数据科学家必须向审计员或监管者证明模型基于原始业务事件获得了正确的结果:在这种情况下,成熟企业中的数据科学家将能够展示原始数据文件是如何被正确地丰富、转换和/或聚合的,从而可以基于可追踪的数据谱系对模型进行可验证的训练。然而,大多数企业无法将培训数据谱系和相关的转换联系起来,而这些必须结合在一起才能形成可验证的模型。
  3. 在提升模型之前,数据科学家必须证明所有企业关口和检查都已成功完成:为了在成熟企业中促进这一结果,DEVOPS 和 MLOPS 流程将自动捕获关键工件和企业关口流程所需的 AI/ML 生命周期输出。不幸的是,很少有企业能够自动地(或者在某些不幸的情况下甚至是手动地)从 AI/ML 生命周期中捕获并保留关键的输出,这些输出是轻松快速地推广模型所必需的。

很明显,通过关注可再现性、可追溯性和可验证性,有很大的机会来提高企业数据科学生命周期的成熟度。真正的问题不是企业是否应该解决这些问题,而是企业必须以多快的速度解决这些问题。

新的数据科学生命周期推动者:生命周期目录

可再现性、可追溯性和可验证性是由几个简单的功能实现的:在数据科学生命周期中捕获关于模型的工件,存储这些工件,以及搜索和查看工件。这些功能是在当前数据科学生命周期的基础上稍微增加的,同时提供了一个工具,即“生命周期目录”,它提供了一个了解数据科学生命周期的窗口。

Figure 2 — Data Science Lifecycle Catalog

简而言之,生命周期目录是一个通向存储库的门户,该存储库包含模型源代码、模型培训文件、原始源数据和将数据转换为培训文件的程序的参考,以及在数据科学生命周期中捕获的其他工件:

  • 为了解决可再现性问题,生命周期目录提供了对模型源代码(包括当前版本和以前版本)的引用,并且用于训练模型的数据被保存在清单中
  • 为了解决可追溯性问题,生命周期目录维护对原始源系统数据和数据工程脚本的引用,这些数据工程脚本用于转换和丰富,从而提供对交付生命周期中所有数据更改的可见性。
  • 为了解决可验证性问题,对训练输出、日志和相关工件的引用——包括与模型偏差和“道德”检查相关的输出日志——由生命周期目录管理,从而获取模型有效性的证据。
  • 为了自动化信息捕获过程,生命周期目录将与 AI/OPS (DEVOPS for AI/ML)过程集成,以自动捕获上述工件。有趣的是,主要的云提供商、传统的 DEVOPS 供应商以及较新的 AI/OPS 初创公司正在提供工具和功能,这些工具和功能可以缝合在一起,以捕获许多所需的指标和元数据。

生命周期目录的门户允许企业的数据科学家在 AI/ML 生命周期中搜索、可视化和跟踪模型、相关数据和工件:

  • 为了推动敏捷性,生命周期目录允许数据科学家:(a)查看和管理他们的模型库存,(b)查看 AI/ML 模型和版本的状态(已部署、正在开发等),查看和管理对用于创建每个 AI/ML 模型的培训资产和相关数据沿袭资产的引用,(d)查看和管理对在整个 AI/ML 生命周期中生成的工件的引用。
  • 为了提高效率,生命周期目录提供了对所有受治理的 AI/ML 工件的访问。考虑一个这很关键的场景:首先,许多组织现在必须证明模型是无偏见的,并提供符合公司道德准则的结果——在这种情况下,保留偏见测试输出来提供这种证明。
  • 为了解决安全性问题,只有经过身份验证和授权的个人才能访问生命周期目录,他们可以查看和/或管理 AI/ML 模型、部署或培训资产。
  • 为了提高效率,生命周期目录提供了企业把关流程所需的所有证据,从而为“自助式” AI/ML 治理提供了潜力。

生命周期目录是数据科学生命周期的“记录簿”,允许数据科学家对企业的所有数据科学资产进行可视化、分类、分组、管理和治理。生命周期目录是数据科学生命周期中缺失的环节,可满足企业对可再现性、可追溯性和可验证性的基本需求。

重新思考人工智能/机器学习的云安全

原文:https://towardsdatascience.com/rethinking-enterprise-data-security-and-privacy-for-cloud-native-ai-machine-learning-f2df9009bc6d?source=collection_archive---------21-----------------------

旧的安全方法跟不上 AI/ML 对数据的需求。一个现代的云安全架构需要考虑什么?

Photo by Cederic X on Unsplash

为什么云原生 AI/机器学习在企业中停滞不前?

像之前的通用计算一样,人工智能/机器学习对数据的贪得无厌创造了对灵活容量和高级计算的巨大需求。看起来,人工智能/人工智能在云上的进军正在进行,早期采用者正在建立滩头阵地。

然而,最近的头条已经迫使企业非常谨慎地行动——以至于即使将少量敏感数据迁移到云中也是一项艰巨而耗时的工作。

毫不奇怪,AI/ML 的独特需求正日益与企业传统的谨慎安全策略产生严重冲突。

在我上一篇 文章 中,我证明了这种谨慎是绝对必要的——坦率地说,存在有效的数据安全和隐私问题。这些担忧是实质性的,也是严重的。这些问题——直到得到解决——将继续阻碍云原生 AI/ML 在企业中的采用,这似乎是很恰当的。

旧的安全方法不起作用

这个行业已经承认过去有效的方法今天可能不再有效。更具体地说,成功用于保护内部数据中心的老把戏需要重新设计,以适应云。

大多数人认为这种脱节是许多因素共同作用的结果——更聪明的黑客拥有更好的工具,加上许多企业的云安全实践相对不成熟。这显然是真的。然而,我认为事情远不止如此。

我的经验表明,企业可能需要重新思考他们如何在云上处理数据安全和隐私。我认为 McKinsey 最恰当地陈述了:“大多数传统 it 环境采用基于边界的‘城堡和护城河’安全方法”,宣称我们需要重新思考云的安全方法,因为它们“更像现代酒店,在那里,钥匙卡允许进入某些楼层和房间”。

旧城堡对现代酒店。护城河对钥匙卡。我们不再建造城堡和护城河是有原因的。更好的理由是考虑用更新的方法来解决数据安全和隐私问题。

在本文中,我将讨论所谓的“城堡和护城河”安全方法的缺点。然后,我将解释并建立麦肯锡倡导的“现代酒店房间”和“钥匙卡”概念,希望这将提供一个架构基础,以克服阻碍企业在云上采用 AI/ML 的有效安全和隐私问题。

Photo by Jerome Granados on Unsplash

城堡和护城河以及网络安全边界

许多企业仍然采用基于网络边界的安全方法。他们用更厚更坚固的网络墙建造数据中心“城堡”。他们用护城河来阻挡敌人,用吊桥来接纳朋友和客人。但这是基于一些有缺陷的假设。

第一个是墙壁并不那么好用。可能最好认为它们是必要的,但不是充分的。在过去,“城堡和护城河”的策略可能会赶走敌人。相对于今天,他们拥有更简单、效率更低的工具。但是敌人现在更聪明,有更好的武器。

有了这些新武器,敌人再也不用走前门了。相反,他们寻找砖块之间砂浆的裂缝——所需要的只是一个不为人知的小开口,让坏事发生。事实上,来自 Capital One 的头条暗示,即使是最好的“墙”也有裂缝。

第二个有缺陷的假设是,旧的数据中心“城堡”安全设计足够好,表明同样的方法可以应用于新的云环境。数据中心“城堡”几乎完全专注于其边界,认为数据中心内的资产在默认情况下是安全的。因此,重点主要是保护周边地区,而不是周边地区的资产。

另一方面,云安全原则是相反的。许多资源,除非明确受到保护,否则默认情况下是不安全的,无法通过互联网访问。是的,必须创建一个安全的边界,但是在许多情况下,边界内的资产也必须是安全的和锁定的。不幸的是,相对于保护云资产所需的深度和广度,许多企业的安全能力还不成熟。

最后,企业给了来宾(或员工)好处,一旦他们进入数据中心的“城堡墙”,通常可以访问他们想要的任何内容,或者至少是他们想要的大部分内容,而安全控制却少得多。但是,如果有人获得了对敏感数据的访问权,他们能够带着企业的资产离开“城堡”吗?

不幸的是,是的。在“城堡和护城河”战略中,重点通常是保护入口,较少关注一旦进入后会发生什么,更少关注保护出口。但是正如最近的头条新闻所暗示的,一旦被授权的个人——在这个特殊的例子中,是一个雇员——有权使用城堡的资产,那么把它们拿出来似乎相对简单。

为了解决这个问题,对云的关注必须是确保没有数据泄露的机会。即使有权访问敏感数据的个人也不得允许数据“泄露”到云安全边界之外。

然而,AI/ML 对数据的贪婪胃口大大增加了赌注。为了在云上实现“零泄漏”机会,必须考虑新的方法。

很明显,我们不再建造真实世界的城堡和护城河是有原因的。同样,我们也有理由避免构建数据安全和隐私“城堡和护城河”来保护我们在云上的企业数据资产。

基于身份的安全边界

过去,主要的安全边界是基于网络安全(“城堡和壕沟”策略),其目标是建立一个不可渗透的网络屏障。前提是有了安全的网络边界,网络中的所有系统和资源都是可信的。

当时,这是有意义的,因为大多数应用程序和资产几乎只存在于数据中心内部,或者只在数据中心内部协作。

然而,时过境迁。如今,人们期望资源(应用程序、数据等)。)将可通过互联网访问,无论您身在何处。设备(例如,BYOD)和云应用的爆炸式增长现在旨在利用这种位置中立性和开放网络。

但是旧的网络边界方法没有考虑到云的相对“开放性”,使企业容易受到攻击。这就造成了这样一种情况,一旦可信边界内的单个端点受到威胁,敌人就可以迅速在整个网络中扩大立足点。

更糟糕的是,敌人变得越来越聪明,获得了更好的工具,导致网络边界变得更加漏洞百出。

实际上,以网络为中心的思维变得不那么相关了。有人可能会说,现代云安全方法现在应该在网络边界可能被攻破的明确假设下进行设计。

这导致了一种新的安全模式:今天,身份成为新的安全边界。身份边界确保您是您所说的那个人,然后完全根据与您的身份相关联的授权来分配权限。

简而言之,资源可能被设计为利用云的“开放性”,但是如果没有适当的基于身份的认证和授权,任何资源都不能被访问或影响。

考虑到这一点,云数据安全和隐私设计原则的更好比喻可能是“现代酒店”,而不是“城堡和护城河”。

Photo by Jordan Pulmano on Unsplash

现代酒店

任何去过一点地方的人都能体会到现代酒店的体验。前门是敞开的,很受欢迎。在我们的“现代酒店”类比中,从数据安全和隐私的角度来看,企业的云租户就是酒店。

酒店的新客人会看到一个前台——在我们的比喻中是企业的互联网角色——它充当酒店的前门(图 1 中的“2 ”),可能对所有客人开放。

但是你需要登记才能走得更远。基于身份的安全边界(图 1 中的“1”)从这里开始。

在登记入住时,您的身份得到验证,一旦您付款,您将获得一张授权您进入指定房间的钥匙卡(图 1 中的“3”)。

但是,只有由您的酒店钥匙卡配置的房间和服务可供您使用。事实上,除了你自己的房间,所有其他房间都是关闭的,你可能会(礼貌地)拒绝未经你的钥匙卡授权的服务。

从这个意义上说,“酒店房间”和“钥匙卡”这两个术语似乎非常合适,它们表示以有利于需求的规模和方式消费服务的灵活性,以及按需容量,即服务可以在需要时消费。

继续类比,“房间”(图 1 中的“4”)有“墙”,这些墙提供了一个不可渗透的安全边界,允许在企业的云租户中有安全的处理区域。与酒店服务类似,默认情况下,企业的服务或房间不可用(关闭),只有在有效的身份验证和授权(由您的身份提供)后,服务才可用。

和现代酒店一样,这里有不同类型的房间,每种房间都有不同的配置以满足不同的需求。从 AI/ML 的角度来看,我们在企业的云租赁中有两种不同的房间类型,每种类型都可以满足特定的需求。

首先,我们需要专门设计的“数据存储室”(图 1 中的“5”),以确保敏感数据被安全地存储,并且仅被授权的实体(人或应用程序)访问。这些房间还可以配置为支持更强的安全控制,如静态数据加密,如果数据的敏感性需要这种功能。

其次,我们需要“数据处理室”(图 1 中的“6”),授权实体可以在这里安全地访问和处理敏感数据。

并总结我们的类比,像许多酒店房间一样,一个房间可以连接到另一个房间(图 1 中的“7”)。在我们的例子中,数据处理室将访问数据存储室,以允许 AI/ML 探索和训练活动。

顺便说一句,“房间”可能看起来类似于单个虚拟机。每个都有一个安全的边界,但相似之处可能就到此为止了。然而,与虚拟机不同,“房间”的功能是多样的、分布式的,并且实际上是由虚拟机集群部署的。

数据安全策略必须为云而发展

希望很明显,旧的数据安全方法需要重新考虑,以适应云。然而,这并不是说旧的方法应该完全抛弃。

仍然需要一个安全的边界。网络安全还是要落实的。

但是,旧的方法也必须不断发展,以应对云带来的独特的安全和隐私挑战。所谓的“城堡和护城河”变成了“有钥匙卡的酒店”,有基于身份的安全边界,定义了经认证和授权的客人可以执行的操作。

我们的新方法提供了“房间”,这些房间成为安全区域,是为云上的 AI/ML 特定需求定制的。它们既灵活又安全——可以按需创建(数据处理室),并支持安全的数据处理或安全的持久存储(数据存储室)。

最后,本文为理解云上 AI/ML 特有的安全挑战提供了基础。它还提供了一个类比——有房间、墙壁和钥匙卡的现代酒店——为云上的数据安全和隐私提供了一个新概念基础。

在本系列的下一篇也是最后一篇文章中,我将深入描述如何实现“酒店”、“房间”和“钥匙卡”来支持云上的安全 AI/ML。此外,下一篇文章还将讨论必须到位的云管理技术,以支持这些功能,并允许企业自信地启动和加速云原生 AI/ML 在企业中的采用。

反思工作中的思维

原文:https://towardsdatascience.com/rethinking-thinking-at-work-1e5b7bc02f53?source=collection_archive---------42-----------------------

数据科学需要深入思考和多学科协作。现代办公环境对两者都是适得其反的

Rodin’s The Gates of Hell (AKA trying to work in open floor plan office on Halloween)

罗丹的预感:当我们大多数人想到罗丹最著名的雕塑《思想者》时,我们会想象出一个孤独的人站在基座上,陷入沉思。当然,这是因为这就是著名的 1888 年青铜雕塑及其复制品在博物馆和照片中呈现给我们的方式。但在《思想者》作为个人表演首次亮相之前,他是后来成为 37 年杰作《地狱之门》的合奏演员之一。仔细观察这幅作品,“思想者”若有所思地坐在一群暴民中间(见标题图片)。虽然艺术史学家会告诉我们,这件作品的灵感来自但丁的地狱,但我看到了时间旅行的证据——或者至少是未来的预感。否则,他怎么能如此清晰地想象出在 2019 年的万圣节,作为一名数据科学家,在与一家数字机构共享的 WeWork 开放式平面办公室中努力完成工作是什么感觉?对于关心生产力的“思考者”来说,现代办公环境真的感觉像是地狱之门。是时候重新思考我们被教导的如何管理团队以提高生产力和协作,并给人们时间和空间进行有计划的、不间断的思考。

忙碌并不等同于高效:我们一生都被告知,工作意味着积极参与一项活动。从每天的开始到结束,就好像我们在进行多任务耐力测试。当然,结果往往会得到回报——但让人们看起来持续活跃的行为也是如此,不管他们是否真的完成了什么。早在小学时,“举手者”就受到奖励,“白日梦者”受到嘲笑。在课间休息时独自阅读或凝视天空被认为是反社会的,或者充其量是一个令人担忧的理由。在以后的生活中,这些词会变成“冷漠”或“脱离”,但前提是一样的——工作是的地方,而不是思考的地方。如果你是,比如说,一个酒保,这很有道理…但是如果你的职业依赖于你专注和深入思考的能力来完成你的工作呢?

做作的合作扼杀了独立思考:在当今的工作场所,找到一个专注的时间和地点是很难的,这对于创新和生产力来说是必不可少的,尤其是在需要不断在创造性和定量思维之间转换的职业中。人们不认为数据科学是一个创造性的职业,但我工作过的最有才华的数据科学家能够在定量和创造性世界的交叉领域出类拔萃。从规划数据结构,到选择正确的数学方法,再到解释现实生活中的含义,然后用非技术交流的方式表达出来,这些都需要数小时不间断的专注。今天的工作环境已经将如此多的努力集中在试图诱导协作上,以至于在许多情况下,一个人不得不在沉默中思考的唯一选择是完全避开办公室。对即时通信的需求、认为远程工作是“休息时间”的主管以及强迫人为协作的办公室布局加剧了这种困境,这是颠覆他们试图培养的生产力和协作的秘诀。

反思协作思维:如果我们真的想从团队中获得最大收益,我们需要让他们远离噪音和干扰,腾出时间进行深入思考。我们需要消除这样一种观念,即独处是一种奢侈品或特殊恩惠,只有仁慈的主管才能给予。与团队合作的时间对于团队的成功仍然至关重要,但当每个人带着他们的最佳想法来到谈判桌前时,这些时间会更有成效——而我们没有培养有利于实现我们最佳想法的工作环境和实践。

关于独处的好处,我强烈推荐艾特金·坦克的文章 独处:原创思维的秘密https://medium . com/swlh/Solitude-The-secret-to-original-thinking-c5ac 755184 EC

基于 U-Net 结构的视网膜血管分割

原文:https://towardsdatascience.com/retinal-vasculature-segmentation-with-a-u-net-architecture-d927674cf57b?source=collection_archive---------9-----------------------

视网膜脉管系统所展示的结构推断出关于诸如早产儿(RoP)、糖尿病性视网膜病(DR)、青光眼、高血压和与年龄相关的黄斑变性(AMD)等广泛的视网膜病理的关键信息。这些病理是失明的主要原因。视网膜脉管系统的精确分割对于各种眼科诊断和治疗过程是重要的。

在过去的几十年里,许多研究都集中在开发用于视网膜血管分割的自动化和精确的技术上。随着近年来机器学习、深度学习和计算机视觉的兴起,研究人员已经找到了应用这些技术为医学、生物学和医疗保健中存在的问题提供解决方案的方法。

在这些技术中,U-Net 是一种有趣的深度学习网络架构。它是由 O. Ronneberger,P. Fischer 和 T. Brox 在 2015 年开发的,可以归类为用于生物医学图像分割的全卷积神经网络(CNN)。U-Net 论文的作者写了以下内容。

…在本文中,我们提出了一种网络和训练策略,它依赖于对数据扩充的大量使用,以更有效地使用可用的带注释的样本。该架构由一个捕获上下文的收缩路径和一个支持精确定位的对称扩展路径组成……

U-Net 不需要大量的训练数据,这使得它非常适合于生物医学图像分析,因为生物医学领域中的图像相对稀缺。在本文中,我们将讨论如何编写一个简单的 U-Net 架构来解决视网膜血管分割问题,以及如何评估算法的性能。

A Retinal Image

我已经使用了“驱动:用于血管提取的数字视网膜图像”数据集来训练网络。在数据集中,有两个文件夹,即“培训”和“测试”。“训练”文件夹包含 20 幅视网膜图像及其血管遮罩。“训练”文件夹中的 17 幅图像及其血管遮罩被用作训练集。剩余的 3 幅图像及其血管掩模作为验证集。测试文件夹包含 20 幅图像和两种类型的血管屏蔽(1st_manual 和 2nd_manual)。1st_manual vessel masks 被视为黄金标准,以便在评估性能时可以将人工注释(2nd_manual)与黄金标准进行比较。将 20 个图像及其血管掩模(1st_manual)作为测试数据。视网膜图像是 3 通道图像(RGB ),而它们的血管掩模是二进制图像。驱动器上的原始图像尺寸为 565 × 584。在将训练集、验证集和测试集保存在“. hdf5”文件中之前,它们的大小被调整为 512 × 512。

下图展示了我们将要考虑的 U-Net 架构。

The U-Net framework

以下要点包含了我们可以用来训练模型的 U-Net 架构。架构是用 keras 写的。

U-Net architecture coded in python (with Keras)

由于我们的训练集相当小,使用数据扩充技术来增加训练数据的大小是有帮助的。为此,我们可以使用 keras 的 ImageDataGenerator 类。它使您能够配置图像准备和增强。这个类的伟大之处在于它能够在模型拟合过程中创建扩充数据。数据生成器实际上是一个迭代器,当模型拟合算法请求时,它返回成批的增强图像。

为了准备用于训练的数据,我们必须首先在区间[0,1]内重新调整它们。当扩充我们的数据时,我们可以使用随机旋转。这些随机旋转的角度范围可以在数据生成器中指定。这将使我们的模型旋转不变,因为模型将看到不同方向的图像。此外,我们可以使用水平和垂直随机移动作为增强技术。通过在具有不同垂直和/或水平位移的图像上训练我们的模型,我们可以使我们的模型平移不变。缩放是我们可以使用的另一种增强技术。这将使我们的模型比例不变。我们可以如下配置上述图像数据准备和增强技术。

datagen_args = dict(
             rescale=1./255,
             rotation_range=90,
             width_shift_range=0.1,
             height_shift_range=0.1,
             zoom_range=0.2
)

在数据准备和扩充期间,我们必须确保蒙版得到的变化与我们应用于图像的变化相同。下面的函数会解决这个问题。

def get_generator(self, images, masks):
    image_datagen = ImageDataGenerator(**datagen_args)
    mask_datagen = ImageDataGenerator(**datagen_args)

    seed = 1

    image_generator = image_datagen.flow(images, seed=seed)
    mask_generator = mask_datagen.flow(masks, seed=seed)

    return zip(image_generator, mask_generator)

现在,我们可以定义模型的训练例程。我们将使用学习率为 0.0001 的 Adam 优化器。损失函数将是二进制交叉熵,因为我们正在处理像素标记问题。(血管区域= 1,非血管区域= 0)。我们将训练 50 个时期的模型,同时每个时期有 200 个步骤,我们的批量大小是 32。这样,由于我们之前定义的图像增强配置,该模型在每个时期将看到 32 × 200 = 6400 幅图像。每当在给定时期结束时损失得到改善,我们就将我们的模型权重保存到“. hdf5”文件中。此外,我们将实现一个有 10 个周期的耐心(没有改善的周期数,在此之后训练将被停止)的早期停止。

compile_args = dict(
            optimizer=Adam(lr=1e-4),
            loss='binary_crossentropy',
            metrics=['accuracy']
)earlystopper = EarlyStopping(
            patience=10,
            verbose=1
)model_checkpoint = ModelCheckpoint(
            self.model_path,
            monitor='loss',
            verbose=1,
            save_best_only=True
)model.compile(**self.compile_args)train_generator = self.get_generator(x_train, y_train)
val_generator = self.get_generator(x_val, y_val)model.fit_generator(
            train_generator,
            epochs=50,
            steps_per_epoch=200,
            verbose=1,
            callbacks=[model_checkpoint, earlystopper],
            validation_data=val_generator,
            validation_steps=10
)

训练完成后,我们可以评估我们的模型。为了评估该模型,我们可以使用性能指标,如 F1 分数、准确度分数、受试者-操作者曲线(ROC) AUC 和精确度-召回率(PR)曲线 AUC。绘制 PR 和 ROC 曲线可以很好地了解模型性能。

我们还可以绘制一个选定的视网膜图像(来自测试集),它的血管掩模由人类注释者创建,它的血管掩模由我们的 U-Net 模型预测。

From the left : Original retinal image, vessel mask annotated by a human and the predicted vessel mask using the U-Net model

这篇文章到此结束。请在评论中告诉我你的问题。U 网快乐!

参考资料:

  1. https://machine learning mastery . com/image-augment-deep-learning-keras/

在 Python 中检索 OpenStreetMap 数据

原文:https://towardsdatascience.com/retrieving-openstreetmap-data-in-python-1777a4be45bb?source=collection_archive---------8-----------------------

关于如何使用 Google Colab 通过 Python 访问 OpenStreetMap 数据库的指南。

OpenStreetMap — Source

如果您想从 OpenStreetMap (OSM)中检索地理空间数据,您可以下载它,但这需要时间和存储空间。无需离开您的开发环境(Jupyter 笔记本),您就可以访问和检索 OpenStreetMap 数据。假设您正在进行分析,并想找出您感兴趣的区域内有多少娱乐设施或餐馆。

在本教程中,我们将学习使用 python 包 OSMNX 检索 OpenStreetMap 数据。

OSMnx 是一个 Python 包,允许您从 OpenStreetMap 的 API 下载空间几何图形并对街道网络和其他空间数据进行建模、投影、可视化和分析

在接下来的三个部分中,我们从 OpenStreetMap 中检索三种不同的数据:作为兴趣点的咖啡馆、建筑物和街道网络。我们还探索了使用 leav 的地理空间数据可视化。

街道

我们首先创建一个变量来保存我们感兴趣的区域。你可以随意探索任何你想去的地方,但是我在本教程中使用利物浦市(注意你的区域越大,计算时间就越长。)

place = “Liverpool, United Kingdom”graph = ox.graph_from_place(place, network_type=’drive’)

通过上面两行代码,OSMnx 允许我们快速检索城市的街道网络。结果是一个 Networkx 类,我们将其转换为 Geopandas 以进一步处理数据。让我们看看如何将它转化为 Geopandas 地理数据框架。OSMnx 自带的“graph_to_gdf”功能可以轻松做到这一点:

nodes, streets = ox.graph_to_gdfs(graph)streets.head()

现在,如果我们看数据,它被转换成熟悉的熊猫数据框的形式,具有额外的地理数据处理能力。

Retrieved streets

您可以使用您选择的任何工具(在我们的例子中是 Pandas)来处理检索到的数据,或者使用任何 Python 库来可视化您的数据。假设我们想要获得街道类型的条形图。下面的过程只是纯粹的熊猫功能与 seaborn 数据可视化。

street_types = pd.DataFrame(edges["highway"].apply(pd.Series)[0].value_counts().reset_index())street_types.columns = ["type", "count"]fig, ax = plt.subplots(figsize=(12,10))sns.barplot(y="type", x="count", data=street_types, ax=ax)plt.tight_layout()plt.savefig("barchart.png")

这是数据的输出条形图。住宅区街道在该数据集中出现频率最高。

Bar chart — Street types

我们还可以通过使用 Python 中您最喜欢的地理空间可视化工具,使用地图来可视化街道数据。我在这里用叶子。

style = {‘color’: ‘#F7DC6F’, ‘weight’:’1'}m = folium.Map([-2.914018, 53.366925],zoom_start=15,tiles=”CartoDb dark_matter”)folium.GeoJson(edges.sample(), style_function=lambda x: style).add_to(m)m.save(“edges.html”)m

输出是利物浦所有街道的美丽地图。不需要下载数据,上传,用熊猫看。

Streets Visualized in Folium

在下一部分中,我们将检索利物浦 OpenStreetMap 数据中所有可用的建筑。

建筑足迹

为了检索建筑占地面积,我们使用 OSMnx 的“footprints_from_place”功能。我们需要传递这个地方的名称。

buildings = ox.footprints_from_place(place)
buildings.shape

建筑物数据集有 27329 行和 185 列(请注意,随着 OSM 用户更新该区域的任何要素,这可能会发生变化)。让我们看看我们检索到的建筑物数据集的子集。

cols = [‘amenity’,’building’, ‘name’, ‘tourism’]buildings[cols].head()

Building table

我们还可以绘制建筑地图。由于较大的数据集,lyum 可能无法在笔记本中正确显示它,但您可以保存它并在浏览器中打开它。

style_buildings = {‘color’:’#6C3483 ‘, ‘fillColor’: ‘#6C3483 ‘, ‘weight’:’1', ‘fillOpacity’ : 1}m = folium.Map([ 57.70958, 11.96687],zoom_start=15,tiles=”Stamen Toner”)folium.GeoJson(buildings[:1000], style_function=lambda x: style_buildings).add_to(m)m

A subset of Building footprints in Liverpool.

兴趣点(咖啡馆)

我们还可以从 OpenStreetMap 数据集访问和检索其他一些基于点的数据集。OSMnx 还具有 ox.pois_from_place()功能,您可以在其中传递对舒适性参数感兴趣的变量。可用设施列表可从 OpenStreetMap Wiki 获得。

在这个例子中,我们检索利物浦的咖啡馆。

cafe = ox.pois_from_place(place, amenities=[“cafe”])
cafe.head()

这是咖啡馆数据集的一个子集,其中有一个名称、轮椅可用性和开放时间列。但是,有些列没有数据。

最后,让我们在地图上标出这些咖啡馆。

cafe_points = cafe[cafe.geom_type == “Point”]m = folium.Map([53.366925, -2.914018], zoom_start=10, tiles=”CartoDb dark_matter”)locs = zip(cafe_points.geometry.y, cafe_points.geometry.x)#folium.GeoJson(buildings, style_function=lambda x: style_buildings).add_to(m)for location in locs:folium.CircleMarker(location=location,color = “#F4F6F7”, radius=2).add_to(m)m.save(“cafes.html”)m

以下是利物浦 OpenStreetMap 数据库中所有咖啡馆的地图。

Cafes in Liverpool

检索 OSM 数据可以与你的任何其他数据分析或可视化项目相结合。尝试任何你感兴趣的地方。请注意,如果您发现您感兴趣的区域没有足够的数据,您可以贡献 OpenStreetMap 数据。

结论

在本教程中,我们使用 OSMnx 检索 OpenStreetMap 数据,并使用 Pandas 和 Geopandas 处理它。我们还了解了如何使用 leav 可视化地理空间数据。

本教程的笔记本是可用的。你可以直接在 Google Colab 中运行这个。

[## 谷歌联合实验室

编辑描述

colab.research.google.com](https://colab.research.google.com/drive/1Rpg0uFFMRB8Im3c32lO6J5-821vIt5p5)

Python 中的反向地理编码

原文:https://towardsdatascience.com/reverse-geocoding-in-python-a915acf29eb6?source=collection_archive---------0-----------------------

如何将原始的纬度/经度转换成带有地址的有洞察力的数据。

Photo by Devin Avery on Unsplash

许多数据集只有坐标——纬度和经度——与我们人类识别的地址、街道名称、建筑名称或邮政编码等可识别特征没有任何关联。反向地理编码是许多位置数据科学应用中的重要组成部分。将原始坐标转换为有洞察力的位置数据要素的过程称为反向地理编码。

反向地理编码是将一个点的位置(纬度、经度)反向(反向)编码为可读地址或地名的过程。— 维基百科

Reverse Geocoding

在本教程中,我们将介绍如何使用 Python 执行反向地理编码。我们使用 Pandas 和 Geopy 库来提供反向地理编码。在下一节中,我们将介绍一些基础知识,并将单点坐标转换为带有邮政编码和建筑物名称的地址。

反向地理编码单一示例

让我们先导入我们的库。

%load_ext autotime
import pandas as pd
import geopandas as gpd
import geopy
from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiterimport matplotlib.pyplot as plt
import plotly_express as pximport tqdm
from tqdm._tqdm_notebook import tqdm_notebook

我们现在可以构建我们的地理编码器。我们首先需要指定地理编码服务。您可以访问不同的服务,包括'google''bing''yahoo''openmapquest'。其中一些服务在特定限制后收取少量免费费用,但在我们的示例中,我们将使用 Openstreetmap 的免费地理编码服务。

locator = Nominatim(user_agent=”myGeocoder”)coordinates = “53.480837, -2.244914”location = locator.reverse(coordinates)location.raw

一旦您使用我们选择的地理编码服务提供了坐标,结果就是您可以访问的不同要素的字典。如果你打印出locationraw元素,你将会看到几个源自坐标的激动人心的特征。

{‘address’: {‘building’: ‘Eagle Insurance Buildings’, 
‘city’: ‘Manchester’, 
‘country’: ‘United Kingdom’, 
‘country_code’: ‘gb’, 
‘county’: ‘Greater Manchester’, 
‘house_number’: ‘68’, 
‘postcode’: ‘M2 4JG’, 
‘road’: ‘Cross Street’, 
‘state’: ‘England’, 
‘state_district’: ‘North West England’, 
‘suburb’: ‘City Centre’}, 
‘boundingbox’: [‘53.480856’, ‘53.4810634’, ‘-2.2451761’, ‘-2.2449576’], 
‘display_name’: ‘Eagle Insurance Buildings, 68, Cross Street, City Centre, Manchester, Greater Manchester, North West England, England, M2 4JG, United Kingdom’,
‘lat’: ‘53.4809597’, 
‘licence’: ‘Data © OpenStreetMap contributors, ODbL 1.0\. [https://osm.org/copyright](https://osm.org/copyright)', 
‘lon’: ‘-2.24506682746292’, 
‘osm_id’: 37139875, 
‘osm_type’: ‘way’, 
‘place_id’: 86197794}

在这里,您有一个建筑物,邮政编码,地址,国家,道路名称和一堆其他深刻的属性,不可用的原始坐标。如果你只对打印地址感兴趣,你可以使用字典键,或者你可以直接这样做。

print(location.address)

它将打印出输出的地址部分。在下一节中,我们将了解如何在 Pandas 数据帧中使用反向地理编码。

使用熊猫数据框架进行反向地理编码

我们通常希望从纬度和经度(反向地理编码)而不是单个坐标获得地址的子集或完整数据集。在这一部分,我们将探索如何通过熊猫和地质公园做到这一点。

首先,我们从熊猫的 URL 中读取数据。数据存储在 Dropbox 中,如果我们有一个链接,我们可以很容易地使用熊猫。你只需要确保 URL 的最后几个字符设置为“dl=1”。

url = “https://www.dropbox.com/s/15gisj8hx218rn1/street-pole-sample.csv?dl=1"df = pd.read_csv(url)df.head()

数据具有 X 和 Y 列,其中的坐标与其他要素一起存储,如下表所示。

Street Poles in Philadelphia Data

我们还可以使用 Plotly Express 浏览数据并在地图中显示。只需一行代码,您就可以显示带有底图的地图。

import plotly_express as pxpx.scatter_mapbox(df, lat=”Y”, lon=”X”, zoom=15)

Philly Street Poles Map

地图显示了 Phillidelphia 街道杆的子集。现在,我们需要从 X 和 Y 列构造坐标列。我们只需将这两列(X & Y)映射为字符串,然后用逗号将它们连接起来,就可以实现这一点。

df[“geom”] = df[“Y”].map(str) + ‘,’ + df[‘X’].map(str)
df[“geom”][0]

下面是我们在上面创建的geom列的第一行。

'39.9427660880249,-75.17009743393821'

我们创建一个服务提供者locator这个时间通行证timeout是 10 分钟,因为我们有许多行。这将防止您在此过程中可能遇到的超时错误。

locator = Nominatim(user_agent=”myGeocoder”, timeout=10)rgeocode = RateLimiter(locator.reverse, min_delay_seconds=0.001)

现在,我们可以通过应用上面创建的反向地理编码rgeocode来进行反向地理编码。为了得到一个漂亮的进度条,我们使用了 tqdm 库。

tqdm.pandas()df[‘address’] = df[‘geom’].progress_apply(rgeocode)
df.head()

这可能需要一段时间,具体取决于数据集中的行数。但是一旦该过程完成,数据集中就会有一个额外的要素,其中每个点都有一个地址,如下所示。

数据现在有了与每个点相关的更有洞察力的属性,包括地址、邮政编码、建筑物等。…

仅用 150 个点进行反向地理编码,耗时 1 分 45 秒。计算时间可能不是一个好的选择,因为数据点的增加将需要大量的处理时间。如果您有一个大型数据集,您可以尝试减少延迟秒数。

结论

在本文中,我们探讨了如何将地理编码坐标转换为地址。您可以在这个 Google Colab 笔记本中访问本教程的笔记本。

[## 谷歌联合实验室

编辑描述

colab.research.google.com](https://colab.research.google.com/github/shakasom/geocoding/blob/master/ReverseGeocoding.ipynb)

在 R 中反向地理编码

原文:https://towardsdatascience.com/reverse-geocoding-in-r-f7fe4b908355?source=collection_archive---------16-----------------------

没有谷歌或必应 API 的免费

Photo by Lonely Planet on Unsplash

随着我继续写论文,我在执行 R 和 Python 中各种包的简单脚本时遇到了一些小故障。这个周末给自己的任务是反地理编码~ 100 万经纬度坐标。我在 R 中发现了一个名为 revgeo 的很棒的包,并认为这很容易实现。我只需要指定提供者和 API 键。谷歌和必应限制每天免费查询的数量,所以这不是一个可行的选择,但光子没有!唯一需要注意的是,像地址名称这样的详细位置并不总是可用的。以下是如何使用 revgeo 软件包的示例:

library(revgeo)revgeo(longitude=-77.0229529, latitude=38.89283435, provider = 'photon', output=’frame’)

那么问题出在哪里呢?嗯,正如光子网页上所说:

您可以在您的项目中使用 API,但是请注意公平——大量使用将会受到限制。我们不保证可用性和使用可能会在未来发生变化。

我不确定在 Photon API 变慢之前需要多少次查询,但重要的是要注意我们向他们的服务器发送了多少请求。我决定从 500,000 坐标开始逆向地理编码,但这并不奏效。我运行了代码,离开了一段时间,当我回来时,我看到节流已经开始,所以我需要调整代码。此外,R 抛出了一个错误cannot allocate vector of size x.x Gb,这意味着我的可用内存已经耗尽。

在这一点上,我有两个问题:1)节流和 2)内存分配。对于第 1 期,我需要在代码中加入睡眠时间,并处理已经子集化的数据帧的较小子集。对于第 2 期,我在 stackoverflow 上找到了一个有用的建议:

[## 内存分配“错误:无法分配大小为 75.1 Mb 的向量”

在对一些模拟代码进行矢量化的过程中,我遇到了内存问题。我使用的是 32 位 R 版本 2.15.0(通过…

stackoverflow.com](https://stackoverflow.com/questions/10917532/memory-allocation-error-cannot-allocate-vector-of-size-75-1-mb)

帮助我的一个解决方案是运行memory.limit(size = _ _ _ _ _ _)。此外,我使用rm()命令删除代码中不再需要的数据帧,并使用gc()命令进行垃圾收集。如下所示,我加载了名为main的大约一百万坐标的数据帧。我将数据细分为只有 100,000 行。正如您稍后将看到的,我在 while 循环中进一步对数据进行了子集化,以避免内存分配问题。

library(revgeo)# the dataframe called 'main' is where the 1 million coordinate points reside.main <- readRDS("main.rds"))main_sub <- main[0:100000,] # Working with a smaller initial subsetrm(main)
gc()

下面是完整的代码。该脚本包含了与本文主题无关的其他操作,但我想在这里发布它,以便您可以看到全貌,并希望在反向地理编码中获得一些有用的提示。

# Step 1: Create a blank dataframe to store results.
data_all = data.frame()start <- Sys.time()# Step 2: Create a while loop to have the function running until the # dataframe with 100,000 rows is empty.
while (nrow(main_sub)>0) {# Step 3: Subset the data even further so that you are sending only # a small portion of requests to the Photon server. main_sub_t <-  main_sub[1:200,]# Step 4: Extracting the lat/longs from the subsetted data from
# the previous step (Step 3). latlong <- main_sub_t %>% 
    select(latitude, longitude) %>% 
    unique() %>% 
    mutate(index=row_number()) # Step 5: Incorporate the revgeo package here. I left_joined the 
# output with the latlong dataframe from the previous step to add 
# the latitude/longitude information with the reverse geocoded data.cities <- revgeo(latlong$longitude, latlong$latitude, provider =  'photon', output = 'frame')) %>% 
    mutate(index = row_number(),country = as.character(country)) %>%
    filter(country == 'United States of America') %>% 
    mutate(location = paste(city, state, sep = ", ")) %>% 
    select(index, location) %>% 
    left_join(latlong, by="index") %>% 
    select(-index) # Removing the latlong dataframe because I no longer need it. This 
# helps with reducing memory in my global environment.
rm(latlong) # Step 6: Adding the information from the cities dataframe to 
# main_sub_t dataframe (from Step 3).

  data_new <- main_sub_t %>% 
    left_join(cities, by=c("latitude","longitude")) %>% 
    select(X, text, location, latitude, longitude) # Step 7: Adding data_new into the empty data_all dataframe where 
# all subsetted reverse geocoded data will be combined.

  data_all <- rbind(data_all,data_new) %>% 
    na.omit() 
# Step 8: Remove the rows that were used in the first loop from the # main_sub frame so the next 200 rows can be read into the while # loop.

  main_sub <- anti_join(main_sub, main_sub_t, by=c("X"))
  print(nrow(main_sub))

# Remove dataframes that are not needed before the while loop closes # to free up space.
  rm(data_sub_t)
  rm(data_new)
  rm(latlong_1)
  rm(cities)

  print('Sleeping for 10 seconds')
  Sys.sleep(10)

}
end <- Sys.time()

实现这个代码后,大概花了 4 个小时反推地理编码 10 万坐标。在我看来,如果我有一百万个坐标要转换,这不是一个可行的选择。我可能不得不寻找另一种方法来实现我的目标,但我认为这对那些数据集较小的人会有所帮助。

感谢阅读和快乐编码!

使用自动编码器的反向图像搜索

原文:https://towardsdatascience.com/reverse-image-search-using-auto-encoders-afbf906970f5?source=collection_archive---------17-----------------------

你有没有想过谷歌反向图片搜索是如何工作的?他们如何快速扫描所有图像并返回合适的结果?在这篇博客中,我们将制作自己的轻量级反向搜索引擎。为此,我们将使用自动编码器。

什么是自动编码器?

自动编码器是一种特殊类型的前馈神经网络,其输入与输出相同。它们以无人监督的方式接受训练,以学习输入的低级特征。这些低级特征通常被称为潜在特征。然后,这些潜在特征被用于重构原始输入。

自动编码器由 3 个主要组件组成

  • 编码器:用于压缩输入图像
  • 潜在表征:保留大部分信息的输入的低层次特征
  • 解码器:用于从潜在特征中重建原始输入。

在这种情况下,输入是一个图像。下图清楚地解释了自动编码器的工作原理。

Source

我们将在这个博客中讨论什么?

  • 我们将使用时尚 MNIST 数据集并对其进行预处理
  • 训练自动编码器学习所有图像的潜在表示
  • 使用骚扰索引潜在特征
  • 查找给定图像的相似图像

让我们开始吧。

时尚 MNIST 数据集

在加载和处理数据之前,了解数据集、类的数量和数据集中的样本数量是一个很好的做法。

时尚 MNIST 数据库由时尚产品的 28*28 灰度图像的 60000 个训练样本和 10000 个测试样本组成。每个类别有 6000 个训练样本和 1000 个测试样本。你可以在这里阅读更多关于数据集的信息。

导入库

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
from annoy import AnnoyIndex
import os

下载数据

fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

预处理和探索性数据分析

像素值介于 0 和 255 之间。我们将在 0 和 1 之间缩放像素值。

*# resize the pixel values between 0 and 255*
train_images = train_images/255
test_images = test_images/255

让我们将分类标签映射到适当的产品类别。

*# different product categories in the dataset* 
labeldict = {
    0: 'T-shirt/top',
    1: 'Trouser',
    2: 'Pullover',
    3: 'Dress',
    4: 'Coat',
    5: 'Sandal',
    6: 'Shirt',
    7: 'Sneaker',
    8: 'Bag',
    9: 'Ankle boot'
}*# no of times each product category is present in the dataset*
category_counts = dict(zip(*np.unique(train_labels, return_counts=True)))

让我们展示一些样本图像。

plt.figure(figsize=(12,8))
for index in range(16):
  rand_idx = np.random.randint(0,train_labels.shape[0])
  plt.subplot(4,4,index+1)
  plt.xticks([])
  plt.yticks([])
  plt.grid('off')
  plt.imshow(train_images[rand_idx], cmap='Greys_r')
  plt.xlabel(labeldict[train_labels[rand_idx]])

助手功能

让我们定义一个效用函数来绘制原始图像和重建图像。

def plot_images(original, reconstructed):

  fig, axes = plt.subplots(nrows=2, ncols=10, sharex=True, sharey=True, figsize=(12,4))

  for images, axes in zip([original, reconstructed], axes):
    for image, ax in zip(images, axes):
      ax.imshow(image.reshape(28,28), cmap="Greys_r")
      ax.get_xaxis().set_visible(False)
      ax.get_yaxis().set_visible(False)

  fig.tight_layout(pad=0.1)

占位符

让我们为输入和目标定义占位符。在这种情况下,输入和目标是相等的。我们还将为批量大小定义一个占位符。

def placeholders(image_size, n_channels ):
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, image_size, image_size,n_channels], name='inputs') targets = tf.placeholder(dtype=tf.float32, shape=[None, image_size, image_size, n_channels], name='targets') batch_size = tf.placeholder(dtype=tf.int32, name='batch_size') return inputs, targets, batch_size

编码器和解码器网络

我们将使用卷积神经网络来训练我们的模型。编码器网络将 2828 图像转换成 448 的低级表示。解码器使用这种低级表示来重建 2828 的图像。网络参数取自这里的。

def encoder_decoder_network(X):

  *#ENCODER NETOWRK*

  *# X's shape - 28*28*1*
  W1 = tf.get_variable("W1", shape=[3,3,1,16], initializer=tf.contrib.layers.xavier_initializer(seed=0))
  *# 28*28*16* 
  conv1 = tf.nn.conv2d(X, W1, strides=[1,1,1,1], padding='SAME')
  relu1 = tf.nn.relu(conv1)
  *#14*14*16*
  pool1 = tf.nn.max_pool(relu1, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')

  *#14*14*8*
  W2 = tf.get_variable("W2", shape=[3,3,16,8], initializer=tf.contrib.layers.xavier_initializer(seed=0))
  conv2 = tf.nn.conv2d(pool1, W2, strides=[1,1,1,1], padding='SAME')
  relu2 = tf.nn.relu(conv2)
  *#7*7*8*
  pool2 = tf.nn.max_pool(relu2, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')
  *#7*7*8*
  W3 = tf.get_variable("W3", shape=[3,3,8,8], initializer=tf.contrib.layers.xavier_initializer(seed=0))
  conv3 = tf.nn.conv2d(pool2, W3, strides=[1,1,1,1], padding='SAME')
  relu3 = tf.nn.relu(conv3)
  *#4*4*8*
  pool3 = tf.nn.max_pool(relu3, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME', name='encodings')

  encoded = pool3

  *# the image is now 4*4*8* 

  *# DECODER NETWORK* 

  upsample1 = tf.image.resize_nearest_neighbor(encoded, (7,7))
  *#7*7*8*
  W4 = tf.get_variable("W4", shape=[3,3,8,8], initializer=tf.contrib.layers.xavier_initializer(seed=0))
  conv4 = tf.nn.conv2d(upsample1, W4, strides=[1,1,1,1], padding='SAME')
  relu4 = tf.nn.relu(conv4)

  upsample2 = tf.image.resize_nearest_neighbor(relu4, (14,14))
  *# 14*14*8*
  W5 = tf.get_variable("W5", shape=[3,3,8,8], initializer=tf.contrib.layers.xavier_initializer(seed=0))
  conv5 = tf.nn.conv2d(upsample2, W5, strides=[1,1,1,1], padding='SAME')
  relu5 = tf.nn.relu(conv5)

  *# 28*28*8*
  upsample3 = tf.image.resize_nearest_neighbor(relu5, (28,28))

  W6 = tf.get_variable("W6", shape=[3,3,8,16], initializer=tf.contrib.layers.xavier_initializer(seed=0))
  conv6 = tf.nn.conv2d(upsample3, W6, strides=[1,1,1,1], padding='SAME')
  relu6 = tf.nn.relu(conv6)

  W7 = tf.get_variable("W7", shape=[3,3,16,1], initializer=tf.contrib.layers.xavier_initializer(seed=0))
  conv7 = tf.nn.conv2d(relu6, W7, strides=[1,1,1,1], padding='SAME')

  logits = conv7

  decoded = tf.nn.sigmoid(logits, name='decoded')

  return encoded, decoded, logits

定义培训操作

然后,我们计算原始图像和重建图像之间的误差。由于目标是最小化误差,我们将使用 Adam 优化算法来学习误差最小的网络参数。

def train_operations(logits, targets, learning_rate): *# define the loss*
  loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logits, labels=targets)) *# use adam optimizer for faster convergence*
  training_op = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss)
  return loss, training_op

训练模型

接下来,我们将定义一个用于训练模型的函数。代替使用 feed_dict,我们将使用推荐的方式,使用数据集和迭代器向模型提供数据。如果你不知道数据集和迭代器,你可以参考这个博客。

一旦训练结束,我们还会保存模型,以便以后恢复。

def train_model(epochs, image_size, n_channels, batch_size, learning_rate, model_save_path):

  *# reset the graphs*
  tf.reset_default_graph()

  *# get the placeholders*
  inputs, targets, batch_op = placeholders(image_size, n_channels)

  *# create a Dataset from the input data*
  dataset = tf.data.Dataset.from_tensor_slices((inputs,targets))

  *# create batches of data* 
  dataset = dataset.batch(batch_size)

  *# define an iterator to consume the data*
  iterator = tf.data.Iterator.from_structure(dataset.output_types,dataset.output_shapes)

  train_initializer = iterator.make_initializer(dataset, name='init_iterator')

  *# get the batch of data using get_next*
  input_batch, target_batch = iterator.get_next()

  encoded, decoded, logits = encoder_decoder_network(input_batch)
  loss, training_op = train_operations(logits, target_batch, learning_rate)

  saver = tf.train.Saver()
  with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for epoch in range(epochs):
      epoch_loss = 0

      *# run the initializer* 
      sess.run(train_initializer, feed_dict = {
          inputs: train_images.reshape(-1, image_size, image_size, n_channels),
          targets : train_images.reshape(-1, image_size, image_size, n_channels),
          batch_op: batch_size
      })

      try:
        while True:
          batch_loss, _ = sess.run([loss, training_op])
          epoch_loss += batch_loss
      except tf.errors.OutOfRangeError:
        pass

      print("Epoch {}/{}: Loss is {:.3f}".format(epoch+1, epochs, epoch_loss))

    print("Training over\n")
    *# save the model* 
    saver.save(sess,model_save_path)

    print("Model saved at {}".format(model_save_path))

模型参数

我们将以 400 个为一批,总共 20 个时期来训练模型。

epochs = 20
batch_size = 400
image_size = 28 
n_channels = 1
learning_rate = 0.001

运行模型

在运行模型之前,我们将创建一个检查点目录来保存我们的模型。

if not os.path.exists('checkpoints'):
  os.mkdir('checkpoints')

*# checpoint directory* 
chkpt_dir = os.path.join(os.getcwd(), 'checkpoints')
*# path to save the model*
model_save_path = os.path.join(chkpt_dir, 'fashion-mnist.chkpt')

train_model(epochs=epochs, 
            batch_size=batch_size, 
            image_size=image_size, 
            n_channels= n_channels, 
            learning_rate = learning_rate,
            model_save_path = model_save_path)

失败

Epoch 1/20: Loss is 64.375
Epoch 2/20: Loss is 48.220
Epoch 3/20: Loss is 46.779
Epoch 4/20: Loss is 46.140
Epoch 5/20: Loss is 45.726
Epoch 6/20: Loss is 45.435
Epoch 7/20: Loss is 45.215
Epoch 8/20: Loss is 45.031
Epoch 9/20: Loss is 44.868
Epoch 10/20: Loss is 44.724
Epoch 11/20: Loss is 44.593
Epoch 12/20: Loss is 44.470
Epoch 13/20: Loss is 44.357
Epoch 14/20: Loss is 44.251
Epoch 15/20: Loss is 44.152
Epoch 16/20: Loss is 44.060
Epoch 17/20: Loss is 43.975
Epoch 18/20: Loss is 43.894
Epoch 19/20: Loss is 43.820
Epoch 20/20: Loss is 43.750

可视化重建的图像

让我们定义一个函数,它接受保存模型的文件的路径和需要重建的图像列表。

def test_network(model_path, images):
  with tf.Session() as sess:
    saver = tf.train.Saver()
    saver.restore(sess, model_path)
    default_graph = tf.get_default_graph()
    inputs = default_graph.get_tensor_by_name('inputs:0')
    targets = default_graph.get_tensor_by_name('targets:0')

    test_iterator_init = default_graph.get_operation_by_name('init_iterator')
    decoded = default_graph.get_tensor_by_name('decoded:0')
    reconstructed =[]
    sess.run(test_iterator_init, feed_dict={
        inputs:images,
        targets:images
    })
    try:
      while True:
        reconstructed.append(sess.run(decoded))
    except tf.errors.OutOfRangeError:
      pass
    return reconstructed

我们恢复了训练时定义的各种张量和运算。输入目标张量用于将图像输入网络。运行解码后的张量以恢复重建图像。

让我们将测试数据集中的一些图像传递给模型,并可视化它们的重建图像。

test_sample_images = test_images[:10]
test_sample_images = test_sample_images.reshape(-1, image_size, image_size, n_channels)
reconstructed_images = test_network(model_save_path, test_sample_images)
reconstructed_images = np.array(reconstructed_images).reshape(10,28,28,1)
plot_images(test_sample_images, reconstructed_images)

这个模型在重建图像方面做得相当不错。

潜在特征

既然我们对训练模型感到满意,让我们计算所有训练样本的潜在表示。为此,我们将定义一个函数,它接受保存模型的文件的路径,一个我们想要获得潜在表示的图像列表和编码图像的大小。

def get_encodings(model_path, images, encoding_vector_length):
  with tf.Session() as sess:
    saver = tf.train.Saver()
    saver.restore(sess, model_path)
    default_graph = tf.get_default_graph()
    inputs = default_graph.get_tensor_by_name('inputs:0')
    targets = default_graph.get_tensor_by_name('targets:0')

    iterator_init = default_graph.get_operation_by_name('init_iterator')
    encoded = default_graph.get_tensor_by_name('encodings:0')
    encoding_vectors =[]
    sess.run(iterator_init, feed_dict={
        inputs:images,
        targets:images
    })
    try:
      while True:
        encoding_vectors.append(sess.run(encoded))
    except tf.errors.OutOfRangeError:
      pass
    return np.array(encoding_vectors).reshape(-1, encoding_vector_length)

烦恼

近似最近邻(aroy)是一个库,用于搜索空间中更靠近给定查询点的点。我们将使用 Annoy 来保存所有训练样本的所有潜在表示。

接下来,给定一个查询图像,我们将计算给定图像的潜在表示,并将其与所有编码表示进行比较,以找到相似的图像。如果你想了解更多关于 Annoy 是如何工作的,请参考这篇精彩的博文。

让我们来定义构建烦恼指数所需的参数。

  • 编码向量长度:图像的编码表示的大小
  • 骚扰文件名称:骚扰索引将被保存的文件的名称
  • num_trees:构建 n 个树的森林。树的数量越多,精度越高。
# our encoded image is of the shape 4*4*8, hence it's represted by a # vector of length 128
encoding_vector_length = 128
annoy_file_name = 'fashion-mnist.annoy.index'
num_trees = 10

创建骚扰指数

def build_annoy_index(encoding_dim, num_trees, annoy_index_file, encodings):   
  ann = AnnoyIndex(encoding_dim)   
  for index, encoding in enumerate(encodings):
     ann.add_item(index, encoding) # builds a forest of num_trees, higher the number of trees,     higher the precision
     ann.build(num_trees)

     #save the index to a file
     ann.save(annoy_index_file)
     print("Created Annoy Index Successfully") # resize the training images
train_images = train_images.reshape(train_images.shape[0], image_size, image_size, n_channels)# get the encoded representations of all the training samples
encodings = get_encodings(model_save_path, train_images, encoding_vector_length)# create the annoy index
build_annoy_index(encoding_vector_length, num_trees, annoy_file_name, encodings)

让我们定义一个函数来获取给定查询图像的相似图像。要搜索的相似图像的数量由参数n _ 相似表示

def get_similar_images(image, n_similar=10): # get the encoded representation of the image
  encoding = get_encodings(model_save_path,image.reshape(-1, image_size, image_size,n_channels), encoding_vector_length) # Load the annoy index
  saved_ann = AnnoyIndex(encoding_vector_length)
  saved_ann.load(annoy_file_name) # get the nearest images 
  #get_nns_by_vector returns the indices of the most similar images 
  nn_indices = saved_ann.get_nns_by_vector(encoding[0], n_similar) print("Similar images are")
  for i, index in enumerate(nn_indices,1):
    image = train_images[index].reshape(28,28)
    plt.subplot(2,5,i)
    plt.xticks([])
    plt.yticks([])
    plt.imshow(image, cmap='Greys_r')

查询图像

sample_image = test_images[0]
print("Sample Image")
plt.imshow(sample_image, cmap='Greys_r')

相似的图像

get_similar_images(sample_image)

所有返回的图像都与查询图像属于同一类。

感谢阅读博客。完整的代码可以在这个 Jupyter 笔记本里找到。

如果你有任何问题或者你有任何改进这篇文章的建议,请在下面留下你的评论。

参考资料:

  1. https://github . com/uda city/deep-learning/tree/master/auto encoder
  2. https://github.com/zalandoresearch/fashion-mnist
  3. https://pypi.org/project/annoy/
  4. https://Erik Bern . com/2015/10/01/nearest-neighbors-and-vector-models-part-2-how-to-search-in-high-dimensional-spaces . html

反向指导共享——开源

原文:https://towardsdatascience.com/reverse-mentoring-sharing-open-source-868cc19da97a?source=collection_archive---------40-----------------------

Source: genesis_3g on Pixabay

最近,我参加了反向辅导计划,辅导我们的高管,他们在各自领域知识方面经验丰富,但对新技术趋势的理解有限。我们关注他们最感兴趣的四个领域:开源人工智能编码&原型数字趋势。作为导师,我和学员们觉得我们从彼此身上学到了很多东西,值得与更多人分享,这就是我写这个系列的原因。

在这个系列中,每个主题有四篇文章:

  • 反向师徒分享—开源[ 文章 ] [ 幻灯片 ]
  • 反向指导分享——人工智能(未完待续…
  • 反向指导分享—编码和原型制作(待续…
  • 反向指导分享—数字趋势(待续…

在每个主题中,我会首先介绍什么是,以帮助学员对主题有基本的了解。一旦他们知道了这个话题,我会解释为什么这个话题对现在的人很重要。作为高管,他们更关心我们的公司如何从技术中获益,这将包括在第三部分中。

在每篇文章中,我将分享我的 PowerPoint 和我在每张幻灯片上提到的内容。此外,在我与高管们分享了他们的反馈后,我将总结我对每个主题的感受。一旦你理解了这个话题,你就可以去看最后一部分来了解主管们和我的意见。我将排除我们业务中任何敏感的东西,希望每个人,不管你是否熟悉这些话题,都能够从这些文章中学到一些东西。如果你有任何新的想法,请留下你的评论和我们讨论。我真的很感谢大家的回复,这是和人们一起学习的最好的事情。

指令中有三个部分:什么是开源?为什么开源很重要?我们的公司如何从开源中获益?在第一部分,它将从没有开源思想的世界开始,因此人们可以理解开源的重要性。之后,我将给出开源的定义和一些著名的开源项目。在第二部分,我将通过展示开源社区的人们是如何充满活力和积极的来证明我们为什么需要关心开源。最后,我将指出一个公司如何从开源中获益。

在开源之前,我们倾向于使用知识产权来保护提出新想法的人。我们相信,通过保护发明者的财产权并给予他们额外的奖励,我们可以激励更多的创造,这对我们的社会是有益的。

然而,知识产权制度也有一些不利之处。首先,用户将不再完全了解产品,因为开发者和公司需要隐藏他们的配方,并继续赚取超额回报。此外,用户作为对产品有真实体验并知道应该改进什么的人,因为他们没有权利而什么也做不了。最终,这个世界没有变得创新和合作,而是以自我为中心,充满了无尽的诉讼。

为了让人们能够一起工作,而不是互相争斗,开源的想法变得流行起来。它允许他人自由访问和分发最终产品,包括但不限于软件或程序。这样做,我们从智力上解决了逆境。值得一提的是,开源实际上正在很多领域发生。例如,开源可乐是一个公开的、可共享的软饮料配方。

不是任何项目都可以自己定义为开源的。从开源倡议开始,有 10 条开源项目需要遵循的原则。关于第五项原则,“不得歧视个人或群体”,这表明只能用于非商业目的的免费产品不能被定义为开放源码。它使得开源软件与传统的“自由软件”非常不同,更适合商业。此外,开源不仅是一个想法,而且是合法的许可。最流行的三种开源许可是:MIT 许可、GPLv2 许可和 Apache 许可。

开源与技术的成功密切相关,我们可以在身边看到它。从 Linux 和 Android 等操作系统、网络浏览器 Firefox、分析工具 Python 和 R、Hadoop 等数据库到隐藏在 TensorFlow 和 OpenCV 等许多应用程序背后的算法,我们真的无法想象没有它们的生活。

正如我们提到的,开源对于我们当前的技术是至关重要的,在这一部分我们将讨论为什么它会如此强大。一个成功的产品意味着它拥有大量的用户和提供商,所以我们可以从用户的角度来理解为什么公司和人们想要使用开源。

第一个也是最明显的原因,开源是成本优势。然而,另一个原因是,开源可以避免公司遇到令人烦恼的麻烦,如诉讼和兼容问题。有了大而活跃的社区,开源通常可以应用最新的技术,并且有来自许多网站和用户社区的易于阅读的说明和例子。如果你仍然面临一个非常定制化的问题,实际上有很多有经验的顾问为你提供有偿支持。因此,对于公司来说,使用开源软件是一个便宜而简单的解决方案。

很容易理解为什么公司要使用开源软件,但是很难解释为什么他们要提供开源软件。事实上,公司都愿意向公众开放他们的项目,谷歌托管 2000+项目就是一个例子。背后的原因是,开放他们的源代码也有利于公司。比如对他们来说是最好的广告,不仅是对他们的产品,也是对人才。此外,开源可以吸引合适的人加入他们的公司,花更少的时间来培训他们要做什么。

开源的另一个重要参与者是志愿者开发者。促使公司使用并向公众开放代码的是开源社区背后的人才群体。程序员和开发人员花费数小时为开源做贡献的原因有很多,我只给出五点作为实例。有了这些激励,我们可以相信会有越来越多的人继续热情地为开源做出贡献。

在我看来,开源不仅仅是法律文件,而是共享的文化。作为一家非科技公司,我们能从开源,或者说科技世界的快速成长中学到的,是来自开放与合作的影响。我们倾向于把学到的一切都当成秘密,不让别人知道。然而,为了有效地与他人合作,我们不应该害怕与他人分享我们的知识。我们需要相信开放的力量,让开放成为常态,让封闭成为例外。对于一个大公司来说,不是一定要对公众开放,而是对其他部门开放。如果你同意我们希望像科技公司一样快速发展,我们需要拥抱开放的心态。

反馈

作为一名技术布道者,我是开源的忠实粉丝。从我的角度来看,没有开源,我们就看不到新技术带来的便利,大数据和人工智能的想法也将不再可能。我们的进度会很慢,效率会很低,而且我无法以可承受的成本创造出任何有趣的东西(我是 Python 和 r 的忠实用户)。此外,我已经习惯了 GitHub 上每天都有成千上万的请求和问题发生的现象。我乐观地认为,一切都可以通过开放来解决。

H 然而,对于高管们来说,尽管他们对开源的想法印象深刻,但他们看到了比光明更大的挑战。他们指出,例如,特斯拉钥匙的缺陷可能与其开源文化有关。此外,作为一家拥有可靠品牌声誉的成熟企业,我们的客户不会像那些科技公司一样容忍错误。同时,我们需要更加谨慎地选择披露的内容,因为这可能会影响我们的合作伙伴,如供应商。这也可能包括在公司内部共享信息。

每个人都理解协作和共享的价值,这是开源背后的核心价值,与知识产权的理念相矛盾。尽管如此,作为处于不同位置的人,他们对应用开源概念会有不同的观点。或许不是每个人都能复制这些科技公司的做法,但我们应该永远记住分享的能力。我们永远无法知道你告诉别人你所知道的会产生什么影响,所以为了创造一个更好的世界,尽量不要保密。

参考

  • 【维基百科】
  • 【维基百科】
  • 为什么开源对商业有好处【ruby garage】
  • 贵公司应该开源更多代码的 5 个理由【Matt Asay】
  • 【维基百科】
  • 【维基百科】
  • 为什么人们会为开源项目做贡献【Joel Lee】

综述:3D U-Net+ResNet —体积卷积+长短残差连接(生物医学图像分割)

原文:https://towardsdatascience.com/review-3d-u-net-resnet-volumetric-convolutions-long-short-residual-connections-biomedical-3a7da3f98dae?source=collection_archive---------13-----------------------

胜过类似 V-Net 的网络

Example of prostate MR images displaying large variations (Only centre part)

在这个故事中,回顾了一篇论文“使用混合残差连接的体积转换,用于从 3D MR 图像中自动分割前列腺”。这是一个使用3D U-Net+ResNet概念的网络。对于 3D 磁共振(MR)图像,从 3D MR 图像中手动分割耗时且主观,可重复性有限。它严重依赖于经验,并且在观察者之间和观察者内部有很大的差异。另一方面,自动分段非常具有挑战性:

  • 首先,由于不同的 MR 扫描协议,不同的 MR 图像具有全局的扫描间可变性和扫描内强度变化,例如有/没有直肠内线圈。
  • 第二,缺乏清晰的前列腺边界由于前列腺和周围组织的外观相似。
  • 第三,由于病变或图像分辨率不同,前列腺在不同受试者之间的大小和形状差异很大

在这项工作中,混合使用长短剩余连接,提出了具有体积卷积的类 U-Net 网络。这是由 CUMED 团队在香港中文大学(CUHK)MICCAI 前列腺 MR 图像分割(PROMISE12)挑战数据集上所做的工作。这是一篇 2017 AAAI 论文,引用次数超过 90 次。( Sik-Ho Tsang @中)

概述

  1. 网络架构
  2. 混合短长剩余连接
  3. 消融研究
  4. 与最先进方法的比较

1。网络架构和混合长短残留连接

(a) Network Structure, (b) ResBlock

1.1.基本体积转换网络

  • 2D 完全转换网络(FCN)扩展为体积转换网络以实现体积到体积的预测。
  • 下采样路径中,我们只能获得粗略的预测,这对于一些检测和分类任务来说是足够的,但是不适用于基于体素的语义分割
  • 在 ResBlocks 之间应用三个 2×2×2 最大池层,跨距为 2
  • 去卷积和卷积层组成的上采样路径被实现为生成具有更高分辨率的密集预测
  • 通过 3D 方式的卷积、反卷积和汇集工作,网络可以在提取要素和进行预测时完全保留和利用 3D 空间信息。

1.2.深度监督机制

  • 利用网络中的深度监督机制来加快收敛速度。
  • 在网络末端增加一个卷积层(核大小 1×1×1),生成主预测
  • 此外,采用几个卷积层(核大小 1×1×1),然后在上采样路径中使用隐藏特征映射来获得辅助粗略预测,然后使用解卷积层来获得具有相同输入大小的辅助密集预测。
  • 当训练体积 ConvNet 时,主预测和辅助预测的交叉熵损失的加权和被最小化
  • 原则上,深度监督机制可以在训练期间起到强有力的“规则化的作用,因此对于用有限的训练数据训练 ConvNet 是重要的。

2。混合短长剩余连接

  • 长和短剩余连接的使用就像 U-Net+ResNet 一样。

2.1.短剩余连接

  • 第一种残差连接用于构建局部残差块(ResBlocks) ,如图的(b)部分所示。
  • 在 ResBlock 中,它由两个卷积层和两个校正线性单元(ReLUs)组成。

2.2.长剩余连接

  • 长残差连接:第二种残差连接用于连接下采样和上采样路径中具有相同分辨率的残差块,如图(a)部分所示。
  • 这些剩余连接可以在 ConvNet 中显式传播两种重要信息。
  • 首先,它们可以将空间位置信息向前传播到上采样路径,以便恢复由下采样操作引起的空间信息丢失,从而进行更精确的分割。
  • 第二,使用求和操作来构建剩余连接,该架构可以更平滑地将梯度流向后传播,从而提高训练效率和网络性能。
  • 因此,这些连接可以在端到端训练过程期间有效地向前和向后传播上下文和梯度信息。

3.消融研究

3.1.资料组

  • 使用 MICCAI 前列腺 MR 图像分割(PROMISE12)挑战数据集
  • 训练 数据集包含前列腺的 50 个横向 T2 加权 MR 图像和相应的分割基础事实。
  • 测试 数据集30 幅 MR 图像组成,地面实况由组织者拿出进行独立评估。
  • 将所有 MR 体积转换为 0.625×0.625×1.5 mm 的固定分辨率,然后将其归一化为零均值和单位方差。
  • 增强操作包括旋转(90 度、180 度和 270 度)和轴向翻转。

3.2.培训和测试

  • 用的是 Caffe。
  • 使用 NVIDIA TITAN X GPU,由于有限的 GPU 内存,在训练网络时,从每个样本中随机裁剪 64×64×16 个子体积作为输入。
  • 在测试过程中,重叠滑动窗口策略用于裁剪子体积。并且这些子体积的概率图的平均值被用于获得整个体积预测。
  • 子体积大小也是 64×64×16,步距是 50×50×12。一般来说,训练网络大约需要 4 小时,处理一张 320×320×60 大小的 MR 图像大约需要 12 秒。
  • 消融研究采用 10 倍交叉验证。

Training and validation loss of networks with and without mixed residual connections

Cross validation performance with different configurations.

  • 当然,无论是长剩余连接还是短剩余连接,Dice 系数都是最高的。

4。与最先进方法的比较

Quantitative comparison between the proposed method and other methods

  • PROMISE12 挑战中使用的评估指标包括 Dice 系数(DSC)、体积之间绝对差异的百分比(aRVD)、体积边界点之间最短距离的平均值(ABD)和 95% Hausdorff 距离(95HD)。然后主办方算了一个总分,如上图。
  • 在论文提交之前,共有 21 个团队提交了他们的结果,只有前 10 个团队列在表格中。
  • 前十名中的七个团队采用了各种手工制作的功能。除了 team (CUMED)之外,使用 ConvNet 的另外两个小组是 SIATMIDS 和 CAMP-TUM2。
  • 团队 CAMP-TUM2 有一个 V 网般的网络。
  • 再次,当然是 CUMED 队,凭借使用 3D U-Net 般的网络和 U-Net+ResNet 般的长短剩余连接,以 86.65 分的成绩遥遥领先。

Qualitative segmentation results of case 4 (first row) and case 22 (second row) at the apex(left), center (middle) and base (right) of the prostate in testing dataset.

参考

【2017 AAAI】【3D U-Net+ResNet】
具有混合残差连接的体积 ConvNets,用于从 3D MR 图像中自动分割前列腺

我以前的评论

)(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(我)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(?)(我)(们)(都)(不)(在)(这)(些)(情)(况)(上)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(好)(好)(的)(情)(感)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(好)(的)(情)(情)(况)(。 PyramidNet DRN DPN 残留注意网络 MSDNet ShuffleNet V1

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [G-RMI][TDM][SSD][DSSD][约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3[FPN[视网膜网[DCN

语义切分 FCNde convnetdeeplabv 1&deeplabv 2CRF-RNN】SegNet】parse netdilated netDRNRefineNet

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN

实例分割 [ SDS ] [ 超列 ] [ 深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

【DeepPose】【汤普森 NIPS'14】【汤普森 CVPR'15】

复习:3D U-Net —体积分割(医学图像分割)

原文:https://towardsdatascience.com/review-3d-u-net-volumetric-segmentation-medical-image-segmentation-8b592560fac1?source=collection_archive---------6-----------------------

用于从稀疏分割进行密集体积分割的 3D U-Net

Volumetric Segmentation

在这个故事中, 3D U-Net 被简要回顾。这是弗赖堡大学、生物信号研究 BIOSS 中心、弗赖堡大学医院、弗赖堡大学医学中心和谷歌 DeepMind 的一项工作。发布为 2016 MICCAI ,引用 600 余次。( Sik-Ho Tsang @中)

概述

  1. 3D U-Net 架构
  2. 结果

1。3D U-Net 架构

3D U-Net Architecture

  • 3D U-Net 架构与 U-Net 非常相似。
  • 它由分析路径(左)和合成路径(右)组成。
  • 在分析路径中,每层包含两个 3×3×3 卷积,每个卷积后跟一个 ReLU,然后是一个 2×2×2 最大池,每个维度的步长为 2。
  • 在合成路径中,每一层都包括一个 2×2×2 的上卷积,每个维度上的步长为 2,然后是两个 3×3×3 的卷积,每个卷积之后是一个 ReLU。
  • 分析路径中相同分辨率层的快捷连接为合成路径提供了基本的高分辨率特征。
  • 在最后一层,1×1×1 卷积将输出通道的数量减少到标签的数量 3。
  • 每次 ReLU 前的批处理规范化(\BN”)。
  • 总共 19069955 个参数。

2.结果

2.1.一些细节

  • 不同的结构被赋予标签 0:“小管内”,1:“小管”,2:“背景”,和 3:“未标记”。
  • 使用加权交叉熵损失,其中减少频繁出现的背景的权重,增加内部小管的权重,以达到小管和背景体素对损失的平衡影响。
  • 标签为 3(“未标记”)的体素对损失计算没有贡献,即权重为 0。
  • 使用原始分辨率的两倍的下采样版本。
  • 仅使用了 3 个爪蟾肾样品。
  • 对于样本 1、2 和 3,实验中使用的数据大小在 x×y×z 维度上分别为 248×244×64、245×244×56 和 246×244×59。

2.2.两个案例

Semi-Automatic segmentation (Top) Fully-Automatic Segmentation (Bottom)

  • a)第一种情况:半自动分割:对于稀疏标注的数据集,即 3D 结构的一些切片被标注,网络可以帮助分割其余的。
  • 对于样本 1、2 和 3,正交(yz、xz、xy)切片中人工注释的切片数量分别为(7、5、21)、(6、7、12)和(4、5、10)。
  • b)第二种情况 : 全自动分割:对训练数据进行训练后,网络可以推广到新的数据集。

2.3.半自动分割

Effect of # of slices for semi-automated segmentation (IoU)

  • 从在每个正交方向上使用 1 个带注释的切片开始,逐渐增加带注释的切片的数量。
  • 注释的切片越多,IoU 越高。

Cross validation results for semi-automated segmentation (IoU)

  • 来自所有 3 个样本的 77 个人工注释的切片分成三个子集,在有和没有批量标准化的情况下也具有三重交叉验证( BN )。
  • 带 BN 的 3D U-Net 优于其他。

2.4.全自动分段

Cross validation results for fully-automated segmentation (IoU)

  • 训练两个肾体积,分割第三个。
  • BN 除了第三个设置外,改善结果。
  • 作者认为,数据集的巨大差异是造成这种影响的原因。解决方案是有更大的样本量。

参考

【2016 MICCAI】【3D U-Net】
3D U-Net:从稀疏标注学习密集体积分割

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(没)(有)(什)(么)(好)(的)(情)(情)(感)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [ DSSD ] [ 约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3 ] [ FPN ] [ 视网膜网 ] [ DCN ]

语义切分 FCNde convnetdeeplab v1&deeplab v2CRF-RNN】SegNet】parse netdilated netPSPNetdeeplab v3]

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道[V-Net]

实例分割 [SDS[超列 ] [ 深度掩码 ] [ 锐度掩码 ] [ 多路径网络][MNC][Instance fcn][FCIS

超分辨率 [Sr CNN][fsr CNN][VDSR][ESPCN][红网][DRCN][DRRN][LapSRN&MS-LapSRN][srdensenenet

人体姿态估计
深度姿态汤普逊·尼普斯 14

回顾:吴恩达的机器学习课程

原文:https://towardsdatascience.com/review-andrew-ngs-machine-learning-course-b905aafdb7d9?source=collection_archive---------12-----------------------

吴恩达教授的机器学习课程于 2011 年发布。出版 8 年后,吴恩达的课程仍然被列为顶级机器学习课程之一。这已经成为 Coursera 的一门主食,说实话,也是机器学习的一门主食。

截至本文发表时,已经有 2,632,122 名用户注册了该课程。那是刚刚入学,但不知道他们是否已经完成。据估计,开始学习的用户中有 1% — 15%完成了课程。因此,低端有 26,321 人,高端有 394,818 名注册用户全程观看了课程。

我于 2019 年 11 月 11 日完成课程,这将是对这门课程的诚实回顾。在开始之前,我已经搜索了一些常见问题以及我自己的问题。因此,让我们深入到我对吴恩达的机器学习课程的诚实评论中。

但是首先……

什么是 MOOCs?

大规模提供在线课程,简称 MOOCs,是在预算内获得自学教育的一个很好的方式。这些类型的课程自 2008 年第一门课程“连接主义和连接知识/2008”发布以来就一直存在。这是由加拿大曼尼托巴大学的教授斯蒂芬·道恩斯和乔治·西门子发明的。

这些课程的好处在于它们通常是免费的。然而,订阅托管平台或为完成证书付费已经变得很普遍。

好了,让我们进入课程提问吧!

谁是吴恩达?

Coursera headshot.

吴恩达是世界上最著名的人工智能专家之一。他是 2011 年谷歌大脑的创始人和负责人,同年他成为 Coursera 的联合创始人。他之前是百度的首席科学家。目前,他是人工智能基金的普通合伙人,也是 deeplearning.ai 和 Landing AI 的创始人。他还是斯坦福大学计算机科学的兼职教授。不用说,这家伙有相当的履历。

课程结构是怎样的?

这门为期 11 周的完全在线课程由视频和阅读讲座、测验和编程作业组成。不是所有的周都包含编程作业,但是每个周主题都有测验。

视频讲座和测验

视频讲座需要 10-15 分钟来完成,每个讲座至少包含一个测验问题,以便让学生明白他想要表达的意思。阅读课包含额外的笔记,如后期制作中发现的任何错误,所以如果你是一个听觉型学习者,请确保至少看一眼。

测验可能会很难,但他会在他的视频讲座中提供幻灯片,以及每周可以参考的阅读资源。

编码任务

编码作业是这门课程的重要组成部分。不过在我自己看来唯一的缺点就是用 Octave(免费)或者 Matlab(付费)完成。你确实得到了参加 Matlab 课程的 12 周许可证。

我很想用 Python 或 R 来完成这个课程,但是他用教和学的简单性验证了他的决定。他继续讲述了在这些语言中构建原型是多么容易,并且硅谷在进入 Python 或 r 之前大量使用它。Octave 语言很容易学习,并且有大量的文档和线程可用于计算任务。

吴恩达的机器学习课程到底涵盖了哪些内容?

吴恩达的机器学习课程可以分为 4 个不同的主题:

  • 监督学习(线性回归、逻辑回归、神经网络、支持向量机)
  • 无监督学习(K 均值、PCA、异常检测)
  • 特殊应用/主题(推荐系统、大规模机器学习)
  • 关于构建机器学习系统的建议(偏差/方差、正则化、学习算法评估、学习曲线、误差分析、上限分析)

他主要关注机器学习的理论和概念,而不是编码部分。如果你刚刚开始学习机器学习,这是一个很好的策略。

关于建立机器学习系统的建议是课程中非常重要的一部分。他将带您了解如何正确训练您的模型,以及在模型遇到问题时该如何处理。他为你提供了你在未来模型中需要的工具。

时间承诺是什么?

您预计每周将投入 5-7 个小时来完成该课程。尽管这是一个为期 11 周的课程,但你可以提前完成。2019 年 9 月 16 日开课,2019 年 11 月 11 日结束;不到两个月。前 2 周和后 2 周相当简单,可以捆绑在一起。

前提条件是什么?

接触线性代数和微积分将是有益的。吴恩达深入研究了机器学习的数学。这里有一个帮助你复习数学的列表:

  • 线性代数的本质由 3Blue1Brown
  • 微积分的本质由 3Blue1Brown
  • 可汗学院

他确实很快地完成了一些数学运算,所以暂停一下视频,让你的大脑思考一下他在说什么。我不得不这样做好几次。

这要花多少钱?

这门课程有免费、付费和经济资助三种选择。在免费版本中,你可以接触到一些材料,但不能接触到评分作业。然而,花 80 美元你就可以接触到整个课程,包括评分作业,并且会得到一个数字证书来炫耀。如果你愿意,可以选择将证书放在你的 LinkedIn 页面上,或者通过链接与任何人分享。

如果你有预算或者雇主愿意,一定要选择付费版本。分级作业是筛选主题和理解所涉及模型的数学运算的好方法。以及努力获得证书,并能够打印出来是一种有益的感觉。

学完这门课我能做什么?

继续你的机器学习教育。跳上 Kaggle,玩转泰坦尼克号数据集及其分类问题。一旦你掌握了这一点,就跳到其他数据集中展示你新开发的技能。很快,你就可以了解深度学习,并参加他的 deeplearning.ai 课程。

仅仅凭这个证书找工作是不可能的。明智地使用 GitHub 或任何存储库来存放您的代码,从长远来看会对您有帮助。绝对值得花时间记录你的学习成果,这样你就可以在职业生涯中以及潜在的雇主和客户面前参考它们。

我创造了 5 个学习机器学习的简单步骤来帮助你进行机器学习的自我教育。完成吴恩达课程后,您已经部分完成了几个步骤!

吴恩达的机器学习课程还有意义吗?

这个问题是我报名前突然想到的。随着机器学习发展如此之快,并接管了我们生活的每个领域,担心它不相关是有道理的。然而,这种担心可以打消了。吴恩达设计课程的方式是为了长远打算。他没有涉及任何外部图书馆,以便当他们改变课程时不会受到影响。他专注于机器学习的理论和概念,而不是编码基础。

欺骗的

与它的相关性有关的另一个问题是它在防止作弊方面的有效性。对于每个测验,您需要勾选一个方框,确认您回答的所有问题都来自您自己,而不是其他人。然而,由于它的流行,一些存储库包含测验的答案和完成的编码作业。如果你被发现作弊,你的 Coursera 账户将被停用,证书作废。

当你选择这门课程时,不要欺骗!如果你对机器学习很认真,那就接受挑战吧。他们确实有一个社区论坛,你可以访问并检查以前提出的问题及其答案。如果你的问题之前没人问过,可以发帖,会有人帮你的。

最后的想法

这个课程是一次很棒的经历,我非常喜欢这个主题。它的结构方式温和地帮助你度过每一周,这是令人惊讶的。我感到失望的是,它不是用一种通用的机器学习语言完成的,但你从中获得的东西超过了你想要的。对于刚刚开始机器学习之旅的人,我强烈推荐这个课程的付费版本。如果你有多年的经验,你可能会觉得课程有点无聊,所以如果你属于这一类,就去找免费版本。

非常感谢您阅读这篇评论。我祝你一路顺风。

在我们重新学习之前,

综述:CRAFT 级联区域-提议-网络和快速 r-cnn(目标检测)

原文:https://towardsdatascience.com/review-craft-cascade-region-proposal-network-and-fast-r-cnn-object-detection-2ce987361858?source=collection_archive---------19-----------------------

更好的对象提议,更准确的对象分类,胜过更快的 R-CNN

在这个故事里,由中科院清华工艺进行了回顾。在快速 R-CNN 中,区域提案网络(RPN)用于生成提案。这些建议,在投资回报汇集后,将通过网络进行分类。但是发现更快的 R-CNN 有一个核心问题:

  • 在提案生成中,仍然有很大比例的背景区域。许多背景样本的存在导致许多假阳性。

工艺中,如上图,在 RPN 之后增加了另一个 CNN,使产生更少的提案(即这里的 300 个)。然后,对这 300 个建议进行分类,并输出大约 20 个基元检测结果。对于每个原始结果,使用一对其余分类来执行精细的对象检测。发表在 2016 CVPR 上,引用 50 余次。( Sik-Ho Tsang @中)

概述

  1. 级联建议生成
  2. 级联对象分类
  3. 消融研究
  4. 结果

1。级联建议生成

1.1.基线 RPN

  • 一个理想的建议生成器应该在覆盖几乎所有对象实例的同时生成尽可能少的建议。由于 CNN 池操作导致的分辨率损失和滑动窗口的固定纵横比,RPN 在覆盖具有极端尺度或形状的对象方面较弱。

Recall Rates (%), Overall is 94.87%, Lower than 94.87% is bold in text.

  • 以上结果是基于使用 PASCAL VOC 2007 train+val 训练的 VGG_M 的基线 RPN,并在测试集上测试。
  • 每个对象类别的召回率差异很大。具有极端纵横比和比例的对象很难被检测到,例如船和瓶子。

1.2.提议的级联结构

The additional classification network after RPN is denoted as FRCN Net here

  • RPN 之后的附加分类网络。
  • 附加网络是一个 2 类检测网络,在上图中表示为 FRCN 网络。它使用 RPN 的输出作为训练数据。
  • 在训练 RPN 网络之后,每个训练图像的 2000 个原始建议被用作 FRCN 网络的训练数据。
  • 在训练期间,正负采样分别基于正 0.7 IoU 和负 0.3 IoU 以下。
  • 有两个优点:
  • 1)首先,附加的 FRCN 网进一步提高了目标提议的质量,缩小了更多的背景区域,使提议更符合任务要求。
  • 2)第二,来自多个来源的建议可以合并作为 FRCN 网的输入,以便可以使用互补信息。

2.级联对象分类

2.1.基线[快速 R-CNN](http://Fast R-CNN)

[Fast R-CNN](http://Fast R-CNN) Results (Orange: Train, Red: Boat, Blue: Potted Plant)

  • 它在捕捉类别内差异方面很弱,因为“背景”类通常占据训练样本的很大比例
  • 如上图所示,误分类错误是最终检测的主要问题。

2.2.提议的级联结构

Cascade Object Classification

  • 为了改善由于错误分类导致的太多假阳性的问题,one-vs-rest 分类器被用作每个对象类别的附加两类交叉熵损失,如上所示。
  • 每个 one-vs-rest 分类器看到特定于一个特定对象类别的提议(也包含一些假阳性),使其专注于捕获类别内差异
  • 标准 FRCN 网(FRCN-1)首先使用来自级联建议结构的目标建议进行训练
  • 然后,基于 FRCN-1 的输出训练另一个 FRCN 网络(FRCN-2 ),这是原始检测。
  • 被分类为“背景”的原始检测被丢弃。
  • 使用 N 两类交叉熵损失的总和,其中 N 等于对象类别的数量。
  • FRCN-1 和 FRCN-2 的卷积权重是共享的,因此全图像特征图只需计算一次。
  • 产生 2 个 N 个分数和 4 个 N 个边界框回归目标的新层从高斯分布初始化。
  • 因此,在测试时间,以 300 个目标提议作为输入,FRCN-1 输出大约 20 个原始检测,每个具有 N 原始分数。
  • 然后,每个基元检测再次由 FRCN-2 分类,并且输出分数( N 个类别)以逐个类别的方式乘以基元分数( N 个类别),以获得该检测的最终 N 个分数。

3.消融研究

3.1.提案生成

Recall Rates (%)

  • 使用在 ILSVRC DET 列车+va1 上预训练的 VGG-19 ,并在 val2 上进行测试。
  • 提出的 FRCN ,分别基于 0.7 IoU 以上和 0.3 IoU 以下使用正负抽样,的召回率最高,达到 92.37%,比 RPN 高出 2%以上。
  • 使用 300 个建议的 FRCN 优于使用 2000 个建议的选择性搜索。

Recall Rates (%) and mAP (%) on PASCAL VOC 2007 Test Set

  • 与自下而上的方法相比,RPN 建议没有很好地本地化(高 IoU 阈值下的低召回率)。
  • 使用更大的网络无法帮助(RPN_L),因为它是由固定锚引起的。
  • “Ours”保持每个图像的固定数量的建议(与 RPN 相同),而“Ours_S”保持其分数(级联 FRCN 分类器的输出)高于固定阈值的建议。
  • 级联建议生成器不仅进一步消除了背景建议,还带来了更好的定位,两者都有助于检测 AP。

3.2.对象分类

mAP (%) on PASCAL VOC 2007 Test Set

  • “相同”:表示没有微调。与没有级联分类结构的图相似。这就像运行 FRCN-1 两次,这是一个迭代的包围盒回归。
  • “clf”:微调额外的一对其余分类权重。地图提高到 66.3%。
  • “fc+clf”:微调最后一个卷积层之后的所有层。mAP 为 68.0%,具有最好的结果。
  • “conv+fc+clf”:就像完全训练新的特征表示,学习另一个分类器。

mAP (%) on PASCAL VOC 2007 Test Set

  • 如果用 one-vs-rest 代替原来的分类,mAP 变得更差,只有 46.1%。
  • 如果使用级联分类,mAP 提高到 68.0%。

4.结果

4.1.PASCAL VOC 2007 和 2012

mAP (%) on PASCAL VOC 2007 and 2012

  • FRCN : 快速 R-CNN 。
  • RPN_un : 更快的 R-CNN 在提议网络和分类器网络之间具有非共享的 CNN。
  • RPN : 更快的 R-CNN 。
  • 工艺:带级联建议网络,比 VOC 2007 中的 RPN_un 好但比 RPN 差。使用级联分类器网络,它在 VOC 2007 和 VOC 2012 中都比更快的 R-CNN 。

CRAFT on PASCAL VOC 2007 Test Set

4.2.ILSVRC 目标检测任务

Recall Rate (%) on ILSVRC val2 Set

  • 0.6 NMS :更严格的 NMS,比基本版好。
  • 重新评分:通过考虑级联结构两个阶段的两个评分,对每个提案重新评分也有帮助。
  • +DeepBox :融合 DeepBox 提议,将 RPN 提议作为 FRCN 网的融合输入,使召回率提高到 94%以上。比+SS 要好。

mAP (%) on ILSVRC val2 Set

  • 这里使用 GoogLeNet 模型,带批量归一化。
  • ILSVRC 2013train + 2014train + val1 用作训练集。
  • 使用级联建议网络,实现了 47.0%的 mAP,这已经超过了之前最先进的系统(如 Superpixel Labeling 和 DeepID-Net 的集合结果。
  • 还具有级联分类器网络,48.5% mAP ,额外的 1.5%绝对增益。

由于级联网络同时适用于区域建议网络和分类器网络,提高了检测精度。

参考

【2016 CVPR】【工艺】 从图像中工艺物体

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(是)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(好)(的)(情)(情)(况)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC yolo 9000[yolov 3][FPN][retina net][DCN]

语义切分 FCNde convnetdeeplab v1&deeplab v2SegNet】【parse netdilated netPSP netdeeplab v3DRN

生物医学图像分割 cumed vision 1cumed vision 2/DCANU-NetCFS-FCNU-Net+ResNet多通道

实例分段 DeepMask SharpMask MultiPathNet MNC InstanceFCN FCIS 】

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

综述:条件随机场-RNN——作为递归神经网络(语义分割)

原文:https://towardsdatascience.com/review-crf-rnn-conditional-random-fields-as-recurrent-neural-networks-semantic-segmentation-a11eb6e40c8c?source=collection_archive---------3-----------------------

一种将 CRF 集成到端到端深度学习解决方案中的方法

在这个故事中, CRF-RNN条件随机场作为递归神经网络,由牛津大学斯坦福大学百度进行综述。CRF 是计算机视觉中最成功的图形模型之一。发现全卷积网络( FCN )输出的分割结果非常粗糙。因此,许多方法使用 CRF 作为后处理步骤来细化从网络获得的输出语义分割图,例如deeplab v1&deeplab v2,以具有更细粒度的分割结果。但是,CRF 的参数不与 FCN 一起训练。换句话说, FCN 在训练中并不知道慢性肾衰竭。这可能会限制网络能力。

在 CRF-RNN 中,作者提出将 CRF 表述为 RNN,以便与【FCN】集成,以端到端的方式训练整个网络,以获得更好的结果。这是一篇 2015 年 ICCV 论文,引用超过 1300 次。( Sik-Ho Tsang @中)

CRF-RNN 现场演示

作者们还为此制作了一个现场演示:

[http://www.robots.ox.ac.uk/~szheng/crfasrnndemo](http://www.robots.ox.ac.uk/~szheng/crfasrnndemo)

We can try our own image from internet or upload our own

以下是我的试验,这很有趣:

奇迹

Marvel

城市景观数据集

Cityscape Dataset

船和人

Boats & Persons

这是相当准确的,当然,我也尝试了一些 CRF-RNN 不能工作。

概述

  1. 条件随机场
  2. CRF 作为 CNN 进行一次迭代
  3. CRF 为多次迭代的 RNN
  4. 结果

1。条件随机场

  • CRF 的目的是基于每个位置本身的标签以及相邻位置的标签和位置来细化粗略输出。
  • 考虑全连通的成对 CRF 。完全连接意味着所有位置都已连接,如上图中间所示。成对意味着连接成对连接。
  • 当我们讨论 CRF 时,我们在讨论如何最小化一个能量函数。这里,我们需要最小化标签分配的能量。我只是把能量当作一种成本函数。通过将最可能的标签分配给每个位置,我们可以获得更低的能量,即更低的成本,从而获得更高的精度。
  • CRF 的特征在于以下形式的吉布斯分布:

  • 其中 I 是输入。 Xi 是位置 i 处的随机变量,代表分配的标签。 I 为简单起见被丢弃。 E ( x )是能量函数, Z ( I )是配分函数,就是所有 exp(- E ( x )的和。
  • 这个 CRF 分布 P ( X )近似为 Q ( X ),是独立 ( Xi )的乘积:

  • 在论文中,作者提到他们遵循[29]。(如有兴趣,请访问[29]。这是 2011 年 NIPS 的一篇论文,名为“在具有高斯边缘势的全连接 CRF 中的有效推断”。)能量函数:

  • 第一项,一元能量ψu(Xi):如果标签分配与初始分类器不一致,则测量成本。一元表示每次只考虑单个位置的标签。
  • 第二项,成对能量ψp(Xixj ):如果两个相似像素(例如相邻像素或具有相似颜色的像素)采用不同的标签,则测量成本:

  • 其中 kG 是应用于特征向量的 高斯核。特征向量可以是空间位置和 RGB 值,例如高斯滤波器和双边滤波器。
  • 并且 μ是标签兼容性函数,其在标签不同时分配惩罚。

End-to-end Trainable CRF-RNN

  • CRF 是一种非常强大的统计建模方法,应用于各种模式识别任务,如文本序列分类。我只能以非常简要的方式介绍本文中提到的通用报告格式。
  • 简而言之,输入图像将通过 FCN 然后是 CRF。该 CRF 将考虑一元能量项和成对能量项,然后输出更精确的分割图。
  • 这个 CRF 是作为 CNN 的一个栈实现的,如下所示。

2。 CRF 作为 CNN 进行一次迭代

初始化

  • Ui ( l )是基于 VGG-16 的 FCN-8s 提供的一元电位。
  • 使用 softmax 获得 Qi ( l )。
  • 初始化之后,将会有一系列流程的迭代(while 循环)。

信息传递

  • 使用 M 个高斯滤波器。
  • 在[29]之后,使用两个高斯核一个空间核和一个双边核

加权滤波器输出

  • 对于每个类别标签 l ,上一步的 M 滤波器输出的加权和。
  • 当每个标签被单独考虑时,它可以被视为具有 M 个输入通道和一个输出通道的 1×1 卷积
  • 与[29]相反,每个类标签使用单独的核权重。

兼容性转换

  • 当分配不同的标签时,会分配一个罚分。
  • 例如:将标签“人”和“自行车”分配给附近的像素应该具有比分配标签“天空”和“自行车”更小的惩罚。
  • 这样, μ ( ll’)从数据**中学习。

添加一元位势

  • 兼容性转换步骤的输出是从一元输入U中按元素减去

正常化

  • 另一个 softmax 操作。

Fully connected CRFs as a CNN for one mean-field iteration

  • 以上是一次平均场迭代的概述。
  • 通过重复上述模块,我们可以进行多次平均场迭代。

3。将 CRF 作为多次迭代的 RNN

CRF as RNN for Multiple Iterations

  • 就是形象。 U 是来自 FCN 的一元电位。 T 为总迭代次数。
  • fθ(U,H 1( t ), I )是上一节所述的平均场迭代,其中 θ 是上一节所述的 CRF 参数,即 wμm
  • 在 t = 0 时,第一次迭代,H1(t)= soft max(U)否则 H 1( t )是前一次平均场迭代的输出,H2(t-1)
  • H2(t)是平均场迭代 fθ(U,H1(t)I)的输出。**
  • 最终输出,Y(T)=H2(T)当 t = T 时,即最后一次迭代结束时。
  • 使用递归神经网络(RNN) 设置,即这里的参数在所有迭代中共享。
  • 训练时, T =5 用于避免消失/爆炸渐变问题。
  • 测试期间, T =10

4.结果

4.1.帕斯卡 VOC

Mean IU Accuracy on PASCAL VOC 2012 Validation Set

  • 有/没有 COCO:模特是否也由 COCO 训练。
  • 平原 FCN-8s :平均 IU 精度最低。
  • 带 CRF 但断开:这意味着 CRF 不用 FCN 以端到端的方式训练,获得更高的平均 IU 精度
  • 端到端 CRF-RNN :获得了最高的平均 IU 精度,这意味着端到端 FCN +CRF 是最佳解决方案。

Mean IU Accuracy on PASCAL VOC 2010, 2011, 2012 Test Set

  • CRF-RNN w/o COCO :性能优于 FCN-8s 和 DeepLab-v1 。
  • 有 COCO 的 CRF-RNN:效果更好。

4.2.PASCAL 上下文

Mean IU Accuracy on PASCAL Context Validation Set

  • CRF-RNN :比 FCN-8s 更高的平均 IU 精度。

4.3.进一步分析

  • 在 PASCAL VOC 2012 验证集上进行附加实验。
  • 对不同等级使用不同的权重 w 会增加 1.8%的平均 IU。
  • 在训练和测试期间,T =10 导致 0.7%的下降,这表明存在消失梯度效应。
  • 每次迭代的独立参数而不是共享参数,仅获得 70.9%的平均 IU 准确度,这表明递归结构是重要的。

4.4.定性结果

Some Good Results on PASCAL VOC 2012

Comparison with State-of-the-art Approaches

虽然 CRF-RNN 是在 2015 年发表的,但这篇论文向我介绍了一个重要的概念/逻辑,即把一个传统的/非深度学习的方法转换/近似为基于深度学习的方法,并把它变成一个端到端的解决方案。

参考

【2015 ICCV】【CRF-RNN】
条件随机场作为递归神经网络

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(是)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(好)(的)(情)(情)(情)(况)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】CRAFTR-FCNIONmultipath Net【T21 [ 约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3 ] [ FPN ] [ 视网膜网 ] [ DCN ]

语义切分 FCNde convnetdeeplab v1&deeplab v2SegNet】【parse netdilated netPSP netdeeplab v3DRN

生物医学图像分割 cumed vision 1cumed vision 2/DCANU-NetCFS-FCNU-Net+ResNet多通道

实例分段 DeepMask SharpMask MultiPathNet MNC InstanceFCN FCIS 】

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

回顾:DCN/DCN v1——可变形卷积网络,2017 年 COCO 检测(物体检测)亚军

原文:https://towardsdatascience.com/review-dcn-deformable-convolutional-networks-2nd-runner-up-in-2017-coco-detection-object-14e488efce44?source=collection_archive---------3-----------------------

使用可变形卷积,改进了更快的 R-CNN 和 R-FCN,在可可检测中获得亚军,在可可分割中获得季军。

A 继 STN 之后,这次 DCN(可变形卷积网络),由微软亚洲研究院(MSRA) 进行评审。它也被称为 DCNv1 ,因为后来作者也提出了 DCNv2。

(a) Conventional Convolution, (b) Deformable Convolution, (c) Special Case of Deformable Convolution with Scaling, (d) Special Case of Deformable Convolution with Rotation

常规/常规卷积基于定义的滤波器尺寸,在来自输入图像或一组输入特征图的预定义矩形网格上操作。该网格的大小可以是 3×3 和 5×5 等。然而,我们想要检测和分类的对象可能会在图像中变形或被遮挡。

在 DCN 中,网格是可变形的,因为每个网格点都移动了一个可学习的偏移量。卷积在这些移动的网格点上操作,因此被称为可变形卷积,类似于可变形 RoI 合并的情况。通过使用这两个新模块,DCN 提高了 DeepLab 、fast R-CNN、 R-FCN 和 FPN 等的精确度。

最终,通过使用DCN+FPN+对齐 例外 ,MSRA 获得了 COCO 检测挑战赛亚军和细分挑战赛季军。发表于 2017 ICCV ,引用 200 余次。( Sik-Ho Tsang @中)

概述

  1. 可变形回旋
  2. 可变形 RoI 汇集
  3. 可变形正敏感(PS) RoI 汇集
  4. 使用 ResNet-101 &对齐-初始-ResNet 的可变形 ConvNets
  5. 消融研究&结果
  6. 使用比对异常的 COCO 检测挑战的更多结果

1.可变形卷积

Deformable Convolution

  • 规则卷积在规则网格 R 上运算。
  • 可变形卷积运算在 R 上进行,但是每个点都增加了一个可学习的偏移量∈pn
  • 卷积用于生成对应于 N 2D 偏移∈pn(x-方向和y-方向)的 2 N 个特征图。

Standard Convolution (Left), Deformable Convolution (Right)

  • 如上所示,可变形卷积将根据输入图像或特征图为卷积选取不同位置的值。
  • 相比 阿特鲁卷积 : 阿特鲁卷积在卷积时具有较大但固定的膨胀值,而可变形卷积在卷积时对网格中的每个点应用不同的膨胀值。(阿特鲁卷积也叫扩张卷积或空洞算法。)
  • 相对于 空间变换网络 : 空间变换网络对输入图像或特征地图进行变换,而可变形卷积可以被视为一个极轻量级的空间变换网络。

2.可变形 RoI 合并

Deformable RoI Pooling

  • 常规 RoI 池将任意大小的输入矩形区域转换为固定大小的特征。
  • 在可变形 RoI 合并中,首先,在顶部路径,我们仍然需要常规 RoI 合并来生成合并的特征图。
  • 然后,一个全连接(fc)层生成归一化偏移p̂ij,然后转换为偏移∈pij(右下方的等式),其中γ=0.1。
  • 偏移归一化对于使偏移学习不随 RoI 尺寸变化是必要的。
  • 最后,在底部路径,我们执行可变形 RoI 合并。输出要素地图基于具有增大偏移的区域进行合并。

3。可变形正敏感(PS) RoI 汇集

Deformable Positive-Sensitive (PS) RoI Pooling (Colors are important here)

  • 对于 R-FCN 中的原始正敏感(PS) RoI pooling,首先将所有输入特征图转换为每个对象类的 k 得分图(总共 C 对于 C 对象类+ 1 个背景)(最好先阅读 R-FCN 来了解原始 PS RoI pooling)。如果感兴趣,请阅读关于它的评论。)
  • 在可变形 PS RoI 合并中,首先,在顶部路径,与原始路径类似, conv 用于生成 2 个 k ( C +1)分数图。
  • 这意味着对于每个类,将有 k 个特征地图。这些 k 特征图代表了{左上(TL),中上(TC)、..,右下角(BR)} 我们要学习的对象的偏移量。
  • 偏移(顶部路径)的原始 PS RoI 汇集在中完成,即它们汇集在图中的相同区域和相同颜色。我们在这里得到补偿。
  • 最后,在底部路径,我们执行可变形 PS RoI 合并来合并由偏移增加的特征图。

4。使用 ResNet-101 &对准初始 ResNet 的可变形 ConvNets

4.1.对齐- 盗梦空间-ResNet

Aligned-Inception-ResNet Architecture (Left), Inception Residual Block (IRB) (Right)

  • 原始Inception-ResNet中,在 Inception-v4 中提出了对准问题,对于靠近输出的特征图上的细胞,其在图像上的投影空间位置与其感受野中心位置不对准。
  • Aligned-Inception-ResNet中,我们可以看到在 Inception 残差块(IRB)内,所有用于因子分解的非对称卷积(例如:1×7,7×1,1×3,3×1 conv)都被去除了。如上所示,仅使用一种 IRB。此外,IRB 的编号不同于 Inception-ResNet-v1 或 Inception-ResNet-v2 。

Error Rates on ImageNet-1K validation.

  • aligned-Inception-ResNet比 ResNet-101 的错误率低。
  • 虽然 Aligned-Inception-ResNet比 Inception-ResNet-v2 有更高的错误率,Aligned-Inception-ResNet解决了对齐问题。

4.2.修改后的 ResNet-101 & Aligned-Inception-ResNet

  • 现在我们得到了两个主干:ResNet-101&Aligned-Inception-ResNet用于特征提取,原本用于图像分类任务。
  • 然而,输出特征图太小,这对于对象检测和分割任务来说是不好的。
  • 阿特鲁卷积(或扩张卷积)用于减少最后一个块(conv5)的开始,步幅从 2 变为 1。
  • 因此,最后一个卷积块中的有效步幅从 32 个像素减少到 16 个像素,以增加特征图的分辨率。

4.3.不同的物体探测器

  • 在特征提取之后,使用不同的对象检测器或分割方案,例如 DeepLab 、类别感知 RPN(或被视为简化的 SSD )、更快的 R-CNN 和 R-FCN 。

5.消融研究和结果

语义分割

  • PASCAL VOC ,20 个类别,带有附加遮罩注释的 VOC 2012 数据集,用于训练的 10,582 幅图像,用于验证的 1,449 幅图像。 mIoU@V 用于评价。
  • 城市景观,19 个类别+ 1 个背景类别,2975 张用于训练的图像,500 张用于验证的图像。 mIoU@C 用于评估。

物体检测

  • PASCAL VOC ,VOC 2007 trainval 和 VOC 2012 trainval 联合培训,VOC 2007 测试评估。使用贴图@0.5贴图@0.7
  • COCO ,trainval 中 120k 图像,test-dev 中 20k 图像。mAP @ 0.5:0.95mAP@0.5 用于评估。

5.1.对不同数量的最后几层应用可变形卷积

Results of using deformable convolution in the last 1, 2, 3, and 6 convolutional layers (of 3×3 filter) in ResNet-101

  • 3 和 6 可变形回旋也是好的。最后,作者选择了 3,因为对于不同的任务有一个的良好权衡。
  • 而且我们还可以看到 DCN 提高了 DeepLab 、类感知 RPN(或者视为简化的SSD)、 更快的 R-CNN R-FCN

5.2.分析可变形卷积偏移距离

Analysis of deformable convolution in the last 3 convolutional layers

Examples: three levels of 3×3 deformable filters for three activation units (green points) on the background (left), a small object (middle), and a large object (right)

  • 为了说明 DCN 的有效性,也进行了如上的分析。首先,根据地面真实边界框注释和滤波器中心的位置,将可变形卷积滤波器分为四类:小、中、大和背景。
  • 然后,测量扩张值(偏移距离)的平均值和标准偏差。
  • 发现可变形滤光器的感受野大小与对象大小相关,表明变形是从图像内容中有效学习的。
  • 并且背景区域上的滤光器尺寸介于中大型物体上的滤光器尺寸之间,这表明相对较大的感受野对于识别背景区域是必要的

Offset parts in deformable (positive sensitive) RoI pooling in R-FCN and 3×3 bins (red) for an input RoI (yellow)

  • 类似地,对于可变形的 RoI 合并,现在部件被偏移以覆盖非刚性对象。

5.3.帕斯卡 VOC 与阿特鲁卷积的比较

Comparison of Atrous Convolution & Deformable Convolution

  • 只有可变形卷积 : DeepLab 、类感知 RPN、 R-FCN 有了改进,已经胜过 DeepLab 、类感知 RPN 和 R-FCN 有 atrous 卷积。并且具有可变形卷积的更快的 R-CNN 获得了与具有不规则卷积 (4,4,4)的更快的 R-CNN 的竞争结果。
  • 仅可变形 RoI 合并:仅在更快的 R-CNN 和 R-FCN 中有 RoI 合并。具有可变形 RoI 池的更快 R-CNN 获得与具有 atrous 卷积 (4,4,4)的更快 R-CNN 竞争的结果。具有可变形 RoI 池的 R-FCN 优于具有 atrous 卷积 (4,4,4)的 R-FCN 。
  • 变形卷积& RoI 合并 : 更快的 R-CNN 和 R-FCN 带变形卷积& RoI 合并是所有设置中最好的。

5.4.PASCAL VOC 上的模型复杂性和运行时间

Model Complexity and Runtime

  • 可变形的凸网只增加了模型参数和计算的少量开销。
  • 除了增加模型参数之外,显著的性能改进来自于对几何变换进行建模的能力。

5.5.COCO 上的对象检测

Object Detection on COCO test-dev (M: Multi-Scale Testing with Shorter Side {480, 576, 688, 864, 1200, 1400}, B: Iterative Bounding Box Average)

  • 使用可变形的 ConvNet 始终优于普通的。
  • 对齐-Inception-ResNet,用 R-FCN可变形 ConvNet ,加上多尺度测试迭代包围盒平均37.5% mAP @【0.5:0.95】得到。

6。使用比对异常检测 COCO 挑战的更多结果

  • 以上结果来自论文。他们还在 ICCV 2017 大会上展示了一项新成果。

6.1.对齐异常

Aligned Xception

  • 原始异常的校准异常的更新为蓝色。
  • 简而言之,一些最大池操作被入口流中的可分离 conv 所取代。在中间流程中,重复次数从 8 次增加到 16 次。在出口流中增加了一个 conv。

6.2.可可检测挑战

Object Detection on COCO test-dev

  • ResNet-101 作为特征提取器,****+OHEM 作为物体检测器:获得了 40.5%的 mAP,已经高于上一节提到的结果。
  • 用对齐的 替换ResNet-101例外 : 43.3% mAP。
  • 6 款车型组合+其他小改进 : 50.7%地图。
  • COCO 2017 探测挑战排行榜中,50.4%的地图使其成为挑战亚军。
  • COCO 2017 细分挑战赛排行榜中,42.6%的地图使其成为挑战赛季军。
  • 排行榜:http://cocodataset.org/#detection-leaderboard

如果有时间,希望也能复习一下 DCNv2。

参考

【2017 ICCV】【DCN】
可变形卷积网络

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(们)(还)(不)(想)(到)(这)(些)(人)(们)(,)(我)(们)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(们)(还)(没)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(里)(去)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(里)(去)(了)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(到)(这)(里)(来)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC

语义切分 FCNde convnetdeeplab v1&deeplab v2parse net】dilated netPSP netdeeplab v3

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet

实例分割
[深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

超分辨率 Sr CNNfsr CNNVDSRESPCN红网】

回顾:深层级联(LC) —并非所有像素都相等(语义分割)

原文:https://towardsdatascience.com/review-deep-layer-cascade-lc-not-all-pixels-are-equal-semantic-segmentation-cb29ec71b1a5?source=collection_archive---------18-----------------------

对于容易、中等和困难区域的分割,优于****CRF-RNNSegNetdilated netdeeplabv 1&deeplabv 2********

Segmentation for Easy, Moderate and Hard Regions

It 很久没有复习论文了,因为最近我一直在忙一些几何问题的研究工作,这不是我的强项。而且还在进行中。而昨天(23/07/2019),我已经加入了 AWSome Day ( 照片),同时抽时间看了一下深层级联(LC) 论文,lol。因此,在这个故事中,我想谈谈这篇由中文大学(CUHK)和深圳先进技术研究院发表的 2017 CVPR 论文,这篇论文被引用了 60 多次。( Sik-Ho Tsang @中)****

动机:

  • 原本使用深度骨干网高分辨率特征图,使得分割过程变慢****

主要思想:

  • 早期地层划分的易发区
  • 仅使用区域卷积(RC) 通过后面/更深的层分类的硬/困难区域。
  • 最后,分割精度提高训练和推理时间减少****

概述

  1. 深层级联
  2. 区域卷积(RC)
  3. 训练
  4. 消融研究
  5. 性能和速度分析
  6. 与最先进方法的比较

1。深层级联(LC)

1.1.将Inception-ResNet(IRNet)从图像分类目的转向语义分割目的

Original Inception-ResNet (IRNet) for Image Classification

  • 【Inception-ResNet(IRNet),原本用于图像分类,如上图,修改后用于语义分割。
  • 首先,为了增加预测的分辨率,IRNet 末端的池层被移除。并且通过减小“缩减-A/B”(从 2 到 1)中的卷积步长来扩大特征图的大小。因此,网络输出(标签图)的大小扩大了 4 倍。
  • 其次,小批量的大小受限(例如 8)。

1.2.从 IRNet 到 LC (IRNet-LC)

IRNet After Layer Cascade (LC) (IRNet-LC)

  • 如上图所示,IRNet-LC 有三个阶段。这三个阶段分别用黄色绿色蓝色来区分。
  • 两个卷积层和一个 softmax 损耗被附加在每个阶段的末尾每个阶段都有自己的损失函数。****
  • 第一阶段预测 21×64×64 分割标记图 L1。
  • 如果第 i 个像素的最大分数大于阈值 p (例如,0.95),则接受预测类,并且该像素不传播到阶段 2。
  • 发现在 p =0.95 的情况下,第一阶段中预测置信度> 0.95 的像素占据了一幅图像近 40%的区域,包含了大量的易像素。
  • 以及少量极硬像素,这些极硬像素具有被错误分类的高置信度。
  • 通过使更深的层能够聚焦于前景对象,从网络中移除那些容易的像素显著减少了计算并提高了准确性。
  • 阶段 2 到阶段 3 的情况类似。
  • 在通过所有三个阶段传播图像之后,我们直接组合这些阶段的预测标签图作为最终预测。
  • 最后, stage-1 信任大多数背景中的预测。
  • 阶段 2 和阶段 3 被学习来预测“较硬”区域,例如“人”和“马”。

2.区域卷积(RC)

  • (a) :标准正则卷积。
  • (b):区域卷积(RC)中的滤波器只卷积感兴趣的区域,记为 M ,忽略其他区域,大大减少了计算量。其他区域的值直接设置为零。****
  • 这意味着 M 被实现为二进制掩码
  • (c) : RC 上一个剩余模块h(I)=I+conv(I)。这相当于学习了一个掩蔽残差表示。****
  • 因此,每个阶段只需要学习它所关注的区域的特征

3.培养

网络由 ImageNet 中的预训练初始化。通过从正态分布中采样来初始化附加参数。而网络是先进行初始训练,再进行级联训练

3.1.初步训练

  • 这一步类似于深度监督网络(DSN) ,在网络的不同层有多个相同的损失函数
  • 它学习区分性和鲁棒性特征。
  • 每一级都被训练成最小化逐像素的 softmax 损失函数。
  • 通过使用反向传播(BP)和随机梯度下降(SGD)来联合优化这些损失函数。

3.2.级联训练

  • 通过利用 p 的级联策略对网络进行微调。
  • 更具体地说,BP 中的梯度仅传播到每个阶段的感兴趣区域
  • 直观地说,当前阶段对在前一阶段中具有低置信度的像素进行微调,使得“更硬”的像素能够被更深的层捕获,以提高分割精度并减少计算

4.消融研究

4.1. p 的值

Performances Using Different p.

  • PASCAL VOC 2012 验证集用于消融研究。
  • 如果 p =1,就跟 DSN 一样,比全卷积 IRNet 略胜一筹。
  • p 减小时,更容易的区域在早期阶段被分类,而较难的区域由后期阶段逐步处理。
  • 如果 p 太小,算法可能会变得过于乐观,即在早期阶段处理许多硬区域,并提前做出决策。性能将受到损害。
  • p = 0.985 时,即前期和52%区域附近的 LC 过程达到最佳性能。该值用于以下所有实验。

4.2.层级联的有效性

Effectiveness of Layer Cascade (LC)

  • IRNet :全卷积 IRNet。
  • DSN : IRNet 只经过初步训练。
  • DSN+Dropout :带 Dropout 的 DSN。
  • 模型级联(MC) : MC 将 IRNet 分为三个阶段,每个阶段分别进行训练。当训练某一阶段时,所有先前阶段的参数都是固定的。
  • 由此产生子模型,并使模型变浅,最终获得不良性能。
  • 层叠(LC) :相反,LC 具有层叠的吸引人的性质,并且还保持整个模型的内在深度。
  • 针对硬区域自适应地保持模型深度的能力使得 LC 在比较中表现突出。

4.3.逐阶段分析

(a) Change of label distribution in stage-2 and stage-3, (b) percentages of pixels at each stage for individual classes

  • (a) 示出了像素数相对于阶段-2 和-3 中的每个类别如何变化。所有比率都增加了,属于 1 到 1.4 的范围。****
  • 因为阶段 1 已经处理了容易的区域(即“背景”)并将困难的区域(即“前景”)留给阶段 2。
  • 阶段 2 到阶段 3 的情况类似。第三阶段进一步关注更难的课程
  • (b)显示了像“椅子”和“桌子”这样的较难的类具有由较深的层处理的更多像素(阶段 3)。

4.4.逐阶段可视化

Visualization of different stages’ outputs on PASCAL VOC 2012 dataset

  • 在 PASCAL VOC 2012 中,像“背景”和“人脸”这样的简单区域首先由 LC 中的 stage-1 标记。

Visualization of different stages’ outputs on Cityscape dataset

  • 类似地,在城市景观中,像“道路”和“建筑物”这样的简单区域首先由阶段 1 标记。其他的小物体和细节,如“柱子”和“行人”由阶段 2 和阶段 3 处理。

5.性能和速度分析

Performance on PASCAL VOC 2012

  • 这里对 DeepLabv2 和 SegNet 没有前后处理。
  • DeepLabv2 :使用超深 ResNet-101 的 mIoU 为 20.42。因此,推断的速度很慢(7.1 FPS)。
  • SegNet :速度更快(14.6 FPS),但代价超过 1000 万。
  • LC :具有区域卷积的级联端到端可训练框架允许其以可接受的速度(14.7 FPS)实现最佳性能(73.91 mIoU)。
  • LC(快速):0.8 的较小 p 的 LC。它在 23.6 FPS 下仍显示出 66.95 的竞争 mIoU。

Further Performance and Speed Trade-off

  • 减小 p 会稍微影响精度,但会大大减少计算时间。

6.与最先进方法的比较

6.1.帕斯卡 VOC 2012

mIoU on PASCAL VOC 2012 Test Set (+: Pre-training on MS COCO)

  • LC 实现了 80.3 的 mIoU,并通过 COCO 的预训练将 mIoU 进一步提高到 82.7,优于 SOTA 的方法,如 FCN 、DeepLabv1&DeepLabv2。
  • LC 赢得了 20 个前台类中的 16 个。
  • 在一些特殊的类别中,如“自行车”、“椅子”、“植物”和“沙发”,可以观察到较大的收益。

6.2.城市风光

mIoU on Cityscape Test Set

  • [19]由于使用了更深的主干网络来探索更丰富的上下文信息,因此性能略优于 LC。
  • 但是 LC 仍然在 19 个等级中的 9 个上获胜。
  • LC 在“传统上被视为”硬类别的类别中表现突出,例如,“栅栏”、“杆子”、“标志”、“卡车”、“公共汽车”和“自行车”,这些类别通常表现出灵活的形状和精细的细节。

6.3.不同设置的更多比较

Comparisons with state-of-the-art methods on PASCAL VOC 2012 test set

  • IRNet-LC 使用Inception-ResNet-v2(IRNet)作为主干网络,比 ResNet-101 要小(35.5M vs. 44.5M)。
  • IRNet-LC 采用了 DeepLabv2 中使用的阿特鲁空间金字塔池。
  • 没有对 COCO 女士进行预训练的 IRNet-LC 获得最佳性能。
  • 当删除“COCO”、“multiscale”和“CRF”时,IRNet-LC 仍然获得了与 DeepLabv2 相当的性能(78.2%对 79.7%),但在 FPS 方面明显优于deeplabv 2(14.3 FPS 对 0.9 fps)。
  • IRNet-LC 在不采用任何预处理和后处理步骤的情况下,分别比最先进的系统如 CRF-RNN 和 DPN 高出 3.5%和 0.7%。

6.4.形象化

PASCAL VOC 2012 Validation Set

Cityscape Validation Set

参考

【2017 CVPR】【LC】
并非所有像素都相等:经由深层级联的难度感知语义分割

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(有)(什)(么)(情)(况)(呢)(?)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(是)(这)(些)(人)(,)(还)(没)(有)(什)(么)(好)(的)(情)(感)(,)(我)(们)(还)(没)(有)(什)(么)(好)(的)(情)(感)(,)(但)(我)(们)(还)(没)(有)(什)(么)(好)(好)(的)(情)(感)(。 )(我)(们)(都)(不)(想)(要)(让)(这)(些)(人)(都)(有)(这)(些)(情)(况)(,)(我)(们)(还)(不)(想)(要)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(就)(是)(这)(些)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(。 )(我)(们)(都)(不)(知)(道)(,)(我)(们)(都)(是)(很)(强)(的)(,)(我)(们)(都)(是)(很)(强)(的)(对)(对)(对)(对)(起)(来)(,)(我)(们)(都)(是)(很)(强)(的)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(

物体检测 [ 过食 ] [ R-CNN ] [ 快 R-CNN ] [ 快 R-CNN][MR-CNN&S-CNN][DeepID-Net][CRAFT][R-FCN][离子 [G-RMI][TDM][SSD][DSSD][yolo v1][yolo v2/yolo 9000][yolo v3][FPN[retina net[DCN

语义切分[FCN][de convnet][deeplabv 1&deeplabv 2][CRF-RNN][SegNet][parse net][dilated net][DRN][RefineNet][

生物医学图像分割[cumevision 1][cumevision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN]

实例分割 [ SDS ] [ 超列 ] [ 深度掩码 ] [ 清晰度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

)( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )(

DeepPose Tompson NIPS'14 Tompson CVPR'15 CPM

复习:DeepLabv3 —阿特鲁卷积(语义分割)

原文:https://towardsdatascience.com/review-deeplabv3-atrous-convolution-semantic-segmentation-6d818bfd1d74?source=collection_archive---------0-----------------------

Rethink DeepLab,优于 PSP net(2016 ils vrc 场景解析挑战赛冠军)

在这个故事中,谷歌DeepLabv3 被呈现。在 DeepLabv1 和 DeepLabv2 被发明出来后,作者试图重新思考或重组 DeepLab 架构,并最终提出了一个更加增强的 DeepLabv3。 DeepLabv3 的性能优于 DeepLabv1 和 DeepLabv2 ,即使去掉了最初用于 DeepLabv1 和 DeepLabv2 的后处理步骤条件随机字段(CRF)。

因此,这篇论文的名字叫做“重新思考用于语义图像分割的阿特鲁卷积”。与 Inception-v3 的论文名称相伴的是“重新思考……”,名为“重新思考计算机视觉的 Inception 架构”,其中Inception-v1(Google net)和Inception-v2(Batch Norm)被重组为 Inception-v3 。但是现在, DeepLabv2 在这里重组为 DeepLabv3。而且是一篇 2017 arXiv 科技报告,引用 200 多次。( Sik-Ho Tsang @中)

概述

  1. 阿特鲁卷积
  2. 使用多重网格深入阿特鲁卷积
  3. 阿特鲁空间金字塔汇集(ASPP)
  4. PASCAL VOC 2012 年烧蚀研究
  5. 与 PASCAL VOC 2012 年最新方法的比较
  6. 与最新城市景观方法的比较

1。阿特鲁卷积

Atrous Convolution with Different Rates r

Atrous Convolution

  • 对于输出 y 和滤波器 w 上的每个位置 i ,atrous 卷积应用于输入特征图 x 上,其中 atrous 速率 r 对应于我们对输入信号进行采样的步幅。
  • 这相当于将输入 x 与通过沿每个空间维度在两个连续滤波器值之间插入 r -1 个零而产生的上采样滤波器进行卷积。(trous 在英语中是洞的意思。)
  • r =1 时,为标准卷积。
  • 通过调整 r,我们可以自适应地修改过滤器的视野。
  • 也称扩张卷积 ( 扩张网)或孔洞算法

Standard Convolution (Top) Atrous Convolution (Bottom)

  • :标准卷积。
  • 底部:阿特鲁卷积。我们可以看到,当 rate = 2 时,输入信号是交替采样的。首先,pad=2 意味着我们在左右两边都填充 2 个零。然后,当 rate=2 时,我们每隔 2 个输入对输入信号进行采样以进行卷积。阿特鲁卷积允许我们扩大过滤器的视野,以纳入更大的背景。因此,它提供了一种有效的机制来控制视野和 f 找到精确定位(小视野)和上下文同化(大视野)之间的最佳折衷。

2。使用多重网格深入研究阿特鲁卷积

  • (a)无阿特鲁 Conv :执行标准 Conv 和池化,使输出步幅增加,即输出特征图变小,越深入。然而,连续跨越对于语义分割是有害的,因为位置/空间信息在更深的层丢失了。
  • (b)与阿特鲁·conv:与阿特鲁斯·conv 一起,我们可以保持步幅不变,但视野更大,而不增加参数数量或计算量。最后,我们可以有更大的输出特征图,这有利于语义分割。
  • 例如,当 output stride = 16 且 Multi Grid = (1,2,4)时,块 4 中的三个卷积将分别具有 rates = 2×(1,2,4) = (2,4,8)。

3。阿特鲁空间金字塔池(ASPP)

Atrous Spatial Pyramid Pooling (ASPP)

  • ASPP 已经在 DeepLabv2 中推出。这次,来自 Inception-v2 的批量标准化(BN)被包含到 ASPP。
  • 使用 ASPP 的原因是,随着采样率变大,有效滤波器权重(即,应用于有效特征区域而不是填充零的权重)的数量变小。
  • 一个 1×1 卷积和三个 3×3 卷积,码率= (6,12,18) 当输出步长= 16 时。
  • 此外, ParseNet 的图像池图像级特征也包含在全局上下文中。(有兴趣请阅读我的 ParseNet 评测。)
  • 全部用 256 过滤器批量归一化
  • 当输出步幅= 8 时,速率加倍。
  • 来自所有分支的结果特征然后被连接并通过另一个 1×1 卷积(也有 256 个过滤器和批量标准化),然后通过最终 1×1 卷积生成最终逻辑。

其他人

上采样逻辑

  • 在 DeepLabv2 中,目标地面实况在训练期间被向下采样 8 倍。
  • 在 DeepLabv3 中,发现保持基本事实的完整性,而不是对最终逻辑进行上采样是非常重要的。

4.PASCAL VOC 2012 烧蚀研究

4.1.输出步幅

Going deeper with atrous convolution when employing ResNet-50 with block7 and different output stride.

  • 将 ResNet-50 与 block7(即额外的 block5、block6 和 block7)一起使用时。如表所示,在输出跨距= 256 的情况下(即完全没有 atrous 卷积),性能要差得多。
  • 当输出步幅变大并相应地应用 atrous 卷积时,性能从 20.29%提高到 75.18%,表明 atrous 卷积在为语义分割级联构建更多块时是必不可少的。

4.2.ResNet-101

ResNet-50 vs ResNet-101

  • 毫无疑问,ResNet-101 始终比 ResNet-50 好。
  • 值得注意的是,将 block7 用于 ResNet-50 会略微降低性能,但仍会提高 ResNet-101 的性能。

4.3.多重网格

Employing multi-grid method for ResNet-101 with different number of cascaded blocks at output stride = 16.

  • 应用多重网格方法通常比(r1,r2,r3) = (1,1,1)的普通版本更好。
  • 简单地将单位速率加倍(即(r1,r2,r3) = (2,2,2))是无效的。
  • 使用多重网格可以提高性能。
  • 最佳模型是采用 block7 和(r1,r2,r3) = (1,2,1)的情况。

4.4.推理策略

Inference strategy on the val set. MG: Multi-grid. OS: output stride. MS: Multi-scale inputs during test. Flip: Adding left-right flipped inputs.

  • 用输出步幅= 16 训练该模型。
  • 当在推理过程中使用 output stride = 8 (OS=8)来获得更详细的特征图时,性能提高了 1.39%。
  • 当使用尺度= {0.5,0.75,1.0,1.25,1.5,1.75}的多尺度(MS)输入以及使用左右翻转图像并平均概率时,性能进一步提高到 79.35%。

4.5.ASPP

ASPP with MG method and image-level features at output stride = 16.

  • 由 ParseNet 提供的图像池或图像级功能也包含在全局上下文中。(有兴趣请阅读我的 ParseNet 评测。)
  • 在 ASPP = (6,12,18)的背景下采用多重网格= (1,2,4)优于多重网格= (1,1,1)和(1,2,1)。
  • 用 ASPP = (6,12,18)比 ASPP = (6,12,18,24)好。
  • 采用图像级特征后,性能进一步提高到 77.21%。

4.6.作物大小、上采样逻辑、批量标准、批量大小、训练和测试输出步幅

  • 使用更大的作物尺寸 513 比 321 好。
  • 用上采样对数和批量常模,77.21%。
  • 在 4、8、12 和 16 中,使用批量 16 是最好的。
  • 使用训练和测试输出步幅= (8,8)具有 77.21%的结果,而使用训练和测试输出步幅= (16,8)具有 78.51%的更好结果。

4.7.培训期间的副本数量

Number of Replicas During Training

  • TensorFlow 用于训练。
  • 使用只需要 1 个副本,3.65 天的训练时间。
  • 使用 32 个副本,只需要 2.74 小时的训练时间。

4.7.一起

Inference strategy on the val set

  • MG(1,2,4) + ASPP(6,12,18) +图像池 : 得到 77.21% ,与 4.5 的结果相同。
  • 推理输出步幅= 878.51%
  • 多尺度(MS)测试 : 79.45%
  • 水平翻转(翻转) : 79.77%
  • 椰子进行预处理后: 82.70%
  • 值得注意的是,经过重新思考和重组,在不使用后处理 CRF(用于 DeepLabv2 )的情况下,已经比使用 CRF 和使用 COCO 进行预训练的 DeepLabv2 好了 77.69%。

5。与最先进方法的比较

5.1.PASCAL VOC 2012 测试集

PASCAL VOC 2012 Test Set

  • DeepLabv3 :对 PASCAL VOC 2012 trainval set 进行进一步微调,使用输出步幅= 8 进行训练,在硬映像上引导。特别地,包含硬分类的图像被复制, 85.7%

Effect of Bootstrapping

  • 上面显示的硬图像上自举的改进提高了稀有和精细注释类(如自行车)的分割精度。
  • 并且 DeepLabv3 胜过 PSPNet ,在 ILSVRC 2016 场景解析挑战赛中获得第一名。
  • DeepLabv3-JFT :采用已经在 ImageNet 和 JFT-300M 数据集上预处理过的 ResNet-101, 86.9%

Qualitative Results (Last Row, Failure Case) on PASCAL VOC 2012

6。与最新城市景观方法的比较

6.1.不同的设置

  • 类似于 PASCAL VOC 2012,使用 8 的输出跨距进行测试,多标度和水平翻转也是如此,性能得到了提高。

6.2.城市景观测试集

Cityscape Test Set

  • 为了获得更好的比较性能,DeepLabv3 在 trainval 粗集上进一步训练(即 3475 个精细注释图像和额外的 20000 个粗注释图像)。
  • 推理时使用更多的刻度更精细的输出步幅。特别地,在标度= {0.75,1,1.25,1.5,1.75,2} 和求值输出步距= 4 的情况下,这分别为在验证集上贡献了额外的 0.8%和 0.1%。
  • 最终在测试集上取得了 81.3% mIOU,比PSP net略好。****

Qualitative Results on Cityscape

DeepLabv3 仅在很小的差距上胜过 PSPNet,也许这也是为什么它只是 arXiv 中的一份技术报告。但是后来,发明了比 DeepLabv3 好得多的 DeepLabv3+。希望以后可以复习 DeepLabv3+。😃

参考

【2017 arXiv】【DeepLabv3】
反思阿特鲁卷积用于语义图像分割

我的相关评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC

语义切分 FCNde convnetdeeplabv 1&deeplabv 2】parse net】dilated netPSPNet]

生物医学图像分割

实例分割
[深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

超分辨率 Sr CNNfsr CNNVDSRESPCN红网】

综述:深度姿势 CNN 的级联(人体姿势估计)

原文:https://towardsdatascience.com/review-deeppose-cascade-of-cnn-human-pose-estimation-cf3170103e36?source=collection_archive---------7-----------------------

在四个数据集上使用级联卷积神经网络进行优化,实现最先进的性能

在这个故事里,DeepPose,Google 的用于人体姿态估计,进行了回顾。它被公式化为基于深度神经网络(DNN)的针对身体关节的回归问题利用级联的 DNN,可以实现高精度的姿态估计。这是一篇 2014 年 CVPR 论文,引用超过 900 次。( Sik-Ho Tsang @中)

概述

  1. 姿态向量
  2. 卷积神经网络(CNN)作为姿态回归器
  3. 姿态回归器的级联
  4. 结果

1.姿态向量

Pose Vector (Miss You Paul Walker!)

  • 为了表达一个姿势,我们将所有 k 个身体关节的位置编码在姿势向量中,定义为 y :

  • 对于每一个,都有第 I 个关节的 xy 坐标。这些是图像中的绝对坐标。
  • 被标记的图像由( xy )表示,其中 x 是图像数据, y 是地面真实姿态向量,如上式所示。(我遵循了论文中的指示,尽管对 y 来说可能有点混乱。)
  • 并且我们可以**归一化人体或其部分所围成的坐标yiw . r . t . a 框 b ,其中 b =( bcbwbh )以 bc 为中心, bw**

  • 如上图, 按方框大小缩放,按方框中心平移。使用:

  • N(yb )* 是归一化的姿态向量。以及N(x); b 是由边界框 b 对图像 x 的裁剪。*

2.C 选择神经网络(CNN)作为姿态回归器

CNN As Pose Regressor

  • 利用训练好的参数 θ ,基于 CNN 的 ψ 输出关节的归一化预测。 y 可以通过反规格化得到 N ^-1.*
  • 架构如上图是 AlexNet 。
  • 第一层将预定义尺寸的图像作为输入*。*
  • 最后一层输出 2k 关节坐标
  • C(55×55×96)—LRN—P—C(27×27×256)—LRN—P—C(13×13×384)—C(13×13×384)—C(13×13×256)—P—F(4096)—F(4096)其中 C 为卷积,LRN 为局部响应归一化,P 为汇集,F 为全连通层。
  • 参数总数为 40M。
  • 该损失是通过最小化预测的和地面真实姿态向量之间的 L2 距离来预测姿态向量的线性回归损失。
  • 利用归一化训练集 D_N ,L2 损失为:

  • 其中 k 是该图像中关节的数量。
  • 小批量是 128 个。通过随机平移和左/右翻转增加数据。

3.姿态回归器的级联

Cascade of Pose Regressors: First Stage: (Left), Subsequent Stages (Right)

  • 不容易增加输入大小来获得更精细的姿态估计,因为这将增加已经很大数量的参数。因此,提出了级联的姿态回归器。
  • 因此,随着阶段 s 的参与,第一阶段:

  • 其中 b ⁰是人探测器获得的完整图像或一个方框。
  • 然后,后续阶段:

  • 其中 diam( y )是相对关节的距离,比如左肩和右髋,然后用σ缩放,σdiam( y )。
  • 对于后续层,基于来自niss-1)的采样位移 进行增强以生成模拟预测:

  • 并且训练基于这个扩充的训练集:

4.结果

4.1.数据集

  • 电影中标记的帧(FLIC) :来自好莱坞电影的 4000 个训练和 1000 个测试图像,姿势多样,服装多样。对于每个被标记的人,标记 10 个上身关节。
  • Leeds Sports Dataset(LSP):11000 张训练和 1000 张测试图像,这些图像来自在外观和特别是发音方面具有挑战性的体育活动。大多数人有 150 像素高。每个人全身总共有 14 个关节。

4.2.韵律学

  • 正确部位百分比(PCP) :测量肢体检测率,其中如果两个预测关节位置和真实肢体关节位置之间的距离最多为肢体长度的一半,则认为检测到肢体。
  • 检测到的关节百分比(PDJ) :如果预测关节和真实关节之间的距离在躯干直径的某个分数范围内,则认为检测到了一个关节。通过改变这个分数,可以获得不同程度定位精度的检测率。

4.3.消融研究

  • FLIC 和 LSP 数据集的 50 个图像的小集合。
  • 对于 FLIC,探索值{0.8,1.0,1.2}后σ = 1.0。
  • 对于 LSP,探索值{1.5,1.7,2.0,2.3}后σ = 2.0。
  • 对于上述数据集,当 S = 3 时,停止改进。
  • 对于从 s = 2 开始的每个级联阶段,增加 40 个随机平移的裁剪框。对于 14 节点的 LSP,训练样本数= 11000×40×2×14 = 12M。
  • 在 12 核 CPU 上,每个图像的运行时间约为 0.1 秒。
  • 初始阶段大约在 3 天内进行培训。100 名工人,但大部分最终表演是在 12 个小时后完成的。
  • 每个细化阶段训练 7 天,因为由于数据扩充,数据量比初始阶段的数据量大 40。

PDJ on FLIC or the first three stages of the DNN cascade

  • 级联 CNN 进行优化有助于改善结果。

Predicted Pose (Red) Ground Truth Poses (Green)

  • 同样,细化有助于改善结果。

4.4.与最先进方法的比较

PDJ on FLIC for Two Joints: Elbows and Wrists

PDJ on LSP for Two Joints: Arms and Legs

  • 对于两个数据集,DeepPose 获得了与真实关节的不同归一化距离的最高检测率。

PCP at 0.5 on LSP

  • DeepPose-st2 和 DeepPose-st3 获得了最先进的结果。

4.5.跨数据集综合

PDJ on Buffy Dataset for To Joints: Elbow and Wrist

  • 此外,在 FLIC 上训练的上身模型应用于整个 Buffy 数据集。
  • DeepPose 获得可比较的结果。

PCP at 0.5 on Image Parse Dataset

  • 在 LSP 上训练的全身模型在图像解析数据集的测试部分上被测试。

4.6.示例姿势

Visualization of LSP

Visualization of FLIC

参考

【2014 CVPR】【Deep Pose】
Deep Pose:通过深度神经网络进行人体姿态估计

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(有)(什)(么)(情)(况)(呢)(?)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(是)(这)(些)(人)(,)(还)(是)(这)(些)(人)(,)(还)(没)(有)(什)(么)(好)(的)(情)(情)(况)(,)(还)(是)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [ DSSD ] [ 约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3 ] [ FPN ] [ 视网膜网 ] [ DCN ]

语义切分 FCNde convnetdeeplab v1&deeplab v2CRF-RNN】SegNet】parse netdilated netPSPNetdeeplab v3]

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道[V-Net]

实例分割 [SDS[超列 ] [ 深度掩码 ] [ 锐度掩码 ] [ 多路径网络][MNC][Instance fcn][FCIS

超分辨率 [Sr CNN][fsr CNN][VDSR][ESPCN][红网][DRCN][DRRN][LapSRN&MS-LapSRN][srdensenenet

人体姿态估计
汤普逊 NIPS’14

综述:Dual 双路径网络(图像分类)

原文:https://towardsdatascience.com/review-dpn-dual-path-networks-image-classification-d0135dce8817?source=collection_archive---------11-----------------------

优于 ResNet、DenseNet、PolyNet、ResNeXt,ILSVRC 2017 对象本地化挑战赛冠军

在这个故事里,【双路径网络】被简要回顾。这是新加坡国立大学、北京理工大学、国防科技大学、奇虎 360 AI 研究所合作的作品。 ResNet 支持功能重用,而 DenseNet 支持新功能探索。DPN 从 ResNet 和 DenseNet 这两者中挑选优势。最后,它在图像分类任务上优于 ResNet 、 DenseNet 、 PolyNet 、 ResNeXt 。DPN 赢得了 ILSVRC 2017 本地化挑战赛。凭借更好的主干,它还可以为对象检测和语义分割任务获得最先进的结果。并作为 2017 NIPS 论文发表,引用 100 余篇。( Sik-Ho Tsang @中)

概述

  1. ResNetdense net和 DPN****
  2. 与最先进方法的比较

1。 雷斯内特 丹森内特 和 DPN

1.1. DenseNet

DenseNet

  • 作者尝试将 ResNet 和 DenseNet 表示为高阶递归神经网络(HORNN)进行解释。
  • 当 DenseNet 表示为 HORNN 时, DenseNet 可以表示如上图。
  • 绿色箭头表示共享权重卷积。

DenseNet

1.2.ResNet

  • 添加了一个新路径来临时保存绿色箭头的输出以供重用。

ResNet (Left) DenseNet (Right)

  • 虚线矩形实际上是剩余路径。

ResNet (Left) DenseNet (Right)

  • 剩余网络本质上是密集连接的网络,但是具有共享连接。
  • ResNet :特征细化(特征复用)。
  • dense net:不断探索新功能。****

Managing a Company

  • 就像管理公司一样:
  • 员工需要不断提高技能(特征提炼)。
  • 还需要招聘大一新生到公司(特色探索)。
  • 论文中有大量段落和方程供 ResNet 和 DenseNet 解释。如果感兴趣,请阅读该文件。

1.3.DPN

DPN

  • 为了兼具两者的优点,网络变成了如上左图。
  • 将两列合并为一列,DPN 如上图所示。

Detailed Architecture and Complexity Comparison

  • 与 ResNeXt 相比,DPN 被有意设计成具有相当小的模型尺寸和较少的 FLOPs。
  • DPN-92ResNeXt-101【32×4d】成本约为成本约为 15%,而 DPN-98ResNeXt-101【64×4d】成本约为 26%。
  • 在 224×224 输入的情况下, DPN-92ResNeXt-101【32×4d】DPN-98ResNeXt-101消耗约25% FLOPs(64

2.与最先进方法的比较****

2.1.图像分类

ImageNet-1k Dataset Validation Set (+: Mean-Max Pooling)

  • 与 ResNeXt-101 (32×4d)相比,深度仅为 92 的浅 DPN 将 top-1 错误率降低了 0.5%的绝对值,与 DenseNet-161 相比,降低了 1.5%的绝对值,但提供的 FLOPs 要少得多。
  • 更深的 DPN (DPN-98)超过了最好的残差网络— ResNeXt-101 (64×4d),并且仍然享有少 25%的 FLOPs 和小得多的模型尺寸(236 MB 对 320 MB)。
  • DPN-131 显示出优于最佳单一型号的精确度——非常深的 PolyNet ,具有小得多的型号尺寸(304 MB v.s. 365 MB)。
  • PolyNet 采用随机深度(SD) 等众多招数进行训练,DPN-131 可以使用标准训练策略进行训练。而且 DPN-131 的实际训练速度比波利尼特快 2 倍左右。

Comparison of total actual cost between different models during training.

  • 实际成本如上所述进行比较。
  • DPN-98 比性能最好的 ResNeXt 快 15%,使用的内存少 9%,测试错误率也低得多。
  • 与性能最好的 ResNeXt 相比,更深的 DPN-131 只多花费了大约 19%的训练时间,但却达到了最先进的单一模型性能。
  • PolyNet (537 层)【23】的训练速度,基于使用 MXNet 的重新实现,约为每秒 31 个样本,表明 DPN-131 在训练期间运行速度比 PolyNet 快约 2 倍。

4.2.场景分类

Places365-Standard dataset Validation Accuracy

  • Places365-Standard 数据集是一个高分辨率的场景理解数据集,包含 365 个场景类别的超过 180 万幅图像。
  • DPN-92 需要的参数少得多(138 MB 对 163 MB),这再次证明了它的高参数效率和高泛化能力。

4.3.目标检测

PASCAL VOC 2007 test set

  • 该模型在 VOC 2007 trainval 和 VOC 2012 trainval 的联合集上进行训练,并在 VOC 2007 测试集上进行评估,使用更快的 R-CNN 框架。
  • DPN 获得了 82.5%的地图,这是一个很大的进步,比 ResNet-101 提高了 6.1%,比 ResNeXt-101 (32×4d)提高了 2.4%。

4.4.语义分割

PASCAL VOC 2012 test set

  • 细分框架基于 DeepLabv2 。conv4 和 conv5 中的 3×3 卷积层替换为 atrous 卷积,并且在 conv5 的最终要素图中使用了阿特鲁空间金字塔池(ASPP)。
  • DPN-92 具有最高的整体 mIoU 精度,将整体 mIoU 提高了绝对值 1.7%。
  • 考虑到的 ResNeXt-101 (32×4d)与的 ResNet-101 相比,整体 mIoU 仅提高绝对值 0.5%,建议的 DPN-92 与的 ResNeXt-101 (32×4d)相比,提高了 3 倍以上。

4.5.ILSVRC 2017 对象本地化

Visualization

  • 以更快的 R-CNN 为框架。
  • 当使用额外的训练数据时,DPN 在分类和本地化任务中也获得了胜利。
  • 排行榜:http://image-net.org/challenges/LSVRC/2017/results

4.5.ILSVRC 2017 对象检测

Visualization

参考

【2017 NIPS】【DPN】
双路径网络

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(有)(什)(么)(情)(况)(呢)(?)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(是)(这)(些)(人)(,)(还)(是)(这)(些)(人)(,)(还)(没)(有)(什)(么)(好)(的)(情)(情)(况)(,)(还)(是)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [ DSSD ] [ 约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3 ] [ FPN ] [ 视网膜网 ] [ DCN ]

语义切分 FCNde convnetdeeplab v1&deeplab v2CRF-RNN】SegNet】parse netdilated netPSPNetdeeplab v3]

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道[V-Net]

实例分割 [SDS[超列 ] [ 深度掩码 ] [ 锐度掩码 ] [ 多路径网络][MNC][Instance fcn][FCIS

超分辨率 [Sr CNN][fsr CNN][VDSR][ESPCN][红网][DRCN][DRRN][LapSRN&MS-LapSRN][srdensenenet

人体姿态估计
深度姿态汤普逊·尼普斯 14

综述:DRN——扩张残差网络(图像分类和语义分割)

原文:https://towardsdatascience.com/review-drn-dilated-residual-networks-image-classification-semantic-segmentation-d527e1a8fb5?source=collection_archive---------10-----------------------

使用扩展卷积、改进的 ResNet,用于图像分类、图像定位和语义分割

在这个故事中,回顾了普林斯顿大学英特尔实验室DRN(扩张剩余网络)。在 2016 年 ICML 发表了用于语义分割的 DilatedNet 之后,作者发明了 DRN,它不仅可以改善语义分割,还可以改善图像分类,而不增加模型的深度或复杂性。发表在 2017 CVPR 上,引用 100 余次。( Sik-Ho Tsang @中)

概述

  1. 扩张卷积
  2. 扩张的原因
  3. 扩张的剩余网络(DRN)
  4. 本地化
  5. 去网纹
  6. 结果

1。扩张卷积

  • 为简单起见,我仅引用中的方程式:

Standard Convolution (Left), Dilated Convolution (Right)

  • 左边的是标准卷积。右边的是扩张的回旋。我们可以看到在求和的时候,就是 s+ l t=p 我们在卷积的时候会跳过一些点。
  • l =1 时,为标准卷积。
  • l1 时,为扩张卷积。

Standard Convolution (l=1) (Left) Dilated Convolution (l=2) (Right)

  • 以上举例说明了 l =2 时展开卷积的例子。我们可以看到感受野比标准感受野大

l=1 (left), l=2 (Middle), l=4 (Right)

  • 上图显示了更多关于感受野的例子。

2。扩张卷积的原因

  • 研究发现,在网络末端获得的输出特征图很小的情况下,语义切分的准确率会降低。
  • 在 FCN 中,也说明了当需要 32 倍上采样时,我们只能得到一个非常粗略的分割结果。因此,需要更大的输出特征图。
  • 一种简单的方法是简单地去除网络中的子采样(步长)步骤,以增加特征图的分辨率。然而,这也减少了感受野,严重减少了上下文的数量。对于更高分辨率来说,感受野的这种减小是不可接受的代价。
  • 由于这个原因,使用扩张的卷积来增加较高层的感受野,补偿由于去除二次采样而引起的感受野的减少。
  • 并且发现使用扩张卷积也有助于本文的图像分类任务。

3.扩张残差网络(DRN)

  • 在本文中,使用 d 作为膨胀因子。
  • d =1 时,为标准卷积。
  • d1 时,为扩张卷积。

原件 ResNet

  • 在原 ResNet 中,最后 2 组卷积层 G4G5 使用 3×3 标准卷积( d =1):

  • 由于最大池化,特征地图变得越来越小。
  • 输出特征图只有 7×7 的大小。这并不像上一节提到的那样好。

DRN

  • 在 DRN,在 G4 处,使用 d =2:

  • G5 处,对于第一次卷积( i =1),仍然使用 d =2:

  • G5 ,对于剩余的卷积(I>1),使用 d =4:

  • 最后, G5 在 DRN 的产量是 28×28,比原来的 ResNet 产量大很多。

4.本地化

  • 对于图像分类任务,最后,有一个全局平均池,然后是 1×1 卷积和 softmax。
  • 为了进行本地化配置,只需简单地删除普通池。不涉及训练或参数调整。准确的分类 DRN 可以直接用于定位。

5.去网纹

A Gridding Artifact

  • 如上所示,当特征图的高频成分高于扩展卷积的采样速率时,会出现网格伪像。

DRN-A (Top) DRN-B (Middle) DRN-C (Bottom)

  • DRN-A :只有扩张卷积的,有网格状伪影。
  • DRN-B :发现第一次最大汇集操作导致高振幅高频率激活。因此,第一最大池层由 2 个残差块(4 个 3×3 卷积层)代替,以减少网格伪影。网络末端还增加了 2 个剩余块。
  • DRN-C :在网络的末端,膨胀逐渐降低到去除混叠伪影,即2-膨胀卷积后跟 1-膨胀卷积。然而,神器仍然在这里,因为它可以通过残余连接传递。因此,相应的剩余连接被移除。

Activation Maps of ResNet-18 and Corresponding DRNs

  • 上面显示了一个可视化。
  • DRN-A-18 :卷积扩张,存在网格状伪影。
  • DRN-B-26 :用卷积代替最大池,特征图有更少的伪影。
  • DRN-C-26 :随着逐渐变小的扩张卷积和去除残留连接,伪影进一步减少。

Feature Map Visualization at Different Levels in DRN-C-26 (The highest average activation at each level is shown)

6.结果

6.1.ImageNet 上的图像分类

Top-1 & Top-5 Error Rates on ImageNet Validation Set

  • DRN-A-18 和 DRN-A-34 在 1-crop top-1 精度上分别领先ResNet-18ResNet-342.43 和 2.92 个百分点。(在 ResNet-34 到 DRN-A-34 的情况下,误差相对减少 10.5%。)
  • DRN-A-50 在单作物 top-1 精度上比 雷斯内特-50 高出一个百分点以上。
  • 将一个ResNet直接转化为一个 DRN-A ,完全不改变模型的深度或容量,显著提高分类精度。
  • 每只 DRN-C 的表现都明显优于相应的 DRN-A
  • DRN-C-26 是从 DRN-A-18 衍生而来的,其精确度与更深的 DRN-A-34 相当。
  • DRN-C-42 是从 DRN-A-34 衍生而来的,其精确度与更深的 DRN-A-50 相当。
  • DRN-C-42 接近于 ResNet-101 的精确度,尽管后者更深 2.4 倍。

6.2.ImageNet 上的对象定位

  • 这里,基于特征图激活值执行弱监督对象定位。

  • C =1000,因为它是一个 1000 级的 ImageNet 数据集。
  • C 分辨率的响应图 W × H ,f( cwh )为位置响应( wh ),各位置的优势类为 g ( wh )。边界框的集合是 Bi 其中 t 是激活阈值。并且在 Bi 中选择最小包围盒 bi
  • 对于地面实况框大于 0.5 的 IoU,它被认为是准确的。

Top-1 & Top-5 Localization Error Rates on ImageNet Validation Set

  • DRNs 优于相应的ResNet车型,说明了基本 DRN 建设的好处。
  • DRN-C-26 的性能明显优于 DRN-A-50,尽管其深度要低得多。这表明去网格方案对于需要更详细的空间图像分析的应用特别有益。
  • DRN-C-26 也胜过雷斯内特-101 。

6.3.城市景观的语义分割

  • 对于 ResNet-101 ,它得到了 66.6%的平均 IoU。
  • DRN-C-26 比 ResNet-101 基准高出一个多百分点,尽管深度低了 4 倍。
  • 尽管深度低 2.4 倍,但 DRN-C-42 型号的性能比 ResNet-101 基线高出 4 个百分点。
  • DRN-C-26 和 DRN-C-42 都优于 DRN-A-50,这表明去网格结构对密集预测任务特别有利。

Cityscape Dataset

  • 如上所示,DRN-A-50 的预测被网格伪影破坏,即使该模型是在密集像素级监督下训练的。
  • 相比之下,DRN-C-26 的预测不仅更准确,而且更清晰。

6.4.使用 DRN-D 获得更多结果

  • 在作者的 GitHub 中也有一个 DRN-D,它是 DRN-C 的简化版本

Classification error rate on ImageNet validation set and numbers of parameters.

Classification error rate on ImageNet validation set and numbers of parameters

所有的 DRN 也可以获得较低的错误率,而有较少的参数数目(较小的模型)。

*Segmentation mIoU and number of parameters ( trained with poly learning rate, random scaling and rotations.)

  • DRN-D-22 以较少的参数达到 68%的 mIoU,与 DRN-C-26 相同,但高于 DRN-A-50。

不是逐渐降低内部表示的分辨率直到场景的空间结构不再可辨,而是在最终输出图层中始终保持高空间分辨率。图像分类精度提高,最终 DRN 优于最先进的 ResNet 。

参考

【2017 CVPR】【DRN】
散漫残网

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(要)(到)(这)(些)(人)(,)(我)(们)(就)(不)(想)(要)(到)(这)(些)(人)(里)(来)(,)(我)(们)(都)(不)(想)(到)(这)(些)(人)(了)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC yolo 9000[yolov 3][FPN][retina net][DCN]

语义切分 FCNde convnetdeeplab v1&deeplab v2SegNet】parse netdilated netPSP netdeeplab v3

生物医学图像分割 [ 累计视觉 1 ] [ 累计视觉 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet]

实例分段 DeepMask SharpMask MultiPathNet MNC InstanceFCN FCIS 】

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

综述:DRRN——深度递归残差网络(超分辨率)

原文:https://towardsdatascience.com/review-drrn-deep-recursive-residual-network-super-resolution-dca4a35ce994?source=collection_archive---------17-----------------------

多达 52 个卷积层,具有全局和局部剩余学习,性能优于 SRCNN、FSRCNN、ESPCN、VDSR、DRCN 和 RED-Net。

Digital Image Enlargement, The Need of Super Resolution

在这个故事里, DRRN(深度递归剩余网络)是回顾。用全局残差学习(GRL)多路径模式局部残差学习(LRL) ,加上递归学习在增加深度的同时控制模型参数,最多可以达到 52 层。DRRN 明显优于最先进的方法,如 SRCNN 、 FSRCNN 、 ESPCN 、 VDSR 、 DRCN 和红网。并且发表在 2017 CVPR100 多篇引用。( Sik-Ho Tsang @中)

概述

  1. DRRN 架构
  2. 残差单元的数量(U) &递归块的数量(B)
  3. 消融研究
  4. 结果

1.DRRN 架构

Comparison of Different Architectures

  • ResNet : 残差单位用于预测。对于每个残差单元,有使用两个卷积的身份映射(即跳过连接)和残差映射
  • VDSR :残差学习用于输入低分辨率(LR)图像和输出高分辨率(HR)图像之间。这是一个全局剩余学习(GRL) 。剩余分支中叠加了 20 层 3×3 卷积。可获得 41×41 的大感受野。而 VDSR 实际上是 DRRN 的一个特例。(后面会提到)
  • DRCN :还有一种可以当作 GRL 的跳接。在剩余分支,使用递归卷积,即所有卷积共享参数(绿色)。每个递归卷积的输出负责生成 HR 图像。并且所有的 HR 图像被轻量级地组合以获得最终的输出。
  • DRRN : GRL 由于在 VDSR 和 DRCN 中的有效性也被使用。在残差分支处,不使用 DRCN 、中的递归卷积,而是通过使用残差块内的递归卷积来使用一堆残差块,如上所示。因此,这里介绍多路径局部残差学习(LRL)。

2。残差单元的数量(U) &递归块的数量(B)

Number of Residual Units (U)

2.1.剩余单元数( U )

  • U : 递归块中剩余单元的数量U ={1,2,3}的例子如上图所示。
  • 注意,当 U 增加时,参数没有增加。因为参数是共享的
  • 并且使用预激活剩余单元,即 BN-ReLU-Conv ,而不是 Conv-BN-ReLU。这是建议在预激活 ResNet 中对原 ResNet 进行改进。

2.2.递归块数( B )

B=6, 6 Recursive Blocks (Left), U=3, 3 Residual Units in a Recursive Block (right)

  • 上面显示了 B 的含义,即网络中使用了多少个递归块。
  • 因此,可以根据 BU 计算 DRRN d 的深度(卷积层数):
*d*=(1+2×*U*)×*B*+1
  • 如果 U =0,DRRN 变为 VDSR 。
  • 损失函数是标准 MSE:

3.消融研究

3.1.一些细节

  • 训练集:来自杨的 91 幅图像,来自伯克利分割数据集的 200 幅图像,共 291 幅图像。
  • 测试装置:装置 5、装置 14、BSD100 和 Urban100。
  • 数据增加 : 翻转旋转版本,即 7 个附加增加版本。比例放大也用于不同的比例(×2、×3 和×4)。
  • 使用跨距为 21 的 31×31 面片。小批量是 128 个。
  • 每个卷积层有 128 个滤波器,大小为 3×3。
  • d =20 的情况下,用 2 个 Titan X GPUs 训练 4 天。
  • 双三次插值在进入网络之前首先被应用。
  • 仅亮度分量。
  • 图像边界附近的像素在评估前被裁剪。

3.2.硼和铀的研究

Various combinations of B and U (scaling factor ×3 on Set5)

  • 通过将一个参数固定为 3,并将另一个参数从 1 改为 4 ,上图显示增加 BU 会导致更深的型号 并获得更好的性能,这表明更深还是更好。
  • 只要深度相近,型号就有可比性,如 B2U3 ( d = 15,k = 784K)和 B3U2 ( d = 16,k = 1,182K)分别达到 33.76 和 33.77 dB。(k= #参数)
  • 通过固定一个参数为 1,改变另一个参数来构造d = 52 的网络,我们可以得到 B1U25 ( k = 297K)和 b17u 1(k= 7375k)。对于 B1U25,只有一个具有 25 个剩余单元的递归块被递归学习。对于 B17U1,堆叠 17 个递归块,无需任何递归学习。
  • 还构造了 B3U8 ( d = 52,k= 1182k)。
  • 所有的 B17U1、B3U8、B1U25,具有 d =52,具有相似的性能。
  • B1U25 使用的参数要少得多。因此,它被视为最佳模型。

3.3.DRRN 变体

DRRN Variants (NS: No Sharing of Weights, C: Chained, Not Multi-path)

  • DRRN_NS_C :有 LRL 但没有多路径递归学习,33.92dB
  • DRRN_NS : DRRN 但无重量分担,33.97dB。
  • DRRN_C: DRRN 但不使用多径,仅在剩余分支处使用链式卷积,33.95dB。
  • DRRN : 33.99dB,这说明所有组件对改善结果都很重要。

4.结果

4.1.与最先进模型的比较

Benchmark Results Using PSNR and SSIM

  • DRRN_B1U9 ( d = 20, k = 297K):与 VDSR 和 DRCN 深度相同,但参数更少。
  • 在所有数据集和缩放因子中,DRRN_B1U9 和 DRRN_B1U25 都优于所有方法,包括 SRCNN 、 VDSR 和 DRCN 。
  • 特别是在 Urban100 数据集上,DRRN 大幅领先所有方法。

Benchmark Results Using Information Fidelity Criterion (IFC) metric

  • 还评估与感知分数相关的度量信息保真度标准(IFC)
  • 这里, VDSR 由作者重新实现,使用 BN。(原 VDSR 不使用 BN。)
  • DRRN 仍然优于所有方法。
  • 20 层 B1U9 DRRN 在 Titan X GPU 上处理 288×288 图像需要 0.25 秒

PSNR for scale factor ×3 on Set5 and Set14

  • 结果表明,更深层次的模型是关键,DRRN 是最近三年所有模型中最好的,包括 SRCNN 、 FSRCNN 、 ESPCN 、 VDSR 、 DRCN 和红网。

  • 就参数数量而言,DRRN 具有最高的 PSNR,同时由于权重的共享而具有相对较少的参数。

4.2.定性结果

  • DRRN 可以获得更清晰的边缘,而其他边缘则很模糊。

GRL 和 LRL 让我想起了 RoR 和 U-Net+ResNet ,在这些地方使用了长短跳线连接来提高精度。但是当然,也有不同之处,例如,对于 LRL,跳过分支在这里总是接受相同的输入,并且在剩余分支的卷积中共享权重。

参考

【2017 CVPR】【DRRN】
通过深度递归残差网络的图像超分辨率

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(们)(还)(不)(想)(到)(这)(些)(人)(们)(,)(我)(们)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(们)(还)(没)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(里)(去)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(里)(去)(了)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(到)(这)(里)(来)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC

语义切分 FCNde convnetdeeplab v1&deeplab v2parse net】dilated netPSP netdeeplab v3

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet

实例分割
[深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

超分辨率 Sr CNNfsr CNNVDSRESPCN红网DRCN

复习:FC-DenseNet——一百层提拉米苏,全卷积 dense net(语义分段)

原文:https://towardsdatascience.com/review-fc-densenet-one-hundred-layer-tiramisu-semantic-segmentation-22ee3be434d5?source=collection_archive---------9-----------------------

胜过 SegNet 、 DeconvNet 、 FCN 、 DeepLabv1 、 DilatedNet

在中,简要介绍了由蒙特利尔学习算法研究所、蒙特利尔理工大学、Imagia 公司和计算机视觉中心开发的全卷积 DenseNet (FC-DenseNet) 。 DenseNet 最初用于图像分类。使用 DenseNet 比使用 ResNet 有几个优点:

  1. 参数效率 : DenseNets 在参数使用上更有效率。
  2. 隐式深度监督 : DenseNets 由于到架构中所有特征映射的路径较短,因此可以执行深度监督
  3. 特征重用:所有的层都可以很容易地访问它们之前的层,使得重用之前计算的特征地图的信息变得很容易。

因此,在本文中, DenseNet 被修改用于语义分割。并发表在 2017 CVPRW 上,被 300 多次引用。( Sik-Ho Tsang @ Medium)

概述

  1. 审查dense net连接
  2. FC-DenseNet 架构
  3. 实验

1。审查DenseNet连接

Standard Convolution

  • 标准卷积 : xl 通过对前一层 xl -1 的输出应用非线性变换 Hl 来计算。

Residual Learning

  • 残差学习 : ResNet 引入了一个残差块,它将一个层的输入到输出的同一性映射相加。

DenseNet Connection

  • DenseNet :输入以前馈方式连接所有先前的特征输出进行卷积。
  • (更多细节,请随意阅读我的 DenseNet 评论。)

2。FC-DenseNet 架构

FC-DenseNet

One Layer (Lefft), Transition Down (TD) (Middle), Transition Up (TU) (Right)

  • 在 FC-DenseNet 中,仅对前一密集块创建的特征图进行上采样。否则,将导致非常大的计算量和参数数量。
  • 这意味着,密集块的输入不会与其输出连接在一起。因此,转置卷积仅应用于由最后一个密集块获得的特征图,而不是到目前为止连接的所有特征图。
  • 这导致合理的前 softmax 特征地图数量为 256。
  • 跳过连接用于从下采样路径到上采样路径,就像 U-Net 或 FCN 类网络。
  • 这个模型可以从零开始训练,不需要任何预训练

Example of FC-DenseNet103

  • 以上是 FC-DenseNet103 的详细情况。
  • m 对应于一个块末端的特征图总数。
  • c 代表班级人数。

3.实验

3.1.坎维德

Results on CamVid Dataset

  • CamVid :用于城市场景理解的全分割视频数据集。有 367 帧用于训练,101 帧用于验证,233 帧用于测试。每个帧的大小为 360×480,其像素被标记为 11 个语义类别。
  • FC-DenseNets 用 224×224 的作物和批量 3 进行训练。最后,用全尺寸图像对模型进行微调。没有时间平滑或任何后处理时间正则化。
  • FC-DenseNet56 : 56 层,每密块 4 层,增长率 12。
  • FC-DenseNet67 : 67 层,每密块 5 层,增长率 16。
  • FC-DenseNet103 : 103 层,增长率 16。
  • 经典采样:一种在上采样路径中使用标准卷积而不是密集块的架构。
  • 结果显示了所提出的上采样路径相对于经典上采样路径的明显优势。特别是,据观察,未被代表的类别明显受益于 FC-DenseNet 架构,即标志、行人、栅栏、骑自行车的人在性能方面经历了重要的提升(从 15%到 25%)。
  • FC-DenseNet 模型受益于更深的深度和更多的参数。
  • FC-DenseNet 最终胜过了最先进的方法,如 SegNet 、 DeconvNet 、 FCN 、 DeepLabv1 和 DilatedNet 。

Visualization: Original (Left), Ground Truth (Middle), FC-DenseNet (Right)

3.2.盖特奇

Results on Gatech Dataset

  • Gatech :几何场景理解数据集,由 63 个用于训练/验证的视频和 38 个用于测试的视频组成。
  • 数据集中有 8 个类:天空、地面、建筑物、多孔(主要是树)、人类、汽车、垂直混合和主混合。
  • FC-DenseNet103 模型在 CamVid 上进行预训练,删除了 softmax 层,并使用 224×224 的作物和批量 5 对其进行了 10 个时期的微调。
  • FC-DenseNet103 从零开始,相对于之前发表的 2D 卷积、2D-V2V 的最新水平,在全局精度方面给出了 23.7%的令人印象深刻的改进。
  • 此外,FC-DenseNet(仅用 2D 卷积训练)也实现了基于时空 3D 卷积(3D-V2V 预训练)的最先进模型的显著改善(3.4%的改善)。

参考

【2017 CVP rw】【FC-dense net】
百层提拉米苏:用于语义分割的全卷积 dense net

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(有)(什)(么)(情)(况)(呢)(?)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(是)(这)(些)(人)(,)(还)(没)(有)(什)(么)(好)(的)(情)(感)(,)(我)(们)(还)(没)(有)(什)(么)(好)(的)(情)(感)(,)(但)(我)(们)(还)(没)(有)(什)(么)(好)(好)(的)(情)(感)(。 )(我)(们)(都)(不)(想)(要)(让)(这)(些)(人)(都)(有)(这)(些)(情)(况)(,)(我)(们)(还)(不)(想)(要)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(就)(是)(这)(些)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(。 )(我)(们)(都)(不)(知)(道)(,)(我)(们)(都)(是)(很)(强)(的)(,)(我)(们)(都)(是)(很)(强)(的)(对)(对)(对)(对)(起)(来)(,)(我)(们)(都)(是)(很)(强)(的)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(

物体检测 [ 过食 ] [ R-CNN ] [ 快 R-CNN ] [ 快 R-CNN][MR-CNN&S-CNN][DeepID-Net][CRAFT][R-FCN][离子 [G-RMI][TDM][SSD][DSSD][yolo v1][yolo v2/yolo 9000][yolo v3][FPN[retina net[DCN

语义切分[FCN][de convnet][deeplabv 1&deeplabv 2][CRF-RNN][SegNet][parse net][dilated net][DRN][RefineNet][

生物医学图像分割[cumevision 1][cumevision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN]

实例分割 [ SDS ] [ 超列 ] [ 深度掩码 ] [ 清晰度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

)( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )(

DeepPose Tompson NIPS'14 Tompson CVPR'15 CPM

回顾:FCIS——2016 年 COCO 细分(实例细分)冠军

原文:https://towardsdatascience.com/review-fcis-winner-in-2016-coco-segmentation-instance-segmentation-ee2d61f465e2?source=collection_archive---------19-----------------------

完全卷积的实例感知语义分段,具有位置敏感的内部/外部得分图

在这个故事中,清华大学微软亚洲研究院FCIS(全卷积实例感知语义分割)进行了回顾。这是第一个完全卷积的端到端实例分段解决方案。通过引入位置敏感的内部/外部得分图,卷积表示被检测和分割子任务完全共享。获得了高精度和高效率。

最终,FCIS 在 2016 年 COCO 分段挑战赛中获得第一名,准确率相对高出第二名 12%。它也在那一刻在 2016 COCO 检测排行榜上排名第二。它最初被命名为翻译感知的完全卷积实例分割(TA-FCN)

在 2015 年 COCO 分割挑战赛中获得第一名的 MNC ,每张图像花费 1.4 秒,其中 80%的时间都花在最后的每个 ROI 步骤上。 FCIS 使用ResNet-101(英伟达 K40)每张图像只需 0.24s,比MNC快很多。你可能认为推理时间仍然很慢,但是,COCO 分割挑战迫切需要最先进的地图。因此,FCIS 在减少推断时间的同时进一步提高地图并获得第一名已经很令人惊讶了。最终发表在 2017 CVPR 超过 100 次引用。( Sik-Ho Tsang @中)

概述

  1. 位置敏感内/外得分图
  2. FCIS 建筑
  3. 消融研究
  4. 与最先进方法的比较

1.位置敏感的内/外得分图

k×k Position-Sensitive Inside/Outside Score Maps with k=3 here

  • 如果你已经知道了R-FCN&instance fcn,你会注意到他们也制作了类似于上面 FCIS 的分数地图。 R-FCN 产生用于对象检测的正面敏感得分图,而 实例敏感得分图 产生用于生成分段建议的实例敏感得分图。如果你已经理解了R-FCN&instance fcn,就更容易理解位置敏感的内外得分图。
  • 在上面的例子中,每个评分图负责预测对象实例的相对位置。每个评分图负责捕捉对象实例的相对位置。例如:左上分数图负责捕捉对象实例的左上部分。组装后,可以生成分离的人物面具。
  • 与R-FCN&instance fcn 不同的是有两套比分图
  • 为了组合 ROI 内部图,在每个正敏感内部得分图上捕捉左上、中上、右上…和右下部分。类似于阳性敏感外评分图。
  • 最后,生成两个得分图。一个是 ROI 内图。一个是图外 ROI

Two Pathways

  • 基于这两幅图,有两条路径,一条用于实例遮罩,逐像素 softmax 用于分割损失。一种是针对类别似然度,通过平均汇集所有像素的似然度来获得检测分数。因此,卷积表示对于检测和分割子任务是完全共享的。
  • 一些例子:

2.FCIS 建筑

FCIS (Fully Convolutional Instance-aware Semantic Segmentation) Architecture

  • ImageNet 预训练的ResNet-101作为主干,用 h ole 算法(DeepLab/dilated net)将 conv5 的第一个块的步距从 2 增加到 1。因此,有效特征步距增加到 16。(即增加输出特征图尺寸。)
  • 对于区域提议网络(RPN) ,为了与 MNC 进行公平的比较,RPN 被添加到 conv4 层之上,这与MNC的方式相同。
  • 从 conv5 特征图中,使用 1×1 卷积生成2k×(C+1)分数图。( k =7 最后, C 类加 1 背景)
  • ROI 汇集在这些评分图上执行。
  • 对于每个 ROI ,获得 2 个( C +1)图。一个( C +1)是图内 ROI。一个( C +1)是图外 ROI。然后我们可以计算分割损失和检测分数。
  • 和 R-FCN 一样,还有一个兄弟 1×1 卷积用于包围盒(bbox)回归
  • 在推断期间,RPN 生成 300 个具有最高分数的 ROI。然后,它们通过 bbox 回归分支,产生另外 300 个 ROI。
  • IoU 阈值 0.3 的非最大抑制(NMS)用于滤除高度重叠的 ROI。在剩余 ROI 的池中,对于每个 ROI,我们获得其分类分数和所有类别的前景遮罩(以概率计)。
  • 在训练期间,如果 IoU 与最接近的地面实况大于 0.5,则 ROI 为正。有 3 个损失项 : 一个超过 C +1 类别一个仅地面实况类别的 softmax 分割损失,以及一个 bbox 回归损失。后两者仅对正 ROI 有效。
  • 因为每 ROI 计算仅涉及 k 细胞分割、分数图复制、softmax、max 和平均池。它既简单又快捷。

3.消融研究

3.1. FCIS 变种

FCIS Variants on PASCAL VOC 2012 Val Set

  • 幼稚 MNC : MNC ,59.1% mAP@0.5。
  • inst fcn****+R-FCN:使用 InstanceFCN 进行分段提议,使用 R-FCN 预测对象类别并回归包围盒,62.7% mAP@0.5。
  • FCIS(平移不变量):即 k =1 的 FCIS,52.5% mAP@0.5,可见位置敏感的内外得分图很重要。
  • FCIS(单独评分图):第一套 k 评分图仅用于分割,第二套仅用于分类,63.9% mAP@0.5,说明需要联合制定。
  • FCIS : 65.7% mAP@0.5,联合制定有效。

3.2.不同深度的 ResNet

ResNet with Different Depths on COCO test-dev set

  • 虽然 ResNet-152 具有更高的 mAP,但是 ResNet-101 用于与最先进的方法进行比较。

3.3.OHEM(在线硬示例挖掘)

Comparison with MNC on COCO test-dev set with/without OHEM

  • N 建议中,只有具有最高损失的顶部BROI 用于反向传播。OHEM 将 MNC 的训练时间从 2.05 秒大幅提高到 3.22 秒,OHEM 对 FCIS 的训练时间影响不大,但改善了地图。这是因为每 ROI 计算对于 FCIS 来说是便宜的。

4.与最先进方法的比较

4.1.COCO 细分挑战

COCO Segmentation Challenge Entry

  • FAIRCNN :其实是 2015 年第二名 MultiPathNet 的队名。
  • mnc++:2015 年获得第一名的 MNC 提交结果。
  • G-RMI:2016 年第 2 名,由谷歌研究和机器智能团队。(该方法不是在对象检测挑战中获胜的方法。)
  • FCIS 基线:已经比多路径和 MNC 好了。
  • +多尺度测试:使用测试图像金字塔,短边为{480,576,688,864,1200,1400}像素进行测试。
  • +水平翻转:水平翻转图像,再次测试,然后平均结果。
  • +多尺度训练:应用与多尺度推理相同尺度的多尺度训练。
  • +集合:集合 6 个网络。
  • 最后,具有上述技巧的 FCIS 比 G-RMI 高 3.8%(相对地高 11%)。

4.2.COCO 检测排行榜

  • 通过将实例遮罩的包围盒作为检测到的包围盒,在 COCO 测试开发集上实现了 39.7%的物体检测准确率,在当时的 COCO 物体检测排行榜上名列第二。

4.3.定性结果

参考

【2017 CVPR】【FCIS】
全卷积实例感知语义分割

我的相关评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC

语义切分 FCNde convnetdeeplab v1&deeplab v2】parse net】dilated netPSPNet]

生物医学图像分割

实例分割 [ 深度掩码 ] [ 清晰度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ]

综述:FPN —特征金字塔网络(目标检测)

原文:https://towardsdatascience.com/review-fpn-feature-pyramid-network-object-detection-262fc7482610?source=collection_archive---------0-----------------------

超越单一模式的参赛作品,包括 COCO 检测挑战赛冠军、G-RMI 和 MultiPathNet

在这篇论文中,【FPN】(特征金字塔网络),由【脸书】AI Research(FAIR)****康奈尔大学康奈尔理工共同评述。通过在卷积神经网络(CNN)中引入一个用于构建特征金字塔的简洁而简单的框架,与几个强基线和竞争获胜者相比,如 G-RMI 、 MultiPathNet 和 ION ,表现出了显著的改进。与 DeepMask 、 SharpMask 和 InstanceFCN 相比,FPN 拥有更高的分段提议 AR。是一篇 2017 CVPR 论文,引用 700 多篇。( Sik-Ho Tsang @中)

COCO Detection and Segmentation Challenge

涵盖哪些内容

  1. 文学中的各种建筑
  2. 特色金字塔网络(FPN)
  3. FPN 地区提案网络(RPN)
  4. FPN 探测网
  5. 消融实验
  6. 与最先进方法的比较

1.文学中的各种建筑

Different Architectures for Detection

(一)特征化图像金字塔

  • 在手工设计的时代,它被大量使用。

(b)单一特征地图

  • 这是一个标准的 ConvNet 解决方案,对一个单一的输入图像有预测在网络的末端。

(c)金字塔特征层次

  • 在每一层,就像 SSD 一样进行预测。它重用了前向过程中计算的不同图层的多尺度特征地图,因此是免费的。
  • 然而,它错过了重用特征层次的高分辨率地图的机会,因此错过了对小物体的检测。

(d)特征金字塔网络

  • 它通过自上而下的路径和横向连接将低分辨率、语义强的特征与高分辨率、语义弱的特征结合起来。
  • 这种特征金字塔在所有级别上都具有丰富的语义,并且可以从单个输入图像尺度快速构建,从而不会牺牲表示能力、速度或内存。一些并发作品如也采用这种方式。

(e)类似架构

  • 最近的一些研究采用了类似的自顶向下和跳过连接,如 TDM , SharpMask , RED-Net , U-Net ,这些连接在当时相当流行,但只是在最后阶段进行预测。

2。特征金字塔网络(FPN)

Feature Pyramid Network (FPN)

2.1。自下而上路径

  • 自底向上的路径是主干通信网的前馈计算。定义了一个金字塔等级用于每个阶段。每个阶段的最后一层的输出将被用作通过横向连接来丰富自顶向下路径的参考特征图集。

2.2。自上而下的路径和横向连接

  • 较高分辨率的特征是从较高金字塔等级向上采样的空间上更粗糙但语义上更强的特征图。更具体地说,为了简单起见,使用最近邻将空间分辨率上采样 2 倍。
  • 每个横向连接合并来自自下而上路径和自上而下路径的相同空间大小的特征地图。
  • 具体来说,来自自底向上路径的特征图经历 1×1 卷积以降低通道维度。
  • 并且来自自下而上路径和自上而下路径的特征图通过逐元素添加来合并。

2.3.预言;预测;预告

  • 最后,在每个合并后的图上附加一个 3×3 的卷积,生成最终的特征图,这是为了减少上采样的混叠效应。这最后一组特征地图称为{P2,P3,P4,P5},分别对应{C2,C3,C4,C5},它们的空间大小相同。
  • 因为金字塔的所有级别都像在传统特征化图像金字塔中一样使用共享的分类器/回归器,所以输出 d 处的特征维度固定为 d = 256。因此,所有额外的卷积层都有 256 通道输出。

3。FPN 地区提案网络(RPN)

  • 在fast R-CNN中的原始 RPN 设计中,在密集的 3×3 滑动窗口上评估一个小子网,在单尺度卷积特征图的顶部,执行对象/非对象二元分类和边界框回归。
  • 这是通过一个 3×3 卷积层来实现的,其后是用于对象/非对象分类和回归的两个兄弟 1×1 卷积,我们称之为网络
  • 此处,RPN 中的单比例尺要素地图被 FPN 所取代。因此,没有必要在特定层上设置多尺度锚盒。
  • 每个级别都有一个标度分配给每个级别。形式上定义锚点分别在{P2,P3,P4,P5,P6}上有{ T16 }个{32,64,128,256,512 }像素的区域。
  • 并且在每个级别,使用{1:2,1:1,2:1}的多个纵横比
  • 如果对于给定的基础事实框,锚具有最高的 IoU,或者对于任何基础事实框,其 IoU 超过 0.7,则锚被分配正标签,如果对于所有基础事实框,其 IoU 低于 0.3,则锚被分配负标签。
  • 头部的参数在所有特征金字塔等级中共享。

4.探测网络的 FPN

  • 在fast R-CNN中的原始检测网络中,使用了单尺度特征图。
  • 这里,为了检测对象,需要将不同尺度的 ROI 分配给金字塔等级。
  • 形式上,(在网络的输入图像上)的 ROI 被分配到我们的特征金字塔的层次 Pk 上,通过:

  • 使用 224,因为这是标准的 ImageNet 预训练大小。
  • 而更快的 R-CNN 使用 C4 作为单尺度特征图, k 0 设置为 4。
  • 因此,如果 224×224,k = 4。我们用 P4。
  • 如果 112×112,k = 3。它被映射到 P3 的更高分辨率级别。
  • 预测器头部(在快速 R-CNN 中,头部是特定于类别的分类器和包围盒回归器)被附加到所有级别的所有 ROI。同样,无论级别如何,磁头都共享参数。
  • 采用 RoI pooling 提取 7×7 特征,并在最终分类和包围盒回归层之前附加两个隐藏的 1024 维全连通(fc)层。

5。消融实验

5.1.RPN 的烧蚀实验

Bounding box proposal results of RPN on the COCO minival set

5.1.1.与基线的比较

  • (b)使用 conv5 与(A)使用 conv4 相比没有优势:单个更高级的特征地图是不够的,因为在更粗糙的分辨率和更强的语义之间存在权衡。
  • (c)将 FPN 放入 RPN 将 AR1k 提高到 56.3 ,比单一等级 RPN 基线提高了 8.0 点。
  • 此外,小对象(AR1ks)上的性能大幅提升了 12.9 分
  • 因此,RPN 上的 FPN 对目标尺度变化具有鲁棒性。

5.1.2.自上而下浓缩

  • (d)是 FPN,但没有自上而下的路径。通过这种修改,1×1 横向连接后面跟着 3×3 回旋被附加到自底向上的金字塔上。它模拟了重用金字塔特征层次的效果。(即第一幅图中(c)的架构)
  • 与 FPN (c) 相比的结果稍逊一筹。
  • 据推测,这是因为在自下而上的金字塔(b) 上,不同层次之间存在很大的语义鸿沟,特别是对于非常深的结果网。
  • 还评估了不共享磁头参数的(d)的变体,但是观察到类似的性能下降。

5.1.3.横向连接

  • (e),没有 1×1 横向连接的自上而下的特征金字塔。这个自上而下的金字塔具有很强的语义特征和精细的分辨率。
  • 有人认为这些特征的位置并不精确,因为这些地图已经过多次降采样和升采样。
  • (c)中的 FPN 的 AR1k 得分比(e)高 10 分。

5.1.4.金字塔表示法

  • (f),头部被附加到 P2 的最高分辨率、强语义特征地图上。所有锚点都被分配到 P2 特征地图。
  • 这个变量比基线好,但比 FPN 差。

5.2.探测网络烧蚀实验

Object detection results of detection network on the COCO minival set

  • 消融是在一组固定的建议上进行的。FPN 为 RPN 计算的建议被冻结。检测网络和 RPN 之间的特征是不共享的。
  • 相对于 conv4 (a)上的基线,FPN (c)将 AP 提高了 2.0,将小物体 AP 提高了 2.1。
  • 移除自上而下的连接(d)或移除横向连接(e)会导致较差的结果。
  • 去除自上而下的连接(d)会显著降低精度。在高分辨率地图上使用低级特征会有问题。
  • 使用 P2 (e)的单一最精细比例特征地图,其结果(33.4 AP)比 FPN (c)稍差。

5.3.检测网络和 RPN 的一致主干架构

Object detection results with shared features on the COCO minival set

  • RPN 和检测网络都使用一致的主干架构。(但尚未共享功能)
  • FPN (c)比这个强基线好 2.3 点 AP 和 3.8 点 AP@0.5。(( a)和(b)中的基线优于 ResNet 中显示的基线。)

5.4.检测网络和 RPN 的共享功能

Object detection results with shared features using ResNet on the COCO minival set

  • 共享要素可以略微提高精确度。特性共享也减少了测试时间。FPN 在单个 NVIDIA M40 GPU 上对 ResNet-50 的每幅图像的推理时间为 0.148 秒,对 ResNet-101 的推理时间为 0.172 秒。

6。与最先进方法的比较

6.1.可可检测挑战

Comparisons of single-model results on the COCO detection benchmark

  • 在测试开发集上,我们的方法比现有的最佳结果增加了 0.5 点的 AP (36.2 对 35.7)和 3.4 点的 AP@0.5 (59.1 对 55.7)。
  • G-RMI:2016 年冠军。
  • 更快的 R-cnn++:使用更快的 R-CNN 、 ResNet 和NOC的 2016 年获胜者。
  • ION:2015 年亚军,它使用了修改的 IRNN 和跳过池来提取多个尺度和抽象层次的信息。
  • FPN 在这里没有利用许多流行的改进,如迭代回归、硬负挖掘、上下文建模、更强的数据扩充等。

6.2.扩展:细分建议

FPN for object segment proposals

Instance segmentation proposals evaluated on the first 5k COCO val images

  • fpn 按照深度掩码 / 清晰度掩码框架生成分割建议。
  • windows 上的 MLP,用于生成密集的对象片段,输出维度为 14×14 掩码和对象分数。
  • 与 DeepMask 、 SharpMask 和 InstanceFCN 相比,FPN 比这些方法的精度高出 8.3 个百分点以上,而在小物体上的精度几乎是后者的两倍
  • 现有的掩模建议方法是基于密集采样的图像金字塔,使得它们在计算上很昂贵。
  • FPN 以每秒 6 到 7 帧的速度运行要快得多。

尽管 ResNet 和fast R-CNN卓有成效,但 FPN 在几个强劲的基线和竞赛获胜者方面仍有显著进步。

参考

【2017 CVPR】【FPN】
用于物体检测的特征金字塔网络

我的相关评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC

语义切分 FCNde convnetdeeplabv 1&deeplabv 2】parse net】dilated netPSPNet]

生物医学图像分割

实例分割
[深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

超分辨率 Sr CNNfsr CNNVDSRESPCN红网】

回顾:G-RMI——2016 年 COCO 检测(物体检测)冠军

原文:https://towardsdatascience.com/review-g-rmi-winner-in-2016-coco-detection-object-detection-af3f2eaf87e4?source=collection_archive---------9-----------------------

检测架构选择指南:更快的 R-CNN、R-FCN 和 SSD

T 他的时间, G-RMI谷歌研究与机器智能,2016 年 MS COCO 检测挑战赛获得第一名的人回顾。G-RMI 是参加挑战赛的队伍名称。这不是一个提议方法的名称,因为他们没有任何创新的想法,例如修改深度学习架构以赢得挑战。名为“现代卷积对象检测器的速度/精度权衡”的论文也给了我们一些提示,他们** 系统地研究了不同种类的对象检测器和特征提取器。具体来说:**

  • 3 个对象检测器(元架构) : 更快的 R-CNN 、 R-FCN 和 SSD
  • 6 个特征提取器 : VGG-16 , ResNet-101 , Inception-v2 , Inception-v3 , Inception-ResNet-v2 和 MobileNet

他们还分析了其他参数的影响,如输入图像大小和区域提议的数量。最后,几个模特的合奏达到了最先进的效果,赢得了挑战。并发表在 2017 CVPR 上,引用 400 余次。( Sik-Ho Tsang @中)

概述

  1. 元架构
  2. 特征提取器
  3. 精度对时间
  4. 特征提取器的作用
  5. 对象大小的影响
  6. 图像尺寸的影响
  7. 提案数量的影响
  8. FLOPs 分析
  9. 内存分析
  10. 0.75 IOU 下的良好定位意味着所有 IOU 阈值下的良好定位
  11. 可可的最新检测结果

1.元架构

对象检测器在这里被称为元体系结构。调查了三种元架构:更快的 R-CNN 、 R-FCN 和 SSD 。

Abstract Architecture

SSD

  • 它使用单个前馈卷积网络来直接预测类别和锚偏移,而不需要第二阶段的每建议分类操作

更快 R-CNN

  • 在被称为区域提议网络(RPN)第一阶段中,图像由特征提取器(例如 VGG-16 处理,在一些选定的中间级别(例如“conv5”)的特征被用于预测类别不可知的盒子提议
  • 第二阶段中,这些(通常为 300) 框提议被用于从相同的中间特征图(ROI 汇集)中裁剪特征,这些特征随后被馈送到特征提取器的剩余部分(例如,“fc6”后面跟着“fc7”),以便为每个提议预测类别和类别特定的框细化。

FCN

  • 与更快的 R-CNN 类似的还有第一级中的 RPN
  • 在第二阶段,使用正敏感得分图,以便在预测之前从最后一层特征中提取裁剪(ROI 合并)。这使得每个投资回报的运营成本变得非常低,因为几乎所有运营都是在投资回报池之前共享的。
  • 因此,它通常以更快的运行时间实现了与更快的 R-CNN 相当的准确性。

2。特征提取器

尝试了六个特征提取器:VGG-16,雷斯网-101 ,盗梦空间-v2 ,盗梦空间-v3 ,盗梦空间-雷斯网-v2 和 MobileNetV1 。

Top-1 classification accuracy on ImageNet

  • 不同的特征提取器,不同的层用于提取用于对象检测的特征。
  • 对一些特征提取器进行了一些修改,例如,使用了扩展的卷积,或者使最大池步幅变小,以便在特征提取之后步幅大小不会太小。

3.精度与时间

Accuracy vs Time, The dotted Line is Optimality Frontier

Test-dev performance of the “critical” points along our optimality frontier

  • 颜色:特征提取器
  • 标记形状:元架构

3.1.一般观察

  • R-FCN 和 SSD 平均速度更快。
  • 更快的 R-CNN 速度较慢,但更准确,每张图像至少需要 100 毫秒。

3.2.最优边界上的临界点

最快:SSDw/MobileNet

  • 带 Inception-v2 和 MobileNet 的固态硬盘是速度最快的型号中最精确的。
  • 忽略后处理成本, MobileNet 似乎比 Inception-v2 快大约一倍,但准确性稍差。

甜蜜点:R-FCNw/ResNet 更快 R-CNNw/ResNet并且只有 50 个提案

  • 使用 ResNet 特征提取器的 R-FCN 模型占据的最优性边界中间有一个“肘”。
  • 这是各种型号配置中速度和精度之间的最佳平衡。

最准确: 更快 R-CNNw/Inception-ResNetat stride 8

  • 具有密集输出的更快 R-CNNInception-ResNet-v2模型在我们的最优边界上获得了最佳的可能精度。
  • 然而,这些模型很慢,需要将近一秒的处理时间。

4.特征提取器的作用

Accuracy of detector (mAP on COCO) vs accuracy of feature extractor

  • 直觉上,更强的分类性能应该与更强的 COCO 检测性能正相关。
  • 这种相关性似乎只对更快的 R-CNN 和 R-FCN 有意义,而 SSD 的性能似乎不太依赖其特征提取器的分类精度。

5.物体大小的影响

Accuracy stratified by object size, meta-architecture and feature extractor, image resolution is fixed to 300

  • 所有的方法在大对象上都做得更好。
  • 固态硬盘通常在小对象上的性能(非常)差,但固态硬盘在大对象上仍然与更快的 R-CNN 和 R-FCN 有竞争力。
  • 后来,有 DSSD 来解决小物体检测问题。

6.图像大小的影响

Effect of image resolution

  • 将分辨率在两个维度上降低两倍会持续降低准确度(平均降低 15.88%),但也会将推断时间平均降低 27.4%。
  • 高分辨率输入允许分辨小物体。
  • 高分辨率模型在小对象上产生明显更好的贴图结果(在许多情况下是 2 倍),在大对象上也产生稍微更好的贴图结果。

7.提案数量的影响

Faster R-CNN (Left), R-FCN (Right)

我们可以在 RPN(第一阶段)输出不同数量的建议。提案越少,运行时间越快,反之亦然。

更快的 R-CNN

  • Inception-ResNet ,有 300 个提案有 35.4%的 mAP,在只有 10 个提案的情况下依然可以有惊人的高准确率(29%的 mAP)。
  • 最佳点可能是 50 个建议,在这里,我们能够获得使用 300 个建议的 96%的准确性,同时将运行时间减少 3 倍。

R-FCN

  • 在 R-FCN 设置中使用更少的建议所节省的计算量很小。
  • 这并不奇怪,因为如上所述,由于正敏感得分图的共享计算,对于 R-FCN ,每个 ROI 的计算成本较低。

比较更快的 R-CNN 和 R-FCN

  • 在 100 个建议时,具有 ResNet 的更快的 R-CNN 模型的速度和准确性变得与同等的 R-FCN 模型大致相当,后者在地图和 GPU 速度上都使用了 300 个建议。

8.FLOPs 分析

FLOPs vs Time

  • 对于更密集的块模型,如 ResNet-101 ,FLOPs/GPU 时间通常大于 1。
  • 对于 Inception 和 MobileNet 型号,这个比率通常小于 1。
  • 也许,因式分解减少了 FLOPs,但增加了更多的内存 I/O 开销,或者可能是当前的 GPU 指令(cuDNN)更适合密集卷积。

9.记忆分析

Memory (Mb) vs Time

  • 与运行时间高度相关,更大更强大的特征提取器需要更多的内存。
  • 与速度一样, MobileNet 是最便宜的,在几乎所有设置中需要不到 1Gb(总)的内存。

10。75 IOU 的良好定位意味着所有 IOU 阈值的良好定位

Overall COCO mAP (@[.5:.95]) for all experiments plotted against corresponding mAP@.50IOU and mAP@.75IOU

  • mAP@.5 和 mAP@.75 性能几乎与 mAP@[.5:.95]完全线性相关。
  • mAP@.75 与 mAP@[.5:.95]的相关性稍强(R > 0.99),因此,如果我们要在单个 IOU 阈值下用 mAP 替换标准 COCO 指标,IOU = .75 可能会被选中。

11.可可上最先进的检测结果

11.1.集合和多作物

Summary of 5 Faster R-CNN single models

  • 由于 mAP 是 COCO 检测挑战的主要目标,因此最准确但耗时的更快的 R-CNN 被考虑。
  • 不同的结果鼓励集合

Performance on the 2016 COCO test-challenge dataset.

  • G-RMI :将上述 5 个模型集合,多作物生成最终模型。它超过了 2015 年的冠军和 2016 年的第二名。
  • 2015 年的胜者使用 ResNet + 更快的 R-CNN + NoCs 。(请看我对NoCsCOCO 挑战赛结果的点评。)
  • Trimps-Soushen,2016 年第 2 名,使用更快的 R-CNN + ensemble 多个模型+其他论文的改进。(COCO challenge 上没有关于 Trimps-Soushen 的细节。)
  • 注意:这里没有多尺度训练、水平翻转、框细化、框投票或全局上下文。

Effects of ensembling and multicrop inference.

  • 第二排 : 6 个更快的 RCNN 型号,带 3 个 ResNet-101 和 3 个 Inception-ResNet-v2 。
  • 第三行:本节第一个表中的不同集合结果。
  • 因此,多样性是令人鼓舞的,与使用人工选择的集合相比,这确实有很大帮助。
  • 集成和多作物比单一模式提高了近 7 个百分点。

11.2.来自 5 种不同型号的检测

Beach

Baseball

Elephants

参考

【2017 CVPR】【G-RMI】
现代卷积物体探测器的速度/精度权衡

我的相关评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC

语义切分
[FCN][de convnet][deeplabv 1&deeplabv 2][parse net][dilated net][PSPNet]

实例分割 [ 深度掩码 ] [ 锐度掩码 ] [ 多路径网 ] [ MNC ] [ 实例中心 ]

回顾:GBD-网络/ GBD-v1 和 GBD-v2——2016 年国际地球物理遥感中心(物体探测)获奖者

原文:https://towardsdatascience.com/review-gbd-net-gbd-v1-gbd-v2-winner-of-ilsvrc-2016-object-detection-d625fbeadeac?source=collection_archive---------24-----------------------

门控双向网络,赢得 ILSVRC 2016 对象检测挑战赛

T 他的时代, GBD 网(门控双向网络),由香港中文大学(CUHK)SenseTime 点评。GBD-Net 赢得了 ILSVRC 2016 目标检测挑战赛,在 2016 ECCV 中首次提出,引用超过 30 次。然后延伸发表在 2018 TPAMI ,引用 50 余次。( Sik-Ho Tsang @中)

在这个故事中,主要是扩展, 2018 TPAMI ,因为它被描述得更加详细。

概述

  1. 问题
  2. GBD-v1
  3. GBD-v2
  4. 其他技术
  5. 消融研究
  6. 与最先进方法的比较

1.问题

Potential Problems When We Classify the Object in a Candidate Box (Red) with Ground-Truth (Blue)

  • (a) :候选框可以是兔子,也可以是仓鼠。
  • (b) : b2 可能因 IoU 较小而被视为误报。
  • (c)和(d) :兔头不一定是兔子,可以是人。
  • 因此,没有来自候选框的较大周围区域的信息,很难区分类别标签。
  • 首先,候选框周围的上下文区域是一种自然的帮助。
  • 此外,周围区域还提供关于背景和其他附近物体的上下文信息,以帮助检测。
  • 来自周围区域的信息用于改进候选框的分类。

2.GBD-v1

2.1.总体框架

GBD-v1 Overall Framework

  • 以上是 GBD-v1 的框架。
  • 使用快速 R-CNN 管道。
  • 首先,诸如选择性搜索(SS)的区域提议方法将生成一组区域提议/候选框。
  • 在 ROI 合并之后,对于每个候选框,它都要经过建议的 GBD-v1。
  • 最终的特征图用于分类和包围盒回归,如在快速 R-CNN 中使用的。

2.2.毅力

Inception-v2 as Backbone

  • BN-Inception/Inception-v2用作特征提取的主干。

ResNet-269 as Backbone

  • 后来, ResNet-269 也被用作主干。更好的骨干,更好的准确性。

2.3.不同分辨率和支持区域的投资回报池

ROI Pooling with Different Resolutions and Support Regions

  • 使用候选框(红色),不同的分辨率和支持区域基于该框汇集在一起。
  • 用 p = {-0.2,0.2,0.8,1.7}生成不同的区域。

2.4.使用门控双向结构的消息传递

Naive Network Without Message Passing

  • 最简单的方法是使用不同的支持区域遍历网络进行分类,如上所示。
  • 但实际上,它们也应该是相互关联的,因为它们观察的是同一个物体。有些东西可以互相帮助。

Network With Message Passing

  • 因此,这里提出了双向网络。
  • 一个方向是从小尺寸区域连接到大尺寸区域。
  • 另一种是从大尺寸区域连接到小尺寸区域。
  • 因此,来自不同地区的上下文可以使用双向结构相互帮助。
  • ⨂是卷积,σ是 ReLU(不是 Sigmoid),cat()是串联。
  • 然而,有时一个上下文区域可能对另一个上下文区域没有帮助,就像第一张图中有兔子头的人一样。

Network With Message Passing Using Gate Function

  • 在消息传递之前引入 Gate 函数。
  • 因此,引入了上下文相关的门函数。开关将根据环境打开或关闭。
  • 门过滤器的尺寸是 3×3,而不是 1×1。
  • Sigm 是 sigmoid 函数,是元素级乘积,G 是基于 sigmoid 的门函数。
  • 当 G = 0 时,消息不被传递。

3.GBD-v2

3.1.GBD 的增强版

GBD-v2

  • GBD 网络得到加强。
  • 最大池用于合并来自 h ih i 的信息。与 GBD-v1 相比,这可以节省内存和计算量。
  • 另外,从 h⁰ih i 还增加了一个身份映射层。常数 β 在相加前相乘。

4。其他技术

4.1.候选框生成

  • CRAFT的改进版本用于生成候选框。
  • 有 3 个版本。
  • Craft-v1:Craft从 1000 级 ImageNet 预训。
  • Craft-v2:Craft用于 GBD-v1,2016 ECCV 论文,但预训练自更快 R-CNN 使用的地区提案网(RPN)。
  • Craft-v3:GBD-v2 使用的改进型 CRAFT ,训练时使用随机裁剪的 2018 TPAMI 论文,测试时使用多尺度金字塔。同样,阳性和阴性样本在 RPN 训练中是 1:1。使用 LocNet 添加了另一组建议。

4.2.其他人

  • 多尺度测试:利用训练好的模型,在图像金字塔上计算特征图,图像的短边为{400,500,600,700,800},长边不大于 1000。
  • 左右翻转:训练和测试都采用。
  • 包围盒投票:使用 MR-CNN & S-CNN 中的包围盒投票。
  • 非最大抑制(NMS)阈值:对于 ImageNet,NMS 阈值默认设置为 0.3。根据经验发现,0.4 是较好的阈值。
  • 全局上下文:从预训练的网络来看,ImageNet 检测数据也是作为图像分类问题来处理的。这意味着 ROI 区域是整个图像。然后,这个 200 级图像分类分数被用于通过加权平均与 200 级对象检测分数相结合。
  • 模型组合 : 6 个模型用于组合。

5.消融研究

5.1.多种分辨率的效果

The Effect of Multiple Resolutions Using Inception-v2 as Backbone

  • 使用四种分辨率获得 48.9%的最高 mAP。

5.2.工艺版本

Recall Rate on ImageNet val2

  • 对 Craft-v2 的修改,即 Craft-v3,提高了召回率,如上图所示。

5.3.不同的比例因子β

Different Scaling Factor β in Controlling the Magnitude of Message on ImageNet val2 Using Inception-v2 as Backbone

  • 还测试了控制消息大小的不同比例因子 ββ = 0.1 有 53.6%的最佳贴图。

5.4.不同的深度模型作为主干

Different Deep Models as Backbone (“+I” = Pre-Activation ResNet with Identity Mapping, “+S” = Stochastic Depth (SD))

  • Inception-v2 、 ResNet 、预激活 ResNet (+I)、随机深度 (+S)、 Inception-v3 (根据参考应该不是 v5)、 PolyNet 也尝试过。
  • 更好的脊梁,更好的地图。

5.5.用于组装的 6 个深度模型

6 Deep Models for Ensembling

  • 然而,不同的主干在不同的对象类别上具有不同的准确性。组装时,他们可以互相帮助。
  • 最后选择以上 6 个模型,可以得到 66.9%的 mAP。

5.6.包括其他技术

Including Other Techniques

  • 详情如上。通过以上技术,mAP 从 56.6%提高到 68%。
  • 而 GBD 技术只能帮助将 mAP 从 56.6%提高到 58.8%,这实际上贡献了改进的一部分。

6。与最先进方法的比较

6.1.ImageNet val2 上的对象检测

Object Detection on ImageNet val2, sgl: Single Model, avg: Averaged Model (Ensembling)

  • GBD-v2 在所有技术方面都超过了美国有线电视新闻网(R-CNN)、谷歌网(Google Net)、 DeepID-Net 和 ResNet 。

6.2.不使用外部数据进行训练的 ImageNet 测试集上的对象检测

Object Detection on ImageNet Test Set

  • GBD-v2 优于许多最先进的方法,包括谷歌网、雷斯网、 Trimps-Soushen 和海康威视(2016 年亚军)。(也许以后有时间我会回顾一下海康威视。)

6.3.COCO 上的对象检测

Object Detection on MS COCO

  • 同样,GBD-v2 优于最先进的方法,如更快的 R-CNN 、 ION 和 SSD 。

为了提高性能,除了深度神经网络管道上的新颖想法或更好的主干,其他技术也很重要,如 5.6 节中所述,如本文中的区域提议方法、数据扩充、多尺度训练、多尺度测试、包围盒投票、全局上下文和模型集成。

参考

【2016 ECCV】【GBD 网/GBD v1】
门控双向 CNN 进行物体检测

【2018 TPAMI】【GBD-网/GBD-v1 & GBD-v2】
制作用于物体检测的 GBD-网

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(没)(有)(什)(么)(好)(的)(情)(情)(感)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [ DSSD ] [ 约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3 ] [ FPN ] [ 视网膜网 ] [ DCN ]

语义切分 FCNde convnetdeeplab v1&deeplab v2CRF-RNN】SegNet】parse netdilated netPSPNetdeeplab v3

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道[V-Net][3D U-Net]

实例分割 [SDS[超列 ] [ 深度掩码 ] [ 锐度掩码 ] [ 多路径网络][MNC][Instance fcn][FCIS

超分辨率 [Sr CNN][fsr CNN][VDSR][ESPCN][红网][DRCN][DRRN][LapSRN&MS-LapSRN][srdensenenet

人体姿态估计
深度姿态汤普逊·尼普斯 14

回顾:GCN——全球卷积网络,大核问题(语义分割)

原文:https://towardsdatascience.com/review-gcn-global-convolutional-network-large-kernel-matters-semantic-segmentation-c830073492d2?source=collection_archive---------16-----------------------

胜过 FCN-8s 、 CRF-RNN 、扩容网和 DeepLabv1 & DeepLabv2

Large Kernel Matters

在这篇论文中,对全球卷积网络(GCN) ,由清华大学旷视科技公司(Face++) 所做的综述。在诸如 VGGNet 的惯例中,使用小的 3×3 核的堆叠,以便获得大的有效感受野。然而,我们发现大内核也扮演着重要的角色。以上图为例,在 A 中,感受野大到足以覆盖该鸟进行分割。但是如果像 B 中那样放大图像,感受野就不够大。在 C 中,使用建议的 GCN,感受野可以扩大。最后:

  • GCN 被提出来解决语义分割的分类和定位问题。
  • 边界细化(BR) 也被提出来进一步细化对象边界。

并且发表在 2017 CVPR100 多篇引用。( Sik-Ho Tsang @中)

概述

  1. 分类与定位的矛盾
  2. 全球卷积网络(GCN) &边界细化(BR)
  3. 消融研究
  4. 与最先进方法的比较

1.分类与本土化的矛盾

Classification (Left), Segmentation/Localization (Middle), GCN (Right)

  • 对于分类任务,要求模型对于各种变换不变,如平移和旋转
  • 但是对于定位任务,模型应该是变换敏感的,即精确定位每个语义类别的每个像素

全球卷积网络(GCN)

  • 同时应对上述两项挑战。作者遵循两个设计原则:
  • 1)从本地化视图来看,模型结构应该是全卷积以保持本地化性能,并且不应该使用全连接或全局池层,因为这些层将丢弃本地化信息;
  • 2)从分类的角度来看在网络架构中应该采用大的核尺寸,以实现特征图和逐像素分类器之间的密集连接,这增强了处理不同变换的能力。

2。全球卷积网络(GCN) &边界细化(BR)

Overall Architecture (GCN), GCN Module (Top Right), and BR module (Bottom Right)

  • 如上图, ResNet 作为主干。特别是,在最先进的比较过程中,使用 ImageNet 上预训练的 ResNet-152 。
  • 如上图所示,插入 GCN 模块,然后插入 BR 模块。
  • 使用去卷积层对较低分辨率的得分图进行上采样,然后与较高分辨率的得分图相加,以生成新的得分图。

2.1.全球卷积网络(GCN)模块

  • 如图右上方所示,GCN 模块没有直接使用更大的核或全局卷积,而是使用了 1×k+k×1 和 k×1+1×k 卷积的组合,使得能够在特征图中的一个大 k×k 区域内进行密集连接。
  • 不同于 Inception-v3 使用的非对称核,卷积层后没有非线性。
  • 与琐碎的 k×k 卷积相比,GCN 结构仅涉及 O(2/k)计算成本和参数数量,这对于大核尺寸更实用。

2.2.边界细化(BR)模块

  • 如图右下方所示,边界对齐建模为残差结构,其中ŝ=s+r(s),s 为粗分图,r()为残差分支。
  • 它可以作为作者定制的附加残差块,在 GCN 之后使用,在反褶积过程中使用。

3.消融研究

  • PASCAL VOC 2012 有 1464 幅图像用于训练,1449 幅图像用于验证,1456 幅图像用于测试,属于 20 个对象类和一个背景类。
  • 语义边界数据集也被用作辅助数据集,产生 10,582 幅图像用于训练。
  • PASCAL VOC 2012 验证集用于评估。

GCN (Leftmost), 1×1 Conv (2nd Left), Trivial k×k Conv (2nd Right), Stacks of 3×3 Conv (Rightmost)

3.1.大内核问题

Different k values for GCN on PASCAL VOC 2012 validation set

  • 基线:使用简单的 1×1 Conv 的简单基线。
  • k = 15,大致等于 16×16 的特征图大小。
  • 性能随着内核大小 k 不断增加。
  • 特别是 GCN ( k = 15)以 5.5%的显著优势超过了最小的一个。

3.2.参数多了有帮助吗?

GCN vs Trivial k×k Conv on PASCAL VOC 2012 validation set

  • 对于琐碎的 k × k Conv ,如果 k≤5,更大的内核会带来更好的性能,而对于 k≥7,性能会下降。
  • 一个假设是太多的参数使训练遭受过度拟合,这削弱了较大内核的好处。
  • 作者发现,寻找琐碎的大核实际上使网络难以收敛
  • 而拟议中的 GCN 没有这个问题。

3.3.GCN vs 一堆 3×3 的小回旋

GCN vs Stacks of Small 3×3 Convolutions on PASCAL VOC 2012 validation set

  • 在这里,对于小的 3×3 卷积的堆叠,非线性被去除,以便与 GCN 进行公平的比较。
  • 同样,小的 3×3 卷积的堆叠带来比 GCN 更多的参数,并且当感受野增加时导致过拟合

Different Number of Feature Maps (m) on PASCAL VOC 2012 validation set

  • 还测试了不同数量的特征图( m ),以便减少小的 3×3 卷积的堆叠的参数数量。
  • 然而,它的性能随着参数的减少而下降。

3.4.GCN 和 BR 如何对分割结果做出贡献?

GCN & BR on PASCAL VOC 2012 validation set

  • 位于大物体中心的像素可能从 GCN 中受益更多,因为它非常接近“纯”分类问题。
  • 至于物体的边界像素,其性能主要受定位能力的影响。
  • 为了验证上述推论,分割得分图被分成两部分: a)边界区域,其像素位于靠近物体边界(距离≤7) ,以及 b)内部区域作为其他像素
  • 如上所示, BR 主要提高边界区域的精度,而 GCN 有助于提高内部区域的精度

3.5.GCN vs 雷斯内特

Original ResNet Bottleneck Module (Left), and ResNet-GCN Module (Right)

Detailed Architecture of ResNet50 and ResNet50-GCN

Original ResNet vs ResNet-GCN on PASCAL VOC 2012 validation set

  • 我们可能会想,在主干上,为什么不用 GCN 块(右)代替原来的 ResNet 块(左)来提高精度呢?作者使用 ResNet-50 研究了上述两种结构。
  • 作为 ImageNet 分类模型,总部位于 GCN 的 ResNet 比最初的 ResNet 稍逊一筹。
  • 对于 GCN 和 BR,增益仍然很小。

4。与最先进方法的比较

4.1.帕斯卡 VOC 2012

  • 使用 COCO 女士预训练模型。
  • 培训阶段分为三个阶段:
  • (1)在阶段-1 中,使用来自 SBD COCO 和标准 PASCAL VOC 2012 的所有图像,产生用于训练的 109,892 个图像。
  • (2)在第二阶段,仅使用 SBD 和标准帕斯卡 VOC 2012 图像,与上一节相同。
  • (3)对于阶段 3,仅使用标准 PASCAL VOC 2012 数据集。

PASCAL VOC 2012 validation set

  • 在阶段 3,利用 GCN+溴,获得 80.3%的平均 IoU。
  • 利用多尺度(MS)和条件随机场(CRF),获得了 81.0%的平均 IoU。

PASCAL VOC 2012 test set

  • 最后,在测试集上获得了 82.2%的平均 IoU,优于CRF-RNN【37】,以及deeplabv 1&deeplabv 2【6,7】。

Qualitative Results

4.2.城市景观

  • 它包含来自 50 个不同条件的城市的 24998 幅图像,属于 30 类,没有背景类。
  • 根据图像的标记质量,将图像分成两组。其中 5,000 个是精细注释的,而另外 19,998 个是粗略注释的。5000 个精细注释图像被进一步分组为 2975 个训练图像、500 个验证图像和 1525 个测试图像。
  • Cityscapes 中的图像具有 1024×2048 的固定大小,这对于我们的网络架构来说太大了。因此,在训练阶段,我们将图像随机裁剪为 800×800。GCN 的 k也从 15 增加到 25,最终特征图为 25×25。
  • 培训阶段分为两个阶段:
  • (1)在阶段-1 中,粗糙的带注释的图像和训练集被混合,产生 22,973 个图像。
  • (2)对于阶段 2,网络仅在训练集上进行微调。
  • 在评估阶段,图像被分成四个 1024×1024 的作物,它们的得分图被融合。

Cityscapes validation set

  • 利用多尺度(MS)和条件随机场(CRF),获得了 77.4%的平均 IoU。

Cityscapes test set

  • 最终,在测试集上获得了 76.9%的平均 IoU,优于FCN-8s【29】、CRF-RNN【37】、扩容网【36】、DeepLabv2【7】。

Qualitative Results

参考

【2017 CVPR】【GCN】
大内核事项——通过全局卷积网络改进语义分割

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(没)(有)(什)(么)(好)(的)(情)(情)(感)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [G-RMI][TDM][SSD][DSSD][约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3[FPN[视网膜网[DCN

语义切分 FCNde convnetdeeplabv 1&deeplabv 2CRF-RNN】SegNet】parse netdilated netDRNRefineNet

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN

实例分割 [ SDS ] [ 超列 ] [ 深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

【DeepPose】【汤普森 NIPS'14】【汤普森 CVPR'15】

综述:高速公路网络-高速公路的门控功能(影像分类)

原文:https://towardsdatascience.com/review-highway-networks-gating-function-to-highway-image-classification-5a33833797b5?source=collection_archive---------4-----------------------

高速公路网,受 LSTM 启发,使用门控功能,超过 1000 层。

Gating Function to Highway

在这个故事中,高速公路网被简要介绍。这是 2015 年的作品。此时,发现很难优化非常深的神经网络。然而,为什么深度网络难以优化仍然是一个公开的问题。(当然后来很可能是因为渐变消失问题。)受长短期记忆(LSTM)的启发,作者由此利用选通函数来自适应地转换或绕过信号,以便网络可以更深入。【1000 层以上的深度网络也可以优化。我选择提交这篇论文是为了介绍门控函数。

公路网络最初出现在 2015 年 ICML 深度学习研讨会上,并作为 2015 arXiv 技术报告发布,引用超过 600 次。随后在 2015 NIPS 进行了扩展和发布,引用超过 500 次。( Sik-Ho Tsang @中)

概述

  1. 公路网
  2. 结果
  3. 分析

1。公路网

1.1.普通网络

  • 在谈论公路网之前,让我们从由 L 层组成的平面网络开始,其中第 l 层(省略层的符号):

  • 其中 x 为输入, WH 为权重, H 为转换函数,后接激活函数, y 为输出。对于第 i 个单元:

  • 我们计算 yi 并将其传递给下一层。

1.2.公路网

Highway Circuit

  • 在公路网络中,引入了两种非线性变换 TC :

  • 其中 T 是转换门,而 C 是进位门
  • 特别是C= 1-T**:

  • 对于特定的 T 值,我们可以有以下条件:

  • 当 T = 0 时,我们将输入作为输出直接传递,这就创建了一条信息高速公路。所以才叫高速公路网!!!
  • T =1 时,我们使用非线性激活的变换输入作为输出。
  • 在此,对比平面网络中的第 i 个单元,作者引入了 的概念。对于第I-第块,有一个块状态 Hi ( x )变换门输出 Ti ( x ) 。与相应的块输出yi:

  • 其连接到下一层。
  • 形式上, T( x )是 sigmoid 函数:

Sigmoid Function

  • 如果我们记得,sigmoid 函数将输出限制在 0 到 1 之间。当输入值太小时,它变成 0。当输入值太大时,它会变成 1。因此,通过学习 WTbT ,网络可以自适应地传递 H ( x )或者只是传递 x 到下一层。
  • 作者声称这有助于为 WT 提供一个简单的初始化方案,该方案独立于 H 的性质。
  • bT 可以用负值初始化(如-1,-3 等。)使得网络最初偏向进位行为。
  • 上述想法是作者提到的 LSTM 的启发。(LSTM 是一个非常著名的模块,主要用于自然语言处理(NLP))
  • 随机梯度下降(SGD)对于超过 1000 层的网络并没有失速。然而,确切的结果尚未提供。

2.结果

2.1.MNIST

  • 第一个图层是完全连接的平原图层,随后是 9、19、49 或 99 个完全连接的平原或公路图层。最后,网络输出由 softmax 层产生。
  • 所有网络都很薄:高速公路网络的每层有 50 个块而普通网络的每层有 71 个单元,每层产生大致相同数量的参数(5000)。

The best training curves for Plain Networks (Left) The best training curves for Highway Networks (Right) Mean performance of top 10 (out of 100) hyperparameter settings.

  • 如上所示,公路网得到的误差总是小于平面网得到的误差。

MNIST Test Accuracy

  • MNIST 的 10 层卷积高速公路网络使用两种架构进行训练,每种架构有 9 个卷积层,后跟一个 softmax 输出。所有图层的滤镜贴图数量(宽度)设置为 16 和 32
  • 与 Maxout 和 DSN 相比,公路网获得了相似的精度,但参数数量要少得多。(如果有兴趣,请访问我关于 NoC 的评论,了解关于 Maxout 的非常简要的介绍。)

2.2.西法尔-10 和西法尔-100

CIFAR-10 Test Accuracy

  • 当网络很深时,Fitnet 不能直接优化网络。它需要两个阶段的训练。
  • 通过使用门控功能,Highway 可以直接优化深层网络。特别是,高速公路 B 以 19 层获得了最高的精度。
  • 虽然公路 C 不如公路 B,但由于门控函数的存在,它仍然可以直接优化。

CIFAR-10, CIFAR-100 Test Accuracy

  • 这里,先前实验中网络中使用的全连接层被替换为具有大小为 1 的感受域的卷积层和全局平均池层。
  • 公路网在 CIFAR-10 上可以获得相当的性能,在 CIFAR-100 上可以获得最高的精度。

3.分析

Visualization of best 50 hidden-layer highway networks trained on MNIST (top row) and CIFAR-100 (bottom row)

  • 上图分别显示了偏差、所有训练样本的平均活动以及每个变换门的单个随机样本的活动。同一单个样本的块输出显示在最后一列。
  • 对于 CIFAR-100 网络,偏差随着深度增加形成梯度。在较低深度的强负偏压不是用来关闭闸门,而是使它们更有选择性。这使得单个示例(列 3)的转换门活动非常稀疏。
  • 对于 CIFAR-100 情况,大多数转换门平均都是活动的,而对于单个示例,它们显示出非常有选择性的活动。这意味着对于每个样本,只有几个块执行变换,但是不同的样本使用不同的块。

Visualization showing the extent to which the mean transform gate activity for certain classes differs from the mean activity over all training samples

  • 对于 MNIST 数字 0 和 7,在前 15 层中可以看到显著的差异。
  • 对于 CIFAR 类编号 0 和 1,差异更小,并且分布在所有层上。

Lesioned training set performance

  • 通过破坏,它意味着手动将一个层的所有变换门设置为 0,强制它简单地复制其输入。如上所示,对于每一层,在该层的门关闭的情况下,在完整的训练集上评估网络。
  • 对于 MNIST(左),可以看出,如果移除任何一个早期层,则误差显著上升,但是 层 15-45 似乎对最终性能几乎没有影响。大约 60%的图层不会影响最终结果,可能是因为 MNIST 是一个简单的数据集,不需要太多深度。
  • 虽然 CIFAR-10 是一个相对复杂的数据集,但误差会更大。

通过查看高速公路网络,我们可以了解使用 Sigmoid 的门控功能。希望我能在未来回顾循环公路网。

参考

【2015】【arXiv】
公路网

【2015】【NIPS】
训练非常深的人脉

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(们)(还)(不)(想)(到)(这)(些)(人)(们)(,)(我)(们)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(们)(还)(没)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(里)(去)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(里)(去)(了)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(到)(这)(里)(来)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC yolo 9000[yolov 3][FPN][retina net][DCN]

语义切分 FCNde convnetdeeplab v1&deeplab v2SegNet】parse netdilated netPSP netdeeplab v3

生物医学图像分割 [ 累计视觉 1 ] [ 累计视觉 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet]

实例分段 DeepMask SharpMask MultiPathNet MNC InstanceFCN FCIS 】

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

回顾:海康威视——2016 年国际机器人视觉大会(物体检测)亚军

原文:https://towardsdatascience.com/review-hikvision-1st-runner-up-in-ilsvrc-2016-object-detection-1f0a42cda767?source=collection_archive---------35-----------------------

ILSVRC 2016 物体探测挑战赛单个模型结果第一名

Hikvision CCTV Product

This time, the approach by Hikvision (海康威视), in ILSVRC 2016 object detection challenge, is briefly reviewed. Hikvision was launched in 2001 based at Hangzhou in China. Hikvision advances the core technologies of audio and video encoding, video image processing, and related data storage, as well as forward-looking technologies such as cloud computing, big data, and deep learning.

海康威视在 ILSVRC 2016 中赢得了多项比赛:

  • 物体检测:第二名,65.27%地图
  • 物体定位:第二名,误差 8.74%
  • 场景分类:第一名,误差 9.01%
  • 场景解析:第七名,IoU 和像素准确率平均 53.5%

在这个故事中,我只关注探测挑战。虽然海康威视在检测任务上拥有最先进的成果,但没有多少创新技术或新颖性。可能由于这个原因,他们还没有发表任何关于它的论文或技术报告。

相反,他们只在 2016 年 ECCV 的 ImageNet 和 COCO 联合研讨会上分享了他们的方法和成果。( Sik-Ho Tsang @ Medium)

Hikvision VCA video analytics (https://www.youtube.com/watch?v=2I16iVJtg9M)

概述

  1. 级联 RPN
  2. 全球背景
  3. 其他技术
  4. 物体检测要素概要
  5. 结果

1。级联 RPN

Cascaded RPN

  • 级联区域建议网络(RPN)用于生成建议。
  • 原始 RPN:批量为 256,阴性/阳性样本比率通常大于 10
  • 级联 RPN:批量大小为 32,最大 N/P 比率仅为 1.5。

  • 通过级联 RPN 和更好的 N/P 比,召回率得到提高。
  • 0.7 增益时召回率为 9.5%。

2.全球背景

Global Context

  • 利用全局上下文,提取全局特征并与 ROI 特征连接,以获得更好的分类精度。
  • 获得了 3.8%的映射增益。

3.其他技术

  • ImageNet LOC预训练:0.5%地图增益。
  • 平衡采样:2007 年 VOC 0.7% mAP。

4。物体探测要素概述

Object Detection Elements

  • 使用预激活 ResNet 。

5.结果

5.1.ILSVRC 2016 检测挑战

ILSVRC 2016 Detection Challenge

  • 使用单一模型,实际上,海康威视获得排名 1,优于 CUImage 团队,使用 GBD 网。
  • 然而,使用集合模型, GBD 网获得了更好的结果。

5.2.ILSVRC 2016 本地化挑战

ILSVRC 2016 Localization Challenge

  • 海康威视以 3.7%的分类误差和 8.7%的定位误差获得 Rank 2。

5.3.帕斯卡 VOC 2012

PASCAL VOC 2012

  • 海康威视超越 ResNet 。

通过将不同的技术结合在一起,海康威视能够在 ILSVRC 2016 检测挑战赛中获得第二名。

参考

【2016 ECCV】【海康威视】(仅幻灯片)
走向良好实践表彰&检测

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(没)(有)(什)(么)(好)(的)(情)(情)(感)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [TDM][SSD][DSSD][yolo v1][yolo v2/yolo 9000][yolo v3][FPN][retina net[DCN]

语义切分 FCNde convnetdeeplabv 1&deeplabv 2CRF-RNN】SegNet】parse netdilated netDRNRefineNet

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN

实例分割 [ SDS ] [ 超列 ] [ 深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例化 ] [ FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

【DeepPose】【汤普森 NIPS'14】【汤普森 CVPR'15】

复习:超列(实例分段)

原文:https://towardsdatascience.com/review-hypercolumn-instance-segmentation-367180495979?source=collection_archive---------16-----------------------

超柱,一个来自神经科学的术语,优于 SDS

在这个故事里,超柱被点评。“超柱”(Hypercolumn)这一术语从神经科学中借来,用来描述排列在柱状结构中的一组对多个方向和多个频率的边缘敏感的 V1 神经元。通过借用超柱的思想,提高了预测精度,发表在 2015 CVPR 上,引用超过 800 次。本书在 CVPR 出版时,第一作者 Bharath Hariharan 博士正在加州大学伯克利分校攻读博士学位。当 Hypercolumn 后来在扩展到 2017 TPAMI** 时,Hariharan 博士已经成为脸书人工智能研究(FAIR)的博士后研究员。之后,另一篇著名论文《特征金字塔网络》( FPN )于 2017 年在 CVPR 发表。现在,他成为康奈尔大学的助理教授,从事三维空间的计算机视觉研究。( Sik-Ho Tsang @中)**

概述

  1. 超柱概念
  2. 使用超柱的像素分类
  3. 高效超柱
  4. 快速超柱(2017 年 TPAMI)
  5. 结果

1.超圆柱概念

1.1.超圆柱表示

Hypercolumn Representation

  • 此时,卷积神经网络(CNN)通常使用最后一层的输出作为特征表示。然而,该层中的信息在空间上过于粗糙,不允许精确定位
  • 一个像素的超列是该像素上方所有 CNN 单元的激活向量,如上图所示。
  • 通过这种方式,空间位置信息可以从更早的层中获得,并且具有更准确的预测结果。

1.2.超列问题设置

  • 首先,假设在非最大抑制(NMS)之后,我们从对象检测系统获得了一组检测。
  • 然后,检测的包围盒被稍微扩展并在这个扩展的盒子上预测热图。
  • 对于分割,热图编码了特定位置在对象内部的概率。由于它是在检测之后被分割的,因此,我在标题处将其声明为一种实例分割方法。
  • 它也适用于零件标记/关键点预测,为每个零件/关键点预测一个单独的热图,其中每个热图是一个位置属于该零件/关键点的概率。
  • 在每种情况下,预测一个 50×50 的热图 ,然后调整到扩展的边界框的大小,并将其放到图像上。

2.使用超柱的像素分类

  • 该位置处的超柱是一个长向量,其连接了来自网络中的一些或所有特征地图的特征。
  • 例如,使用来自 AlexNet 架构的 pool2 (256 通道)、conv4 (384 通道)和 fc7 (4096 通道)将导致 4736 维向量。
  • 位置很重要,例如:对于被检测的人,头部应该在盒子的顶部。因此,最简单的方法是为 50×50 个位置中的每个位置训练单独的分类器,即在每个位置可以使用每个超列上的 1×1 卷积或全连接(FC)层。
  • 但是有三个问题:1。通过一个点的数据量很少,这可能会导致过度拟合。2.训练如此多的分类器是计算昂贵的。3.相邻的像素应该彼此相似。

3.高效超柱

Efficient Hypercolumn

  • 一种解决方案是使用卷积和上采样(调整大小)。
  • 1×1 卷积被 n×n 卷积代替。这相当于不仅查看像素正上方的单元,而且查看该单元的邻域。
  • 有几段谈到了如何将超列概念转变为高效的超列实现。(如果有兴趣,请看论文。)

Hypercolumn Classifiers As a Neural Network

  • 最后,超列分类器如上图所示。
  • 在使用双线性插值进行卷积和上采样之后,来自不同层的特征图被加在一起,并经过 sigmoid 函数。
  • 然后结合热图给出最终输出。
  • 它看起来像 FCN。

4.快速超柱(2017 TPAMI 中)

Fast Hypercolumn Prediction Using the SPP Idea

  • CNN(橙色)的卷积层只在整个图像上运行一次。因为卷积特征可以在所有盒子之间共享。
  • 然后,对于每个盒子,空间金字塔池(SPP)图层使用空间金字塔格网来计算固定长度的矢量,然后将其传递给完全连接的图层(红色)。(SPP 层在 SPPNet 中提出。)
  • 主要的加速来自所有机器共享的卷积特性。(橙色)
  • 完全连接的图层要素仍按每个框单独计算。

5.结果

5.1.检测后分割

Ablation Study on VOC2012 Val

  • SDS【22】:基线,47.7% mAP。
  • Hypercolumn (Hyp) :使用 10×10 网格,根据位置是否在原始候选区域内,还添加了额外的 1/0,51.2%地图。
  • 用包围盒回归( bbox-reg )来细化盒子:51.9%贴图。
  • 带微调( FT ): 52.8% mAP,远高于 SDS 。
  • 随着一个或两个上采样路径被丢弃,mAP 也被丢弃。
  • 使用不同的网格尺寸来离散检测盒:使用 1×1 网格已经优于 SDS 。使用 5×5 网格已经恢复了 10×10 网格的全部性能。

Heatmap,Top Row: Baseline, Bottom Row: Hypercolumn

VOC2012 Val

  • T-Net: AlexNet ,44.0%地图。
  • o 网: VGGNet ,52.6%地图。
  • O-Net,Hyp: 56.5%图。
  • O-Net,Hyp+Rescore: 60.0% mAP。(围绕 NMS 阈值和区域重叠重新计分播放)

5.2.关键点预测

  • 只有“人”的范畴。

VOC2009 Val

Heatmap, Top Row: Baseline Only FC7, Bottom Row: Hypercolumns

  • 经过微调的超柱可获得最佳结果。

5.3.零件标签

  • 人、马、牛、羊、猫、狗和鸟。

PASCAL VOC

Heatmap, Top Row: Baseline Only FC7, Bottom Row: Hypercolumns

  • 除了 bird,超圆柱获得了最好的结果。

5.4.快速超圆柱

Time Against Number of Boxes

  • 慢速系统所花费的时间随着箱子数量的增加而线性增加(256 个箱子可达 6 秒)。
  • 无论我们在多少台机器上运行,使用 SPP 层的 fast 系统所花费的时间保持不变。特别是,它能够在不到 250 毫秒内分割 256 个盒子。

参考

【2015 CVPR】【超柱】
用于对象分割和细粒度定位的超柱

【2017 TPAMI】【超柱】
使用超柱的对象实例分割和细粒度定位

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(没)(有)(什)(么)(好)(的)(情)(情)(感)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [ DSSD ] [ 约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3 ] [ FPN ] [ 视网膜网 ] [ DCN ]

语义切分 FCNde convnetdeeplab v1&deeplab v2CRF-RNN】SegNet】parse netdilated netPSPNetdeeplab v3]

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道[V-Net]

实例分割 SDS DeepMask SharpMask MultiPathNet MNC 】 InstanceFCN FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

(T38) 人类姿势估计 (T39)
[(T41) 汤普森 NIPS'14 [T42)]

综述:IDW-CNN——从野生数据集中的图像描述中学习提高了准确性(语义分割)

原文:https://towardsdatascience.com/review-idw-cnn-learning-from-image-descriptions-in-the-wild-dataset-boosts-the-accuracy-807eb5ffe371?source=collection_archive---------33-----------------------

胜过 FCN 、 CRF-RNN 和 DeepLabv2

本文对中山大学、香港中文大学和商汤集团(有限公司)联合制作的 IDW 有线电视新闻网进行简要回顾。

  • 通过从野生(IDW)数据集中的图像描述进行学习,提高了分割精度。
  • 与以前的图像字幕数据集不同,在以前的图像字幕数据集中,字幕是手动密集注释的,IDW 的图像及其描述是自动从互联网上下载的,无需任何手动清理和提炼。

这是一篇 2017 年 CVPR 论文,引用数十次。( Sik-Ho Tsang @中)

概述

  1. 在野外(IDW)数据集中构建图像描述
  2. IDW-CNN 架构
  3. 培训方式
  4. 实验结果

1。在野外(IDW)数据集构建图像描述

  • IDW 分两级建造。

1.1.第一阶段的

  • 准备了中经常出现的 21 个介词和动词,如“hold”、“play with”、“hug”、“ride”和“stand near”,以及来自 VOC12 的 20 个对象类别,如“person”、“cow”、“bike”、“sheep”和“table”,
  • 他们在‘主语+动词/prep’方面的组合。“+ object”导致 20×21×20 = 8400 个不同的短语,例如“骑自行车的人”、“坐在自行车附近的人”和“站在自行车附近的人”。
  • 有些在实践中很少出现,例如“牛抱羊”。
  • 在去除无意义的短语之后,收集了数百个有意义的短语。

1.2.第二级

  • 这些短语被用作从因特网上搜索图像及其周围文本的关键词。
  • 无效短语,如“人骑牛”,如果其检索图像的数量小于 150,则被丢弃,以防止可能导致训练中过拟合的罕见情况或异常值。
  • 结果,获得了 59 个有效短语。最后, IDW 有 41421 张图片和描述

The number of images in IDW with respect to each object category in PASCAL VOC 2012

  • 上面的直方图揭示了现实世界中这些物体的图像分布,没有任何手动清理和细化。

1.3.图像描述表示

  • 每一个图像描述都被自动转换成一个解析树,在这里我们选择有用的物体(例如名词)和动作(例如动词)作为训练过程中的监督。
  • 两个对象的每个配置和它们之间的动作可以被认为是对象交互,这对于图像分割是有价值的信息,但是在 VOC12 的 labelmaps 中没有给出。

The constituency tree generated by language parser

  • 首先,斯坦福解析器用于解析图像描述并生成选区树,如上所述。但是它仍然包含不相关的词,既不描述对象类别也不描述交互。
  • 然后需要将选区树转换成语义树,语义树只包含对象及其交互。1)根据词类过滤叶节点,仅保留名词作为对象候选,保留动词和介词作为动作候选。2)名词转宾语。WordNet 中统一同义词的词汇关系数据。不属于 20 个对象类别的名词将从树中移除。3)使用 word2vec 将动词映射到定义的 21 个动作。4)通过节点从语义树中提取对象交互。
  • 如‘姑娘玩小羊,牵着小羊’先被过滤出描写,再进一步转移成‘人玩小羊,牵着小羊’。
  • 在解析了 IDW 中的所有图像描述之后,总共获得了 62,100 个对象交互。

The number of images with respect to the number of interactions, showing that each image has 1.5 interactions on average.

与之前的数据集相比,IDW 的构建无需人工干预且费用极低。

The constituency tree after POS tag filtering (Left), and object interactions (Right)

1.4.三个测试集

  • int-IDW :从 IDW 随机选择1440 张图像作为物体交互预测的测试集。
  • seg-IDW :在 int-IDW 中为每幅图像标注每像素 labelmap,产生一个分割测试集。就每幅图像中的物体多样性而言,seg-IDW 比 VOC12 更具挑战性。
  • 零 IDW : 零拍摄测试集包括 1000 张看不见的物体相互作用的图像。例如,“人骑牛”的形象很少见(如在斗牛中),在训练中不会出现。

2. IDW-CNN 架构

(a) IDW-CNN, which has two streams, (b) Each subnet has the same network structure.

  • 该网络可以分为三个主要部分。

2.1.特征抽出

  • IDW-CNN 采用 DeepLabv2 作为特征提取的构建模块。
  • IDW-CNN 仅从 DeepLabv2 继承了ResNet-101,而则去除了多尺度融合和 CRF** 等其他组件。**
  • 给定一幅图像 I , ResNet-101 产生 2048 通道的特征。每个通道的尺寸为 45 × 45

2.2.分段流

  • 上述特征被卷积层用来预测分割标签图(表示为 Is),其大小为 21×45×45

2.3.内部流

  • 这条河流有三个阶段。
  • 第一个阶段,我们通过一个卷积层将特征通道的数量从 2048 个减少到 512 个,记为 h ,以减少后续阶段的计算量。
  • hmhm_i 中的每个特征图都是通过预成型 hIs 每个通道之间的元素乘积(“⊗”)得到的,代表一个掩膜。因此,512×45×45 的每个 hm_iR 代表第 i 个对象类的被屏蔽特征。
  • 第二阶段,利用每个 hm_i 作为输入来训练相应的对象子网,该子网输出表征对象 i 是否出现在图像 I 中的概率。
  • 训练了 21 个对象子网,这些子网具有相同的网络结构,但其参数不共享,除非全连接层共享。在上图右侧的橙色处。
  • 总体来说,第二阶段决定了哪些对象出现在 I 中。
  • 第三阶段,训练了 22 个动作子网,每个动作子网预测两个出现的对象之间的动作。上图右边的蓝色部分是。
  • 例如,如果“人”和“自行车”都出现在 I 中,则它们的特征组合,512×45×45 的hm _ personhm _ biker被传播到所有动作子网。
  • 最大的响应很可能是由以下动作子网之一产生的:“乘坐”、“坐在附近”和“站在附近”。

2.4.对象对选择

  • OPS 合并所呈现对象的特征。在上图左侧的紫色处。
  • 例如,如果“人”、“自行车”和“汽车”的对象子网具有高响应,则 hm_personhm_bikehm_car 中的每对特征被元素地加在一起,产生三个组合特征,分别表示为 hm_person+bikehm_person+carhm_bike+car
  • 每个合并的特征然后被转发到所有 22 个动作子网。

2.5.精炼

  • i 个对象子网产生一个分数(概率),所有 21 个分数串接成一个向量。
  • 它被当作一个滤波器来使用卷积来改进分割图

3.培训方法

  • IDW 的每张图片都包含了物体间的相互作用,但是没有标签地图。
  • VOC12 中的每个图像都有 labelmap,但没有交互。
  • IDW-CNN 为每个样本估计一个伪标签,并将其视为 BP 中的基本事实。
  • 对于 Seg-stream ,通过结合预测分割图、 Is_idw 和预测对象标签、 lo_idw ,将潜在的 Is_idw 估计为“伪地真值”。
  • 对于 Int-stream ,针对每对对象之间的动作获得一个先验分布。对于“自行车”和“人”,这种先验产生的概率比上述四个动作高,比其他动作低。在训练阶段,如果预测动作是上述之一,损失函数提供低惩罚,否则提供高惩罚。

4.实验结果

VOC12 test set

  • ResNet-101:74.2% mIoU。
  • IDW-CNN(10k) : 10k IDW 训练图像,81.8% mIoU。
  • IDW-CNN(20k) : 20k IDW 训练图像,85.2% mIoU。
  • IDW-CNN(40k) : 40k IDW 图像用于训练,86.3% mIoU。并且它胜过 SOTA 的方法,如 FCN 、 CRF-RNN 和 DeepLabv2 。

seg-IDW dataset

  • 类似地,在赛格-IDW 数据集上,IDW-CNN(40k)具有最好的性能。

Recall of object interaction prediction

  • 回忆- n ( n = 5,10),衡量真实交互在前 5 或 10 个预测交互中的可能性。
  • IDW-CNN 在 5 次召回中领先其他公司 3%。

Recall on zero-IDW

  • IDW-CNN 全模式仍然获得最高召回率。

Some Visualizations

参考

【2017 CVPR】【IDW-CNN】
用于语义图像分割的学习对象交互和描述

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(有)(什)(么)(情)(况)(呢)(?)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(是)(这)(些)(人)(,)(还)(没)(有)(什)(么)(好)(的)(情)(感)(,)(我)(们)(还)(没)(有)(什)(么)(好)(的)(情)(感)(,)(但)(我)(们)(还)(没)(有)(什)(么)(好)(好)(的)(情)(感)(。 )(我)(们)(都)(不)(想)(要)(让)(这)(些)(人)(都)(有)(这)(些)(情)(况)(,)(我)(们)(还)(不)(想)(要)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(就)(是)(这)(些)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(。 )(我)(们)(都)(不)(知)(道)(,)(我)(们)(都)(是)(很)(强)(的)(,)(我)(们)(都)(是)(很)(强)(的)(对)(对)(对)(对)(起)(来)(,)(我)(们)(都)(是)(很)(强)(的)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(

物体检测 [ 过食 ] [ R-CNN ] [ 快 R-CNN ] [ 快 R-CNN][MR-CNN&S-CNN][DeepID-Net][CRAFT][R-FCN][离子 [G-RMI][TDM][SSD][DSSD][yolo v1][yolo v2/yolo 9000][yolo v3][FPN[retina net[DCN

语义切分[FCN][de convnet][deeplabv 1&deeplabv 2][CRF-RNN][SegNet][parse net][dilated net][DRN][RefineNet][

生物医学图像分割[cumevision 1][cumevision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN]

实例分割 [ SDS ] [ 超列 ] [ 深度掩码 ] [ 清晰度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

)( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )(

DeepPose Tompson NIPS'14 Tompson CVPR'15 CPM

评审:实例分数图-实例敏感分数图(实例分段)

原文:https://towardsdatascience.com/review-instancefcn-instance-sensitive-score-maps-instance-segmentation-dbfe67d4ee92?source=collection_archive---------20-----------------------

全卷积网络(FCN),具有实例敏感得分图,优于 DeepMask,可与 MNC 竞争

在这个故事中,由微软研究院清华大学中国科学技术大学开发的实例 ( 实例敏感全卷积网络)被简要回顾。

通过使用全卷积网络( 、FCN )实例敏感得分映射被引入,并且所有全连接(FC)层被移除。在 PASCAL VOC 和 MS COCO 上获得了实例段提议的竞争结果。发表在 2016 ECCV 上,被引用 100 多次。( Sik-Ho Tsang @中)

涵盖哪些内容

  1. 网络结构
  2. 实例敏感得分图
  3. 消融研究
  4. 结果

1.网络结构

Network Structure

  • 使用 ImageNet 上预先训练的【VGG-16】作为特征提取器。最大池层 pool4 从跨距 2 修改为跨距 1。相应地,conv5_1 至 conv5_3 由 hole 算法调整,该算法以前由deep lab&dilated net使用,以便减小输出步幅,即增大输出特征图尺寸
  • 在特征图的顶部,有两个完全卷积分支一个用于估计片段实例另一个用于对实例进行评分

对实例敏感的分数映射分支

  • 对于第一个分支(顶部路径),我们采用 1×1 的 512-d 卷积层进行特征变换,然后用 3×3 的卷积层生成一组 k 实例敏感评分图,也就是 k 输出通道。( k =5 最后。)
  • 组装模块用于在分辨率为 m × m 的滑动窗口中生成对象实例。( m =21 此处。)
  • 这个想法非常类似于 R-FCN 中的阳性敏感得分图。但是R-FCN使用正面敏感得分图进行对象检测,而 InstanceFCN 使用实例敏感得分图来生成建议

客观分数映射分支

  • 对于评分实例第二分支(底部路径),我们使用 3×3 的 512-d 卷积层,后跟 1×1 的卷积层。这个 1×1 层是针对以该像素为中心的滑动窗口的分类实例/非实例的每像素逻辑回归。因此,这是一个客观分数图

损失函数

  • 这里 i 是采样窗口的索引, pi 是该窗口中实例的预测客观分数,如果该窗口是正样本,则 pi 为 1,如果是负样本,则为 0。 Si 是该窗口中组装的线段实例, Si 是地面真实线段实例, j 是该窗口中的像素索引。 L 是 logistic 回归损失。
  • 256 个采样窗口具有 1∶1 的正/负采样比。

2。实例敏感得分图

2.1.与相比,FCN

Top: FCN, Bottom: InstanceFCN (k=3)

  • 在 FCN (上)中,当两个人靠得太近时,生成的比分图很难让他们分开。
  • 但是,使用 InstanceFCN(底部),每个分数贴图负责捕捉对象实例的相对位置。例如:左上分数图负责捕捉对象实例的左上部分。组装后,可以生成分离的人物面具。
  • 下面显示了一些带有 k =3 的实例遮罩示例:

Some examples of instance masks with k=3

2.2.与深掩模相比

DeepMask

  • 在深度蒙版中,使用了 FC 层,使得模型变大。
  • 在 InstanceFCN 中,没有 FC 层,这使得模型更加紧凑。

3.消融研究

Average Recall with Different k

  • 平均召回率(AR)是在 10,100,1000 个提议下测量的。
  • k =5 和 k =7 具有可比性。以及下面实验中的 k =5。

Train and Test Image Sizes

  • ~深度屏蔽:作者实现的深度屏蔽。使用 2 个 FC 层需要 53M 个参数。(512×14×14×512+512×56 = 53M)
  • 发现使用全尺寸图像进行训练具有高得多的AR。而最后的 k -d 卷积层只有 0.1M 的参数。(512×3×3×25 = 0.1 米)

4.结果

4.1.帕斯卡 VOC 2012

Segment Proposals on PASCAL VOC 2012 Validation Set

Recall vs IoU

  • InstanceFCN 是好多了 SS(选择性搜索)和deep mask
  • InstanceFCN 在 AR@10 时的 AR 比MNC,在 AR@100 和 AR@1000 时的 AR 也与MNC不相上下。****

Instance Segmentation on PASCAL VOC 2012 Validation Set (N = 300 Proposals)

使用 InstanceFCN 为 MNC 生成建议,它具有与 MNC 相当的映射。( MNC 目前是并发作品。)

4.2.可可女士

Segment Proposals on the First 5k Images of MS COCO Validation Set

Recall vs IoU

  • InstanceFCN 的 ARs 比 DeepMask 和 DeepMaskZoom 高。

Comparisons with DeepMask on MS COCO Validation Set

More Examples on MS COCO validation set

参考

【2016 ECCV】【Instance fcn】
实例敏感全卷积网络

我的相关评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-NetR-FCN】离子多路SSDDSSD

语义切分 [FCN][de convnet][deeplab v1&deeplab v2][parse net][dilated net][PSPNet]

实例分割 深度屏蔽锐度屏蔽多路径MNC]

点评:离子—内外网,2015 年 COCO 探测(物体探测)亚军

原文:https://towardsdatascience.com/review-ion-inside-outside-net-2nd-runner-up-in-2015-coco-detection-object-detection-da19993f4766?source=collection_archive---------26-----------------------

2015 年可可检测挑战赛最佳参赛学生和亚军

在这个故事里,康乃尔大学微软研究院ION(内外网)进行了回顾。通过使用 skip pooling 在多个尺度和抽象级别提取信息,并使用递归神经网络(RNN)捕捉上下文特征,ion 在 2015 MS COCO 检测挑战赛中获得了最佳学生参赛作品第三名

  • 内部:跳过 L2 正常化连接。
  • 外部:上下文堆叠 4 向 rnn。

由于 ION 使用了一个简单的名为“IRNN”的 RNN,这也是了解 RNN 的一个良好开端。发表在 2016 CVPR 上,引用 300 余次。( Sik-Ho Tsang @中)

涵盖哪些内容

  1. 离子架构
  2. 跳过池
  3. 从香草 RNN 到四方 IRNN
  4. 部分设计评估
  5. 结果

1。离子架构

ION Architecture

1.1.快速 R-CNN

在最初的[快速 R-CNN](http://Fast R-CNN) 中,ROI 汇集仅在 conv5 中执行。

  • 对于小对象,conv5 上的尺寸可能仅覆盖 1×1 单元,该单元可上采样至 7×7。
  • 只有局部特征(ROI 内)用于分类。

1.2.离子

为了分别解决上述问题,

  • 内部:con v3 至 conv5 的输出经过 L2 归一化、级联、重新缩放和 1×1 conv 降维。
  • Outside :在 conv5 的输出端,有 2 个堆叠的 IRNNs(一种 RNN,由 ReLUs 组成,用单位矩阵初始化。)以便利用 ROI 汇集区域之外的上下文特征。

注意,离子架构是基于 快速 R-CNN 使用 VGG16 主干开发的。因此,网络始端的 conv1 至 conv5 和末端的全连接(FC)层均来自使用 VGG16 主干的原始快速 R-CNN 。

2.跳过池

  • ROI 映射在多个层上执行,从 conv3 到 conv5 ,以及由 2 个 irnn 计算的上下文特征。
  • 然而,为了匹配 FC 层的输入,需要 512×7×7 形状的尺寸。从而,在拼接之后,执行 1×1 卷积将维度减少到 512×7×7。
  • 但是较早的层通常比后面的层有更大的值,这一点在 ParseNet 中有提到。因此,在拼接之前,每个汇集的 ROI 被 L2 归一化 并通过经验确定的比例重新按比例放大

3.从香草 RNN 到四方 IRNN

3.1.香草 RNN(RNN 平原谭)

香草 RNN ( 普通 Tanh RNN )中,Tanh 用于激活:

3.2.四向 IRNN

Hinton 教授的团队提出了 IRNN,它是一种 RNN,由 ReLUs 组成,并用单位矩阵初始化。(如果有兴趣,可以访问 arXiv 中的论文,论文名为“初始化整流线性单元递归网络的简单方法”。)

因为它是在一个图像内完成的,所以它是一个横向 RNN。下面是一个例子。对每一行(右/左)或每一列(下/上)重复该步骤。

使用基于 ReLU 的 IRNN 的 4 向 IRNN 的简单版本如下:

上面的等式是针对右向 IRNN 的,对于左、上、下方向类似。为了提高效率,作者简化了上述四方向 IRNN。简而言之,首先,隐藏到输出被合并到单个 conv 中,即级联之后是 1×1 卷积:

第二,输入到隐藏也通过 1×1 卷积被简化,并且与 4 个循环转换共享 conv:

最后,将两个改进的 IRNNs 堆叠在一起以提取上下文特征:

Two Stacked IRNN

经过上述修改后,RNN 方程变成:

正如我们所见,没有输入 x ,因为输入是由 1×1 卷积隐式完成的。发现 W 由于检测性能类似也可以去掉:

这就像一个累加器,但是每一步之后都有 ReLU。因此,IRNN 由重复的步骤组成:积累,再积累,积累,等等。请注意,这与积分/区域图像不同,因为每一步都有 ReLU。

3.3.分割损失

如上图所示,由于对象检测数据集也包含语义分割标签,因此在训练过程中,也使用上下文特征进行语义分割。就像 FCN 一样,反卷积使用 32×32 的核进行 16×的上采样,并且增加了一个额外的 softmax 损失层,权重为 1。这种损失被用作正则化器

在测试过程中,该分段路径被移除。因此,推理时间与没有分割损失的情况下训练的网络相同。

3.4.两阶段训练

如前所述,该网络基于快速 R-CNN ,使用 VGG16 作为主干,因此,ImageNet 上预先训练的 VGG16 用于那些公共层。并且用 conv1 至 conv5 冻结来训练网络。然后,在 conv1 和 conv2 冻结的情况下训练网络。

4.部分设计评估

消融研究在 PASCAL VOC 2007 数据集上进行。所有的训练都使用 2007 trainval 和 2012 trainval 的联合,并在 2007 测试集上进行测试。

4.1.泳池来自哪几层?

Combining Features from Different Layers.

  • 如上所示,将 conv3、conv4 和 conv5 与 L2 归一化相结合,可获得最高性能的 74.6% mAP。

4.2.应该如何归一化特征幅度?

Approaches to Normalizing Feature Amplitude.

  • 在 ParseNet 中,它对通道求和,并对每个空间位置执行一次归一化。或者取而代之,对每个汇集的 ROI 中的所有条目求和,并将其归一化为单个斑点。
  • 在缩放过程中,每个通道是固定比例还是学习比例?
  • 发现所有这些方法的性能大致相同。

4.3.分割损失有多大帮助?

Effect of Segmentation Loss.

  • 如上所示,分段丢失的情况下,性能始终更好。

4.4.我们应该如何融入语境?

Receptive Field of Different Layer Types.

Comparing Approaches to Adding Context.

  • 在 conv5 之后,尝试不同类型的 conv。2 叠 3×3 和 2 叠 5×5 只是进一步的卷积。感受野是基于过滤器的大小。对于全球平均池,它有一个输入大小的感受野,但输出是相同的价值。对于 IRNN,它有一个输入大小的感受野,输出值在不同的位置是不同的。
  • 当然,使用 IRNN 可以获得最高的地图。

4.5.哪个 IRNN 建筑?

Varying The Hidden Transition.

Other Variations.

  • 包括 Whh 和具有 256 个隐藏单元获得最佳结果。并且对于第一 IRNN 仅使用左右方向的 IRNN,并且仅使用上下方向的 IRNN,具有与两个堆叠的 4 方向 IRNN 相同的结果。然而,排除 Whh,使用 512 个隐藏单元,并且最终使用两个堆叠的 4 方向 IRNN。

5.结果

5.1.帕斯卡 VOC 2007

PASCAL VOC 2007 Test Set (07: 07 trainval, 12: 12 trainval, S: Segmentation labels, R: 4-Dir IRNN, W: Two rounds of box regression and weighted voting, D: remove all dropout, SS: SelectiveSearch, EB: EdgeBoxes, RPN: region proposal network, Time: per image, excluding proposal generation.)

  • 包括所有技术在内,ION 获得了 80.1%的 mAP,并且每幅图像花费 2.0 秒,这比 30 秒的最先进的 MR-CNN 快得多。

5.2.帕斯卡 VOC 2012

PASCAL VOC 2012 Test Set (07: 07 trainval, 12: 12 trainval, S: Segmentation labels, R: 4-Dir IRNN, W: Two rounds of box regression and weighted voting, D: remove all dropout, SS: SelectiveSearch, EB: EdgeBoxes, RPN: region proposal network, Time: per image, excluding proposal generation.)

  • 与 VOC 2007 相似,包括所有技术,ION 获得 77.9%的 mAP。

5.3.可可女士

MS COCO 2015 Test-Dev (comp: competition submission result, post: post-competition result)

  • 仅使用单一模型(无集合),区域提案使用 MCG+RPN,COCO 小姐竞赛提交结果获得 31.2% mAP
  • 并且针对小对象的平均查准率(AP)和平均查全率(AR)分别比 Fast R-CNN (F-RCN)从 4.1%提高到 7.4%,从 7.4%提高到 11.7%。
  • 通过左右翻转和调整训练参数,对于赛后成绩得到 33.1% mAP

希望大家喜欢看我的故事,快乐深度学习,祝大家新年快乐!

参考

【2016 CVPR】【离子】
内外网:用跳过池和递归神经网络检测上下文中的对象

我的相关评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-NetR-FCN】SSDDSSDyolov 1

语义切分 [FCN][de convnet][deeplab v1&deeplab v2][parse net][dilated net][PSP net]

综述:LapSRN 和 MS-lap srn-拉普拉斯金字塔超分辨率网络(超分辨率)

原文:https://towardsdatascience.com/review-lapsrn-ms-lapsrn-laplacian-pyramid-super-resolution-network-super-resolution-c5fe2b65f5e8?source=collection_archive---------10-----------------------

渐进重构残差、Charbonnier 损失、参数共享、局部残差学习,优于 SRCNN、VDSR、DRCN、DRRN

32×, 16×, 8×, 4× and 2× SR

在这个故事中,回顾了 LapSRN(拉普拉斯金字塔超分辨率网络)MS-LapSRN (多尺度拉普拉斯金字塔超分辨率网络)。通过逐步重构子带残差,利用夏邦尼尔损失函数,LapSRN 优于 SRCNN 、 FSRCNN 、 VDSR 和 DRCN 。有了参数共享局部残差学习多尺度训练,MS-LapSRN 甚至胜过 DRRN 。 LapSRNMS-LapSRN 分别发表在 2017 CVPR 超过 200 篇引用2018 TPAMI 数十篇引用。(曾植和 @中)

由于 MS-LapSRN 是 LapSRN 的扩展,我将只介绍 MS-LapSRN 论文中的内容,但它也涉及 LapSRN 和 MS-LapSRN 的方法和结果。

概述

  1. 以前方法中的问题
  2. LapSRN:架构
  3. LapSRN: Charbonnier 损失函数
  4. MS-LapSRN:参数共享
  5. MS-LapSRN:局部剩余学习(LRL)
  6. MS-LapSRN:多尺度训练
  7. 消融研究
  8. 与最先进结果的比较

1。先前方法中的问题

  • 在以前的方法中有三个问题

1.1.双三次插值

Bicubic Interpolation

  • 双三次插值用于在进入网络之前放大输入 LR 图像。然而,该预上采样步骤增加了不必要的计算成本并且没有为重构 HR 图像提供额外的高频信息。

1.2.L2 损失

  • 现有方法利用 L2 损失(即,均方误差损失)来优化网络。
  • 由于同一个 LR 面片可能有多个对应的 HR 面片L2 损失未能捕捉到 HR 面片的基本多模态分布,重建的 HR 图像往往过平滑与自然图像上的人类视觉感知不一致。

1.3.单步上采样

One-Step Upsampling

  • 这种一步上采样不能很好地超分辨精细结构,这使得学习大比例因子(例如 8 倍)的映射函数更加困难。

2。LapSRN:建筑

LapSRN / MS-LapSRN Architecture

  • 与一步上采样相反,网络在多个金字塔等级,特别是在 log2( S 等级,其中 S 是比例因子(即 2,4,8),渐进地重建高分辨率图像的子带残差。
  • 不使用双三次,直接从低分辨率输入图像中提取特征,从而降低计算负荷。
  • (拉普拉斯金字塔已经用了几十年。它被称为拉普拉斯金字塔,因为在特征提取分支,在每一级都有一个残余图像输出。如果感兴趣,请访问 wiki 关于金字塔(图像处理),尤其是高斯金字塔&拉普拉斯金字塔。)
  • 两个分支:** 特征提取&图像重建。**

2.1.特征提取****

  • ****在级别 s ,有 d 卷积层和一个转置卷积层(或去卷积层)以 2 倍的比例对提取的特征进行上采样。
  • 每个转置卷积层的输出连接到两个不同的层** : (1)用于在级别 s 重构残差图像的卷积层,以及 (2)用于在更精细级别 s +1 提取特征的卷积层。**
  • ****较低级别的特征表示与较高级别共享,因此可以增加网络的非线性以使在更精细的级别学习复杂映射

2.2.图像重建

  • ****在级别 s ,输入图像通过转置卷积(上采样)层以 2 的比例上采样。这一层用双线性内核初始化。
  • ****上采样图像然后与来自特征提取分支的预测残差图像组合(使用逐元素求和)以产生高分辨率输出图像。
  • 级别 s 的输出 HR 图像然后被馈送到级别 s +1 的图像重建分支。

3. LapSRN: Charbonnier 损失函数

随着

  • LapSRN 不使用标准的 MSE 损失函数,而是使用上述损失函数。这个ρ函数是 Charbonnier 罚函数(l1 范数的可微变体),它对于处理异常值是稳健的。
  • N :一批样品数, L ,金字塔级数, ε 设为 1e-3。
  • 这种深度监督指导网络训练预测不同级别的子带残差图像产生多尺度输出图像
  • 8 倍模型可以在一个前馈通道中产生 2 倍、4 倍和 8 倍的超分辨率结果。
  • 上述拉普拉斯金字塔网络体系结构和 Charbonnier 损失函数被用在 LapSRN 和 MS-LapSRN 中。

4. MS-LapSRN:参数共享

4.1.跨金字塔等级的参数共享

Parameter Sharing ACROSS Pyramid Levels

  • 正如我们在图中看到的,特征嵌入子网络、上采样层和残差预测层的参数在所有金字塔等级上共享。
  • 因此,网络参数的数量与上采样尺度无关。

4.2.金字塔等级内的参数共享

Parameter Sharing WITHIN Pyramid Levels Using Recursive Blocks for the Feature Embedding Subnetwork

  • ****特征嵌入子网具有 R 递归块每个递归块都有 D 个不同的卷积层,控制整个模型中参数的数量。
  • 预激活结构( 预激活 ResNet )但没有批处理规范化层被用于递归块中。
  • 因此,总深度变为:
depth = (D × R + 1) × L + 2;
L = log2(S)
  • S 是上采样比例因子。
  • 括号中的 1 表示转置的卷积层。
  • 末尾的 2 表示应用于输入图像的第一个卷积层和应用于残差的最后一个卷积层。
  • 因此,使用深度递归层来扩展特征嵌入子网络,以在不增加参数数量的情况下有效地增加网络深度。****

5。MS-LapSRN:本地剩余学习(LRL)

Different Kinds of Local Residual Learning (LRL)

  • 由于 LRL 是一种有效的成分,MS-LapSRN 还测试了如上所示的不同变体。
  • (a) LapSRN_NS :无跳跃连接。
  • (b) LapSRN_DS :使用与前一输出的跳过连接作为源输入,即不同源跳过连接。
  • (c) LapSRN_SS :使用跳过连接,将最开始的输出作为源,即共享源跳过连接。

6。MS-LapSRN:多尺度训练

  • ****使用多尺度夏邦尼损失
  • 比如说 3 级 LapSRN,所有 3 个音阶的 Charbonnier 损失加起来就是总损失。
  • 要注意的是,这里的比例增加被限制在老 2^n×。不支持任意的上采样率。

7。消融研究

7.1.一些细节

  • 除了应用于输入图像的第一层、用于预测残差的层和图像上采样层之外的所有卷积层中的 64 个滤波器。
  • 卷积和转置卷积层的滤波器大小分别为 3×3 和 4×4。
  • 使用斜率为 0.2 的泄漏 ReLUs。
  • 训练集:291 幅图像,其中 91 幅来自杨,200 幅来自 Berkeley 分割数据集。
  • 批次大小为 64,HR 面片的大小裁剪为 128×128。
  • 一个时期有 1000 次迭代。
  • 数据扩充:(1)通过在[0.5,1.0]之间随机缩小图像进行缩放。(2)任意旋转 90 度、180 度或 270 度。(3)概率为 0.5 的随机水平翻转。
  • LR 训练面片由双三次下采样生成。
  • 使用 MatConvNet 工具箱。

7.2.金字塔结构

LapSRN with Different Components (Here, residual learning is talking about GRL or the image reconstruction branch, not LRL)

LapSRN with Different Components (Here, GRL is the image reconstruction branch, not LRL)

  • 这里,网络使用了 10 个卷积层,测量了 4× SR 的 Set14 上的 PSNR。
  • 与没有金字塔结构的网络(即类似于 FSRCNN )(棕色)的网络)相比,金字塔结构导致了相当大的性能提高,在 SET5 上提高了 0.7 dB,在 SET14 上提高了 0.4 dB。

7.3.全球剩余学习(GRL)

  • ****去除图像重建分支,直接预测各级 HR 图像(蓝色)。
  • ****蓝色曲线收敛缓慢,训练时波动较大。
  • 另一方面,全 LapSRN(红色)在 10 个 epoches 内胜过** SRCNN **

7.4.Charbonnier 损失函数

  • ****使用常规 L2 损失函数(绿色)的 LapSRN 比使用夏邦尼尔损失函数(红色)的 LapSRN 差

7.5.跨金字塔等级的参数共享

Parameter Sharing Across Pyramid Levels for 4× SR model

  • LapSRN 4×模型有 812k 参数。
  • 通过跨金字塔等级共享参数,参数的数量减少到 407k** 。**
  • 在没有 LRL 的情况下,这个模型有 10 个卷积层( D ) )和 1 个递归块( R ) ,称为 LapSRN_NS-D10R1
  • LapSRN_NS-D10R1 在使用一半网络参数的情况下,取得了与 LapSRN 不相上下的性能。

7.6.金字塔等级内的参数共享

  • LapSRN_NS-D5R2LapSRN_NS-D2R5 一起,模型也共享金字塔内的参数,分别具有 222k 和 112k 参数。但是,性能下降。****
  • 这是,因为在金字塔等级中没有使用 LRL** 。**

7.7.本地剩余学习(LRL)

Different Kinds of Local Residual Learning (LRL) Using LapSRN-D5R5 on Set5 for 4× SR

Different Kinds of Local Residual Learning (LRL) Using Different Models on URBAN100 for 4× SR

  • 如图和表所示,使用共享源的 LapSRN_SS 具有最高的 PSNR。

7.8.D 和 R 研究

Study of D and R

Study of D and R

  • 测试不同的 DR 值。
  • D2R5、D5R2 和 D10R1 表现不相上下。
  • D4R8 在网络深度大于 80 的情况下,重建精度最好。

7.9.多尺度训练

  • MS-LapSRN 支持多尺度训练,训练样本尺度组合为{2×} 、{4×} 、{8×} 、{2×、4×、{2×、8×、{4×、8×}和{2×、4×、8×}。
  • 用多尺度{2×,4×,8×}训练的 MS-LapSRN 产生最好的结果。

8.与最先进结果的比较****

8.1.SSIM PSNR 国际金融公司

Quantitative Results

  • 测试了五个数据集:Set5,Set14,BSDS100,URBAN100,MANGA190。
  • LapSRN_SS-D5R2 的深度与 VDSR 、 DRCN 和 LapSRN 相似。
  • LapSRN_SS-D5R5 与 DRRN 深度相同。
  • LapSRN_SS-D5R8 对于 4× SR 有 84 层。
  • MS 表示使用{2×,4×,8×}的等级进行多等级训练。
  • LapSRN 尤其在 4 倍和 8 倍 SR 上表现良好。
  • LapSRN 不使用任何 3 个 SR 样本进行训练,但仍然生成与 DRRN 相当的结果。

8.2.定性结果

4× SR on BSDS100, URBAN100 and MANGA109

8× SR on BSDS100, URBAN100 and MANGA109

  • 如上图, MS-LapSRN 精确重建平行直线、网格图案、文字。
  • 在 8× SR 的情况下,那些使用双三次预上采样或使用一步上采样的现有技术不能很好地超分辨精细结构。

8.3.执行时间

4× SR on URBAN100

  • 使用了 3.4 GHz 英特尔 i7 CPU (32G RAM)和 NVidia Titan Xp GPU (12G 内存)。
  • SRCNN 和 FSRCNN 原本在 CPU 上,但被作者为 GPU 重建。
  • 对于 URBAN100 上的 4× SR, MS-LapSRN-D5R2 比除了fsr CNN之外的所有现有方法都要快。****
  • MS-LapSRN-D5R8 胜过DRRN

2×, 4× and 8× SR

  • SRCNN 和 VDSR 复杂度取决于输出图像大小。对于 4×和 8× SR,它们的运行时间比 MS-LapSRN 增加得更多。
  • 虽然 FSRCNN 速度最快,但 MS-LapSRN 的 SR 质量要高得多。

8.6.模型参数

4× SR on URBAN100

  • MS-LapSRN 的参数比 LapSRN 少约 73%,比VDSR少约 66%,比【DRCN少约 87%,比DRRN少约 25%。

8.7.真实世界的照片(JPEG 压缩伪像)

4× SR

  • MS-LapSRN 重建出更清晰更精确的图像。

8.8.与 LAPGAN 的比较

LAPGAN ARchitecture

Comparison with LAPGAN

  • 作者还与拉普根进行了比较。
  • LAPGAN 最初的目的不是为了超分辨率。它是一个用于图像纹理合成的生成式图像模型。在这里,作者使用与 LapSRN 相同的训练数据和设置来训练 LAPGAN。
  • 最后,LapSRN 表现更好。

8.9.对抗训练

4× SR

  • LapSRN 被扩展为一个生成网络,并使用 DCGAN 的鉴别器建立了一个鉴别网络。
  • 具有对抗训练的网络生成关于不规则结构区域的更可信的细节,例如草和羽毛。

8.10 限制

8× SR Failure Case

  • LapSRN 可为较大的上采样比例(例如 8 倍)生成清晰锐利的 HR 图像,它不会“幻觉”精细的细节。

渐进上采样让我想到了对象检测的渐进去卷积或上采样方法(如 DSSD 、 FPN 、 RetinaNet )或语义分割(如去卷积)。

参考

【2017 CVPR】【LapSRN】
深度拉普拉斯金字塔网络快速精确超分辨率
& 补充材料

【2018 TPAMI】【MS-LapSRN】
深度拉普拉斯金字塔网络快速准确的图像超分辨率

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(们)(还)(不)(想)(到)(这)(些)(人)(们)(,)(我)(们)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(们)(还)(没)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(里)(去)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(里)(去)(了)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(到)(这)(里)(来)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC

语义切分 FCNde convnetdeeplab v1&deeplab v2parse net】dilated netPSP netdeeplab v3

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet

实例分割
[深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度】: 【解析度: 解析度: 【解析度】: 【解析度】: 【解析度: 解析度: 【解析度】: 【解析度】: 【解析度: 解析度: 解

综述:FCN——多级多递归输入全卷积网络(生物医学图像分割)

原文:https://towardsdatascience.com/review-m²fcn-multi-stage-multi-recursive-input-fully-convolutional-networks-biomedical-image-4f8d5e3f07f1?source=collection_archive---------10-----------------------

在 EM 图像分割方面优于 U-Net 和 CUMedVision1

Neuronal Structure Segmentation: An EM Image (Left), the Ground Truths for its Neuronal Boundary Detection Result (Middle), and Segmentation Result (Right)

在这个故事中,简单回顾了M·FCN(多级多递归输入全卷积网络),作者上海大学约翰·霍普金斯大学。发表于 2017 ICCV 。( Sik-Ho Tsang @中)

概述

  1. 问题和贡献
  2. 米 FCN 模型建筑
  3. 消融研究
  4. 与最先进方法的比较

1。问题和贡献

在分割电子显微镜(EM)图像方面有三个主要挑战:

  1. 膜的厚度变化很大,薄如细丝,厚如水滴。
  2. 电磁采集的噪声使得膜的对比度很低,导致一些膜的边界甚至看不见。
  3. 混杂结构的存在,如线粒体和囊泡,也增加了膜检测的难度。

本文的主要贡献包括:

  1. 端到端的多级网络架构,其中每一级通过对不同级别施加监督来产生多个边输出,并将它们作为多个递归输入馈入下一级。
  2. 使用多个递归输入而不是单个递归输入不仅可以提高神经元边界检测的性能,而且在生物学上也是合理的。
  3. 该网络在两个公开可用的 EM 分割数据集上取得了有希望的结果

2。M FCN 模型架构

The Proposed M²FCN Architecture

2.1.体系结构

  • 一个整体嵌套边缘检测器(HED)网络作为默认子网,由 VGG-16 网络转换而来。
  • 共有 5 个级别,步长分别为 1、2、4、8 和 16,感受野大小分别为 5、14、40、92、196
  • 在每个阶段内,每个子网由多个层次组成,每个层次由一个卷积层、一个 ReLU 层和一个最终池层的若干组合组成。
  • 每侧输出层连接到每级的最后一个卷积层,由 1×1 卷积层和解卷积层组成,保证每侧输出的分辨率与输入的原图像相同。
  • 在【0,1】范围内,每个侧输出层应用一个 s 形层。

2.2.训练阶段

  • 因此, m 级的输入 X^(m 为:

  • 其中 X 是输入图像,那些 S 是第 1 到第 n 级的第( m -1)级的侧输出,⨁是沿信道维度的级联。
  • 单侧输出的交叉熵损失函数:

  • 其中|B|和|B(bar)|分别是边界和非边界地面真值标签集,β=|B(bar)|/|B|,以实现正/负类平衡权重来消除由于不平衡类引起的偏差。
  • 所有侧输出 Ls 的损失函数为:

  • 此外, m 级有一个保险丝输出:

  • 其中 h 为融合重量。与上面类似, m 级融合输出的类平衡损失函数为:

  • 所有熔断输出 Lf 的损失函数为:

  • 反向传播使 LsLf 最小化:

  • 为了训练上述级联网络,首先,训练单级网络。然后初始化为第一级网络,其余随机初始化。

3。消融研究

3.1.评估指标

  • Rand 合并分数(左)和 Rand 分割分数(右):

  • 其中 nij 表示建议分割的第 i 段和基础事实分割的第 j 段中体素的数量。

  • 然后使用 Rand 合并分数和 Rand 分割分数将 Rand F 分数用作评估指标

3.2.替代网络设计

  • AD_I :仅 1 级,作为基线
  • AD_II 到 ADVI : 2 个阶段,4 级(较小的感受野)对 5 级(较大的感受野),逐级对端到端,单递归对多递归,以便通过表格中的相互比较来显示每个项目的贡献。
  • AD_VIII :提议作为终网的那个,比 AD_I 到 AD_VI 都强。

Qualitative Results for 1-stage, 2-stage and 3-stage Network

  • 红色箭头表示假阳性被更多阶段抑制。

4.与最先进方法的比较

4.1.小鼠梨形皮质 EM 数据集

Mouse Piroform Cortex EM dataset

  • 有三个阶段的 FCN 是最好的。

Precision (Rand Merge) Recall (Rand Split) Curves

  • 即使在高召回率的情况下,M FCN 也能达到高精度。

Qualitative Results: Original Images (Left), Ground-Truth Label Maps (2nd Left), Predicted Boundary Maps (2nd Right), Predicted Label Maps (Right)

4.2.ISBI 2012 EM 分段数据集

ISBI 2012 EM Segmentation Dataset

  • M FCN 胜过 U-Net 和 CUMedVision1 。
  • 此外, M FCN 使用 VGGNet 作为主干,其性能与使用 ResNet 作为主干的 PolyMtl 和 FusionNet 类似
  • 作者认为,如果 FCN 人变得更有骨气,他们会有更好的结果。

参考

【2017 ICCV】【M·FCN】
用于神经元边界检测的多级多递归输入全卷积网络

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(没)(有)(什)(么)(好)(的)(情)(情)(感)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [TDM][SSD][DSSD][yolo v1][yolo v2/yolo 9000][yolo v3][FPN][retina net[DCN]

语义切分 FCNde convnetdeeplabv 1&deeplabv 2CRF-RNN】SegNet】parse netdilated netDRNRefineNet

生物医学图像分割 [ 累计视觉 1 ] [ 累计视觉 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net]

实例分割 [SDS][Hypercolumn][deep mask][sharp mask][multipath net][MNC][Instance fcn[FCIS]

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

【DeepPose】【汤普森 NIPS'14】【汤普森 CVPR'15】

回顾:最大输出网络(图像分类)

原文:https://towardsdatascience.com/review-maxout-network-image-classification-40ecd77f7ce4?source=collection_archive---------18-----------------------

作者:伊恩·j·古德菲勒,大卫·沃德-法利,迈赫迪·米尔扎,亚伦·库维尔,约舒阿·本吉奥

The book “Deep learning

在这个故事中,对蒙特利尔大学Maxout 网络进行了简要回顾。第一作者 Ian J. GoodFellow ,也是生成对抗网络(GAN)的发明者。而最后一位作者 Yoshua Bengio ,今年(2019)刚刚拿到了最近的图灵奖,也就是“计算的诺贝尔奖”。这两位作者加上倒数第二位作者亚伦·库维尔,三位作者一起,还出版了本书 深度学习,通过出版社 MIT Press,于 2016 年出版。而本文针对 maxout 网络,发表在 2013 ICML 上,引用超过 1500 次。( Sik-Ho Tsang @中)

概述

  1. 最大输出
  2. 关于 NIN 中 Maxout 的解释
  3. 结果

1.最大输出

An MLP containing two maxout units

  • 给定一个输入 x ,或隐藏层的状态 vz 为:

  • 并且使用了一种新型的激活功能:

  • 最后 g 是:

  • 背后的理念是:

任何连续的 PWL 函数都可以表示为两个凸 PWL 函数的差。

  • 任何连续函数都可以用分段线性函数任意逼近。
  • 并且可以通过具有两个隐藏单元 h1 ( v )和 h2 ( v )的 maxout 网络来实现,具有足够大的 k
  • 并且发现一个两隐单元 maxout 网络可以很好地逼近紧域上任意连续函数 f ( v )。****

2.中最大输出的解释

  • 由于 NIN 在实验结果部分与 Maxout 进行了深入的比较, NIN 也为 Maxout 网络做了一点说明。
  • ****通过仿射特征图的最大池化减少了特征图的数量(仿射特征图是线性卷积的直接结果,没有应用激活函数)。
  • 线性函数上的最大化使得分段线性逼近器能够逼近任何凸函数。
  • 最大输出网络更有效,因为它可以分离位于凸集内的概念。
  • 然而,最大输出网络强加了潜在概念的实例位于输入空间的凸集中的先验,这不一定成立。

3。结果

3.1.MNIST

Test error on permutation invariant MNIST

  • MNIST (LeCun 等人,1998 年)数据集由手写数字 0-9 的 28×28 像素灰度图像组成,有 60,000 个训练样本和 10,000 个测试样本。
  • 最后 10,000 个训练样本用作验证集。
  • 训练由两个密集连接的最大输出层和跟随其后的 softmax 层组成的模型。
  • 获得了 0.94%的测试误差,这是不使用无监督预训练的最好结果。

Test error on MNIST

  • 使用三个卷积最大输出隐藏层(在最大输出层之上具有空间最大汇集),其后是密集连接的 softmax 层。
  • 测试集错误率为 0.45%,这是最好的结果。

3.2.CIFAR-10

Test error on CIFAR-10

  • CIFAR-10 数据集(Krizhevsky & Hinton,2009 年)由 32 × 32 幅彩色图像组成,这些图像来自 10 个类别,分为 50,000 幅训练图像和 10,000 幅测试图像。
  • 所使用的模型由三个卷积最大输出层、全连接最大输出层和全连接 softmax 层组成。
  • 测试集误差为 11.68%。
  • 通过数据扩充,即平移和水平反射,获得了 9.38%的测试集误差。

  • 借助 dropout,CIFAR-10 上的验证集误差降低了 25%以上。

3.3.西发尔-100

CIFAR-100

Test error on CIFAR-100

  • CIFAR-100 (Krizhevsky & Hinton,2009 年)数据集的大小和格式与 CIFAR-10 数据集相同,但包含 100 个类,每个类的标记示例数只有后者的十分之一。
  • 测试误差为 38.57%。

3.4.街景门牌号(SVHN)

Test error on SVHN

  • 每幅图像的大小为 32×32,任务是对图像中心的数字进行分类。
  • 在训练集中有 73,257 个数字,在测试集中有 26,032 个数字,以及 531,131 个额外的、难度稍低的示例,用作额外的训练集。
  • 从训练集中选择每类 400 个样本,从额外集中选择每类 200 个样本。训练和额外集合的剩余数字用于训练。
  • 所使用的模型包括三个卷积 maxout 隐藏层和一个密集连接的 maxout 层,后面是一个密集连接的 softmax 层。
  • 获得了 2.47%的测试误差。

通读这篇论文,看看作者如何利用神经网络来实现上述命题是很有趣的。在文章的最后,我们还对 Maxout 网络相对于其他激活函数(如 Tanh 或 ReLU)的消融进行了研究。

参考

【2013 ICML】【Maxout】
Maxout 网

我以前的评论

)(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(我)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(我)(们)(都)(不)(在)(这)(些)(事)(上)(了)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(不)(会)(想)(到)(这)(些)(事)(了)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(上)(,)(她)(们)(们)(还)(是)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(,)(她)(们)(还)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(们)(还)(没)(有)(什)(么)(情)(情)(感)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [G-RMI][TDM][SSD][DSSD][约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3[FPN[视网膜网[DCN

语义切分 FCNde convnetdeeplabv 1&deeplabv 2CRF-RNN】SegNet】parse netdilated netDRNRefineNet

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN

实例分割 [ SDS ] [ 超列 ] [ 深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

【DeepPose】【汤普森 NIPS'14】【汤普森 CVPR'15】

回顾:跨国公司—多任务网络级联,2015 年 COCO 细分赢家(实例细分)

原文:https://towardsdatascience.com/review-mnc-multi-task-network-cascade-winner-in-2015-coco-segmentation-instance-segmentation-42a9334e6a34?source=collection_archive---------15-----------------------

三个阶段:区分实例、估计掩码和对对象进行分类。

T 他的时间,被微软研究院命名为 MNC(多任务网络级联)的时间,即将被回顾。该模型由三个网络组成,分别为区分实例估计掩码、以及分类对象。这些网络形成一个级联结构,并被设计来共享它们的卷积特征。

跨国公司在 2015 年可可细分挑战中获得第一名。载于 2016 CVPR 号,引用文献 300 余篇。(植荷曾 @中)

保险范围是什么

  1. 多任务网络级联(MNC)架构(3 个阶段)
  2. 多级级联(5 级)
  3. 结果

1。多任务网络级联架构

Multi-task Network Cascades (MNC) Architecture

这里有三个阶段 : 提出盒级实例回归掩码级实例如上分类每个实例

进入各阶段前,通过 VGG16 得到卷积特征图。所有阶段都共享这些卷积特征映射。

1.1.回归盒级实例

第一阶段,本阶段网络结构及损耗函数沿用 中的区域方案网络**** 卷积运算。

在共享特征的基础上,使用 3×3 卷积层进行降维,随后是两个同级 1×1 卷积层,用于回归盒子位置和分类对象/非对象。该损耗函数作为第 1 阶段的损耗项 L1 :

其中 B 为本级网络输出。 Bi 是由 i 索引的盒子。方框 Bi 以( xi、伊)为中心,宽度 wi 和高度 hi ,其中 pi 为目标概率。

1.2.回归遮罩层实例

第二阶段采用共享卷积特征和阶段 1 盒作为输入。它为每个框建议输出像素级分割掩码。在这个阶段,掩码级实例仍然是类不可知的。

给定阶段 1 预测的盒子,在盒子上执行 14×14 大小的 ROI 合并两个额外的全连接(fc)层应用于每个盒子的该特征。第一个 fc 层(使用 ReLU)将尺寸减少到 256 ,随后是第二个 fc 层,它回归出一个m×m(m= 28)像素式蒙版。该掩码对基础真掩码进行二元逻辑回归,作为阶段 2 的损失项L2;****

其中 M 为本级网络输出。与 DeepMask 相比,MNC 只从几个提出的盒子中回归掩膜,从而降低了计算成本。

1.3.分类实例

第三阶段采用共享卷积特征、阶段 1 盒子和阶段 2 掩码作为输入。它输出每个实例的类别分数。

给定阶段 1 预测的方框,我们还通过 RoI 合并提取特征。然后,该特征图被阶段 2 屏蔽预测“屏蔽”。这导致聚焦于预测遮罩前景的特征。

被屏蔽的特征由元素式乘积给出。 FROI 是 ROI 合并后的特征。 M 是从阶段 2 得到的掩模预测。

  • 被掩蔽的特征 FMask 上应用两个 4096-d fc 层。这被称为基于面具的途径
  • 并且 RoI 汇集特征直接馈入两个 4096-d fc 层并形成基于盒的路径
  • 基于遮罩和基于盒子的路径被连接
  • 在拼接的顶部,使用 N +1 路的 softmax 分类器来预测 N 个类别加上一个背景类别。盒子级路径可以解决特征大部分被屏蔽级路径屏蔽的情况(例如,在背景上)。损失条款L3:

其中 C 是这个阶段的网络输出,它是所有实例的类别预测列表。

网络的丢失变成:

2。多级级联(5 级)

5-stage MNC

首先,运行整个三阶段网络,并获得第三阶段的回归盒。然后,这些方框被视为新提案。第二阶段和第三阶段是对这些建议的第二次执行。这实际上是 5 阶段推理。

3.结果

3.1.帕斯卡 VOC 2012

Ablation experiments on PASCAL VOC 2012 validation.

  • 使用 VGG16 提取特征,但不共享阶段间特征:60.2%地图。
  • 分享特色 : 60.5%地图。
  • 3 阶段端到端培训 : 62.6% mAP。
  • 5 级 : 63.5%地图。

Comparison on PASCAL VOC 2012 validation for Instance Segmentation.

  • MNC 在 0.5 和 0.7 的不同 IoU 阈值上获得最高 mAP 。在最先进的方法中,推理时间也是最短的。

Detailed Inference Time Per Image on Nvidia K40 GPU.

  • 最耗时的部分是 VGG16 特征提取(conv)部分。

Evaluation of (box-level) object detection

  • 由于盒子也可以由 MNC 预测,所以对盒子级别的对象检测进行评估。
  • MNC 使用 2007 trainval+test 和 2012 trainval 的联合作为训练,获得了 75.9%的最高 mAP,大大优于快速 R-CNN 和快速 R-CNN 。

3.2.可可女士

Segmentation result (%) on the MS COCO test-dev set.

  • 以 VGG16 为骨干进行特征提取,得到了 19.5% mAP @ 0.5 和 39.7% mAP@0.5。
  • 使用 ResNet-101 作为特征提取的骨干,得到了更高的 mAP,即 24.6% mAP @ 0.95 和 44.3% mAP@0.5。
  • 通过全局上下文建模多尺度测试集合,最终获得 28.2% mAP@[.5:.95]和 51.5% mAP@0.5 的成绩,获得 COCO 分割赛道第一名

3.3.定性结果

PASCAL VOC 2012 Validation Set

MS COCO Test-Dev Set

有关于可区分的 ROI 扭曲层的细节,也有网络设置的细节。这里我还没有提到。如果有兴趣,请访问该文件。

参考

【2016 CVPR】【MNC】
经由多任务网络级联的实例感知语义分割

我的相关评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-NetR-FCN】离子多路yolov 1

语义切分 [FCN][de convnet][deeplab v1&deeplab v2][parse net][dilated net][PSPNet]

实例分割 深度遮罩锐度遮罩多路径

回顾:MobileNetV2 —轻量模型(图像分类)

原文:https://towardsdatascience.com/review-mobilenetv2-light-weight-model-image-classification-8febb490e61c?source=collection_archive---------1-----------------------

胜过 MobileNetV1 、纳斯网和 ShuffleNet V1

MobileNetV2 for Mobile Devices

在这个故事中,对 GoogleMobileNetV2 做一个简单的回顾。在前一版本 MobileNetV1 中,引入了深度方向可分离卷积,大大降低了网络的复杂度成本和模型规模,适用于移动设备或任何计算能力较低的设备。在 MobileNetV2 中,引入了一个更好的模块,带有反向剩余结构此次去除了窄层中的非线性。使用 MobileNetV2 作为特征提取的主干,还可以在对象检测和语义分割方面实现一流的性能。这是一篇 2018 CVPR 的论文,引用超过 200 次。( Sik-Ho Tsang @中)

概述

  1. MobileNetV2 卷积块
  2. 整体架构
  3. 消融研究
  4. 实验结果

1。MobileNetV2 卷积块

1.1. MobileNetV1

  • 在 MobileNetV1 中,有 2 层。
  • 第一层被称为深度方向卷积,它通过对每个输入通道应用单个卷积滤波器来执行轻量级滤波。
  • 第二层是一个 1×1 卷积,称为逐点卷积,负责通过计算输入通道的线性组合来构建新的特征。
  • ReLU6 此处用于对比。(实际上,在 MobileNetV1 的技术报告中,我找不到他们使用 ReLU6 的任何暗示……也许我们需要检查 Github 中的代码……),即 min(max( x ,0),6) 如下:

ReLU6

  • 基于[27] MobileNetV1,ReLU6 因其在用于低精度计算时的稳健性而被使用。

1.2.MobileNetV2

  • 在 MobileNetV2 中,有两种类型的块。一个是步长为 1 的剩余块。另一个是步长为 2 的块,用于缩小尺寸。
  • 两种类型的砌块都有 3 层。
  • 这次的第一层是和 ReLU6 的 1×1 卷积。
  • 第二层深度方向卷积
  • 第三层是另一个 1×1 卷积,但是没有任何非线性。据称,如果再次使用 ReLU,深度网络仅在输出域的非零体积部分上具有线性分类器的能力。

  • 而且还有一个膨胀系数 t 。对于所有主要实验, t =6。
  • 如果输入得到 64 个通道,内部输出将得到 64× t =64×6=384 个通道。

2.整体架构

MobileNetV2 Overall Architecture

  • 其中 t :扩展因子, c :输出通道数, n :重复次数,s:步距。3×3 核用于空间卷积。
  • 通常情况下,主网络(宽度乘数 1, 224×224 ),计算成本为 3 亿次乘加,使用340 万个参数。(宽度乘数在 MobileNetV1 中介绍。)
  • 对于从 96 到 224 的输入分辨率和从 0.35 到 1.4宽度乘数,进一步探索了性能折衷。
  • 网络计算成本高达 585M MAdds,而模型大小在 1.7M 和 6.9M 参数之间变化。
  • 为了训练网络,使用 16 个 GPU,批量大小为 96。

Number of Maximum Channels/Memory in Kb) at Each Spatial Resolution for Different Architecture with 16-bit floats for activation

3.消融研究

3.1.线性瓶颈的影响

  • 随着每个瓶颈模块输出端 ReLU6 的移除,精确度得到了提高。

3.2.捷径的影响

  • 瓶颈之间的快捷方式,它优于扩展之间的快捷方式和没有任何剩余连接的快捷方式。

4.实验结果

MobileNetV2 for Classification, Detection and Segmentation (From https://ai.googleblog.com/2018/04/mobilenetv2-next-generation-of-on.html)

4.1.ImageNet 分类

ImageNet Top-1 Accuracy

  • 在模型大小和计算成本相当的情况下,MobileNetV2 优于 MobileNetV1 和 ShuffleNet (1.5)。
  • 宽度乘数为 1.4,MobileNetV2 (1.4)比 ShuffleNet (×2),和 NASNet 推理时间更快。

  • 如上所示,使用了不同的输入分辨率和宽度乘数。它的表现一直优于 MobileNetV1。

4.2.MS COCO 对象检测

SSDLite

  • 首先,SSDLite 是通过用深度方向可分离的卷积( MobileNetV1 one)修改 SSD 中的规则卷积而引入的。
  • SSDLite 极大地减少了参数数量和计算成本。

MS COCO Object Detection

  • MobileNetV2 + SSDLite 以明显更少的参数和更小的计算复杂度实现了具有竞争力的准确性。
  • 并且推理时间比 MobileNetV1 快。
  • 值得注意的是,MobileNetV2 + SSDLite 的效率提高了 20 倍,体积缩小了 10 倍,但在 COCO 数据集上仍优于 YOLOv2。

4.3. PASCAL VOC 2012 语义分割

PASCAL VOC 2012 Validation Set

  • 这里,MobileNetV2 用作 DeepLabv3 的特征提取器。
  • 通过禁用阿特鲁空间金字塔池(ASPP)以及多尺度和翻转(MP),也将输出步幅从 8 改变为 16,获得了 75.32%的 mIOU,模型大小和计算成本低得多。

参考

【2018 CVPR】【MobileNetV2】
MobileNetV2:逆残差和线性瓶颈

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(有)(什)(么)(情)(况)(呢)(?)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(是)(这)(些)(人)(,)(还)(没)(有)(什)(么)(好)(的)(情)(感)(,)(我)(们)(还)(没)(有)(什)(么)(好)(的)(情)(感)(,)(但)(我)(们)(还)(没)(有)(什)(么)(好)(好)(的)(情)(感)(。 )(我)(们)(都)(不)(想)(要)(让)(这)(些)(人)(都)(有)(这)(些)(情)(况)(,)(我)(们)(还)(不)(想)(要)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(就)(是)(这)(些)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(。 )(我)(们)(都)(不)(知)(道)(,)(我)(们)(都)(是)(很)(强)(的)(,)(我)(们)(都)(是)(很)(强)(的)(对)(对)(对)(对)(起)(来)(,)(我)(们)(都)(是)(很)(强)(的)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(对)(

物体检测 [ 过食 ] [ R-CNN ] [ 快 R-CNN ] [ 快 R-CNN][MR-CNN&S-CNN][DeepID-Net][CRAFT][R-FCN][离子 [G-RMI][TDM][SSD][DSSD][yolo v1][yolo v2/yolo 9000][yolo v3][FPN[retina net[DCN

语义切分[FCN][de convnet][deeplabv 1&deeplabv 2][CRF-RNN][SegNet][parse net][dilated net][DRN][RefineNet][

生物医学图像分割[cumevision 1][cumevision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN]

实例分段 SDS Hypercolumn DeepMask SharpMask MultiPathNet MNC InstanceFCN FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

人体姿态估计深度姿态汤普森·尼普斯 14汤普森·CVPR 15CPM

综述:MR-CNN 和 S-CNN——多区域语义感知 CNN(目标检测)

原文:https://towardsdatascience.com/review-mr-cnn-s-cnn-multi-region-semantic-aware-cnns-object-detection-3bd4e5648fde?source=collection_archive---------15-----------------------

利用多区域特征和语义分割特征进行目标检测

PASCAL VOC 2012 Dataset

在这个故事中,回顾了巴黎东方大学使用 MR-CNN & S-CNN 的物体检测方法。提出了两条卷积神经网络(CNN)路径:

  • 多区域 CNN (MR-CNN) :使用多个区域捕捉一个对象的几个不同方面的对象表示。
  • 分割感知 CNN (S-CNN) :语义分割信息也被用来提高对象检测的准确性。

此外,还提出了细化包围盒的定位机制。而这是一篇 2015 ICCV 论文,有超过 200 篇引用。( Sik-Ho Tsang @中)

概述

  1. 多区域 CNN (MR-CNN)
  2. 分段感知 CNN (S-CNN)
  3. 物体定位
  4. 迭代定位机制
  5. 结果

1。多区域 CNN (MR-CNN)

Multi-Region CNN (MR-CNN)

1.1.网络体系结构

  • 首先,输入图像通过激活图模块,如上所示,并输出激活图。
  • 使用选择性搜索生成区域提议或边界框候选。
  • 对于每个候选包围盒 B ,生成一组区域{ Ri },其中 i =1 到 k,,这就是为什么它被称为多区域。下一小节将详细介绍多区域选择。
  • 在每个区域适配模块中,对每个区域 Ri 执行 ROI 合并,合并或裁剪的区域经过完全连接的(FC)层。
  • 最后,来自所有 FC 层的输出被连接在一起以形成 1D 特征向量,该向量是边界框 B 的对象表示。
  • 这里使用的是 VGG-16 ImageNet 预训练模型。移除最后一个 conv 图层后的最大池化图层。

1.2.区域组件

Regions Used in Multi-Region CNN

  • 区域有两种类型:矩形((a)-(f))矩形圆环((g)-(j)) ,如上图。
  • 原盒(a):R-CNN 中使用的那个。
  • 半框,(b)-(e) :这些区域旨在使对象表示相对于遮挡更加健壮。
  • 中心区域,(f)-(g) :这些区域是为了使物体表现较少受到它旁边的其他物体或其背景的干扰。
  • 边界区域,(h)-(i) :这些区域旨在使对象表示对不准确的定位更加敏感。
  • 上下文区域(j) :该区域聚焦围绕对象的上下文外观。
  • 使用这些区域有帮助的原因有两个。
  • 被屏蔽区域被设置为零。

区别特征多样化

  • 这有助于使整体识别模型捕获的区别因素多样化。此处进行消融研究的模型 A 使用(A)和(I ),模型 B 使用(A)和与(A)尺寸相同的改良(I)。在 PASCAL VOC 2007 测试集上,模型 A 得到 64.1%的 mAP,模型 B 得到 62.9%,比模型 A 低 1.2 个百分点。

本地化感知表示

  • 对于给定的候选检测框,多区域的使用对每种类型的区域上允许的可视内容施加了软约束。

2。分段感知 CNN (S-CNN)

Multi-Region CNN (MR-CNN) Extended with Segmentation-aware CNN (S-CNN)

  • 分割和检测之间有着密切的联系。和分割相关的线索通常有助于对象检测。
  • 增加了两个模块:支持语义分割特征的激活图模块支持语义分割特征的区域自适应模块。
  • 这里没有用于训练的附加注释。
  • FCN 用于激活地图模块。
  • 最后一个 FC7 层通道数从 4096 更改为 512。

Bounding Box (Left), Segmentation Mask Based on Bounding Box (Middle), Foreground Probabilities (Right)

  • 使用弱监督训练策略。使用边界框注释创建人工前景特定类别分割掩模。
  • 更具体地说,图像的地面真实边界框被投影到 FCN 的最后一个隐藏层的空间域上,位于投影框内的“像素”被标记为前景,而其余的被标记为背景。
  • 在使用掩码训练 FCN 之后,最后一个分类层被删除。只有剩余的 FCN 被使用。
  • 尽管它是弱监督训练,如上所示的前景概率仍然携带一些信息,如上所示。
  • 使用的边界框比原始边界框大 1.5 倍。

3。物体定位

3.1.用于包围盒回归的 CNN 区域适应模块

  • 训练额外的区域适应模块来预测对象边界框。
  • 它由两个隐藏的 FC 层和一个预测层组成,每个类别输出 4 个值(即边界框)。
  • 将候选框放大 1.3 倍提供了显著的提升。

3.2.迭代定位

  • Bt_c :类 c 和图像 X 迭代 t 生成的 Nc,t 包围盒集合。
  • 一开始, t =1,建议 B0_c 通过选择性搜索产生。
  • 对于从 t=1 开始的每次迭代,…,T, Bt_c 被更新。T=2 通常就足够了。

3.3.包围盒投票

  • 在迭代定位之后,执行包围盒投票。
  • 最后一次迭代 T 后,从 t =1 到 t = T 的候选检测{ Dt_c }合并形成 D_cD_c = { st_i,cBt_i,c }其中 s 为分类得分, B 为对应的边界框。
  • 首先,非最大抑制(NMS)应用于 D_c ,使用 0.3 的 IoU 阈值,并产生检测 Y_c
  • 然后基于权重执行进一步的细化:

  • 权重 w =max(0, s ),其中 s 为分类分数。

3.4.程序总结

Object Localization: Candidates (Blue), Ground Truth (Green), and False Positives (Red)

  • 第 1 步:初始箱式建议书(仅显示相关的建议书)。
  • 第二步:第一次 CNN 包围盒回归后。
  • 第三步:第二次 CNN 包围盒回归后。
  • 步骤 4:步骤 2 中的包围盒加上步骤 3 中的包围盒。
  • 步骤 5:投票后的边界框。

4.结果

4.1.PASCAL VOC2007

PASCAL VOC2007 Test Set

  • 所提出的方法单独使用原始盒优于所有其他单独使用的盒,并且也优于单独使用语义感知区域。

PASCAL VOC2007 Test Set

  • 只有单个原盒 : 61.7%图。
  • MR-CNN :采用多区域,66.2%地图,可见其新颖之处。
  • MR-CNN&S-CNN:67.5%图。
  • MR-CNN&S-CNN&Loc:74.9% mAP,胜过 R-CNN 。

PASCAL VOC2007 Test Set

  • 使用 0.7 IoU 阈值,MR-CNN&S-CNN&Loc依然表现最佳。

PASCAL VOC2007 Test Set, Trained with Extra Data

  • 经过额外数据训练, MR-CNN & S-CNN & Loc 获得 78.2%的 mAP,优于 NoC 、 Fast R-CNN 和Fast R-CNN。

4.2.帕斯卡 VOC2012

PASCAL VOC2012 Test Set

  • 与 VOC2007 类似, MR-CNN & S-CNN & Loc 以 70.7%的 mAP 表现最好。

PASCAL VOC2012 Test Set, Trained with Extra Data

  • 经过额外数据训练,MR-CNN&S-CNN&Loc获得 73.9% mAP,优于 NoC 、 YOLOv1 、 Fast R-CNN 和更快 R-CNN 。

参考

【2015 ICCV】【MR-CNN & S-CNN】
通过多区域的对象检测&语义分割感知的 CNN 模型

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(有)(什)(么)(情)(况)(呢)(?)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(是)(这)(些)(人)(,)(还)(是)(这)(些)(人)(,)(还)(没)(有)(什)(么)(好)(的)(情)(情)(况)(,)(还)(是)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】CRAFTR-FCNIONmultipath Net【T21 [ 约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3 ] [ FPN ] [ 视网膜网 ] [ DCN ]

语义切分 FCNde convnetdeeplab v1&deeplab v2CRF-RNN】SegNet】parse netdilated netPSPNetdeeplab v3]

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道[V-Net]

实例分割 SDS DeepMask SharpMask MultiPathNet MNC 】 InstanceFCN FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

(T38) 人类姿势估计 (T39)
[(T41) 汤普森 NIPS'14 [T42)]

综述:MSDNet——多尺度密集网络(图像分类)

原文:https://towardsdatascience.com/review-msdnet-multi-scale-dense-networks-image-classification-4d949955f6d5?source=collection_archive---------9-----------------------

用于有限计算能力设备的使用多尺度 DenseNet 的资源有效的图像分类

在这个故事里, MSDNet(多尺度密集网络),由康乃尔大学复旦大学清华大学脸书 AI Research (FAIR) 进行回顾。作者在 2017 年 CVPR 发明了 DenseNet (超过 2900 次引用的最佳论文奖),他们在 2018 ICLR 提出了数十次引用的 MSDNet,这是一个多尺度dense net。( Sik-Ho Tsang @中)

利用 MSDNet,训练具有不同资源需求的多个分类器,使得测试时间可以自适应地变化。因此,借助高计算设备,图像可以通过网络进行图像分类利用资源有限的设备,图像可以提前退出网络,进行相对较粗的图像分类。让我们看看它是如何工作的。

概述

  1. 具有计算约束的图像分类概念
  2. MSDNet 架构
  3. 随时分类和预算批量分类中的评估
  4. 网络约简与懒评
  5. 结果

1。具有计算约束的图像分类概念

具有计算约束的影像分类有两种设置

1.1。随时分类

  • 网络可以被强制在任何给定的时间点输出预测。
  • 比如:安卓设备上的移动应用

1.2。预算批次分类

  • 一个固定的计算预算在大量的例子中共享,在“简单”和“困难”的例子中花费不均衡。这对大规模机器学习应用很有用。
  • 比如:搜索引擎社交媒体公司网络广告代理,都必须在有限的硬件资源上处理大量的数据。
  • 截至 2010 年,谷歌图片搜索已经索引了超过 100 亿张图片,此后可能会增长到超过 1 万亿张。即使处理这些图像的新模型只比每幅图像慢 1/10 秒,这一额外成本也会增加 3170 年的 CPU 时间。
  • 在预算批次分类设置中,公司可以通过减少花费在“简单”案例上的计算量来提高平均准确性,从而为“困难”案例节省计算量。

An Illustrative Example of MSDNet

  • 如上图,MSDNet 是多尺度 DenseNet 。上面的路径用于未缩小的图像,下面的路径用于较小比例的图像。
  • 比如说,有一个我们想要分类的猫的图像,通过网络,也许猫的分类有一个大于阈值的 0.6 的分类置信度,我们可以提前退出。下面的网络可以跳过节省“简易”图像的计算时间。
  • 另一方面,对于“硬”图像,我们可以通过更深的网络,直到分类置信度高于阈值。
  • 因此,通过利用花费在“容易”和“困难”图像上的时间,可以节省计算时间。

2。MSDNet 架构

2.1.体系结构

MSDNet Architecture

  • 其纵向布局如同一个微型的S-layers”卷积网络( S =3)
  • 对于第一层( l = 1),通过下采样获得较粗尺度的特征图。
  • 对于 l =1 且比例 s 的后续图层,来自比例 ss -1 的所有先前特征地图的特征地图被连接。使用 conv(1×1)-BN-ReLU-conv(3×3)-BN-ReLU。
  • 更准确地说,下图和下表显示了在某些 sl 处使用的特征图。

The feature maps used at certain s and l

  • 在某些位置,有一些中间分类器被插入到网络的中间。
  • 每个分类器有两个带 128 维 3×3 滤波器的下采样卷积层,后面是一个 2×2 平均池层和一个线性层。
  • 在训练过程中,逻辑损失函数 L ( fk )用于每个分类器,使加权累积损失最小化:

  • 其中 d 表示训练集, wk ⩾ 0 表示分类器的权重 k
  • wk =1 凭经验。

2.2.使用不同网络的中间分类器的评估

  • 你可能会问,为什么不直接在 ResNet 或者 DenseNet 中插入中间分类器呢?为什么我们必须需要 MSDNet?作者也对此进行了评估。主要有两个原因。

Evaluation of Intermediate Classifiers Using Different Networks on CIFAR-100 Dataset

2.2.1.第一个原因

  • ****问题:缺乏粗层次的特征。传统的神经网络学习早期层的细尺度和后期层的粗尺度的特征。早期层缺乏粗级别特征,并且附属于这些层的早期退出分类器将可能产生不令人满意的高错误率。
  • 上图左侧显示了中间分类器的结果,它们也被插入到 ResNet 和 DenseNet 中。分类器的准确性与其在网络中的位置高度相关。特别是在 ResNet (蓝线)的情况下,可以观察到一个可见的“楼梯”图案,在第二和第四分类器之后有很大的改进——位于合并层之后。
  • ****解决方案:多尺度特征图。MSDNet 在整个网络中保持多个尺度的特征表示,并且所有分类器仅使用粗级别的特征。
  • ****横向连接保存并推进高分辨率信息,有利于后续图层高质量粗特征的构建。垂直连接产生易于分类的粗糙特征

2.2.2.第二个原因

  • ****问题:前期量词干扰后期量词。上图右侧显示了作为单个中间分类器位置的函数的最终分类器的精度,相对于没有中间分类器的网络的精度。
  • 一个中间分类器的引入损害了最终的 ResNet 分类器(蓝线),降低其准确率高达 7%。在 ResNet 中,这种精度下降可能是由影响早期特征的中间分类器引起的,这些早期特征是为短期而不是为最终层优化的。
  • ****解决方案:密集连接。相比之下, DenseNet (红线)受此影响要小得多。这是因为在 DenseNet 中,特征图是使用连接而不是在 ResNet 中使用加法来组合的。早期图层的要素地图可以通过密集连接绕过后期图层。最终分类器的性能变得(或多或少)独立于中间分类器的位置。

3.随时分类和预算批量分类中的评估****

3.1.随时分类

  • 在任意时间分类中,每个测试实例都有 a 有限的计算预算B0 可用。
  • 在任意时间设置的测试期间,输入通过网络传播,直到预算 B 用尽,并输出最近的预测。****

3.2.预算批分类

  • 在预算批量分类中,模型需要在预先已知的有限计算预算B0内对一组实例 Dtest = { x 1,…, xM }进行分类。
  • 它可以通过花费少于 B / M 的计算对一个“简单”的例子进行分类,而使用多于 B / M 的计算对一个“困难”的例子进行分类。
  • 所以这里考虑的预算 B 是我们有大批量测试样本时的软约束。
  • 然后,使用动态评估来解决这个问题:
  • 在测试时间,如果一个示例的预测置信度(作为置信度度量的 softmax 概率的最大值)超过预定阈值 θk ,则该示例遍历网络并在分类器 fk 之后退出。****
  • 在训练之前,我们计算处理网络直到第 k 个分类器所需的计算成本 Ck
  • 我们用 0 < q ≤ 1 表示一个固定的退出概率,即到达分类器的样本将获得一个有足够置信度退出的分类。
  • 样本在分类器k处存在的概率:**

  • 其中 z 是归一化常数,使得:

  • 我们需要确保在 Dtest 中对所有样本进行分类的总成本不超过我们的预算 B,这就产生了约束条件:

  • 然后,我们可以q 解决上述问题,并在保留/确认集合上分配阈值 θk ,使得大约一小部分 qk 确认样本在第 k 分类器处退出。****

4。网络还原和懒评

  • 有两种简单的方法可以进一步降低 MSDNets 的计算要求。

  • 首先,在网络的最后一层之前维护所有更精细的尺度是低效的。减小网络大小的一个简单策略是通过沿着深度维度将其分成 S 个块,并且仅保留第 i 个块中的最粗略的( S - i +1)尺度,如上所示。这降低了训练和测试的计算成本。
  • 第二,由于层 l 的分类器仅使用来自最粗尺度的特征,层 l 中的更精细特征图(以及先前的 S -2 层中的一些更精细特征图)不影响该分类器的预测。因此,“对角块”中的计算被分组为,使得我们仅沿着下一个分类器的评估所需的路径传播该示例。当我们因为计算预算耗尽而需要停止时,这可以最大限度地减少不必要的计算。这个策略叫做懒评估。****

5。结果

5.1.数据集

  • CIFAR-10 & CIFAR-100 :两个 CIFAR 数据集包含 50000 个训练和 10000 个 32×32 像素的测试图像。5000 幅训练图像作为验证集。数据集分别包括 10 个和 100 个类。标准数据扩充、随机裁剪和水平翻转被应用于训练集。小批量是 64 个。
  • ****ImageNet:ImageNet 数据集包含 1000 个类,共有 120 万张训练图像和 5 万张验证图像。从训练集中挑选出 50,000 幅图像来估计 MSDNet 中分类器的置信度阈值。应用标准数据扩充。在测试时,224×224 中心裁剪的图像被调整为 256×256 像素用于分类。小批量是 256 个。
  • 在 ImageNet 上,使用了 4 种比例尺,即 S =4,每层分别生成 16、32、64 和 64 幅特征图。原始图像在进入第一层 MSDNets 之前,首先通过 7×7 卷积和 3×3 最大池(都具有步长 2)进行变换。

5.2.消融研究

Ablation Study on CIFAR-100

  • 使用具有六个中间分类器的 MSDNet,并且三个主要组件,多尺度特征图密集连通性中间分类器被一次移除一个。
  • 如果去掉 MSDNet 中的所有三个部分,就得到一个规则的类似 VGG 的卷积网络。
  • 为了使我们的比较公平,我们通过调整网络宽度,即每层输出通道的数量,使整个网络的计算成本保持相似,约为 3.0×10⁸浮点。
  • 最初的 MSDNet(黑色)当然具有最高的准确性。
  • 移除密集连接(橙色)后,整体精度会受到严重影响。
  • 加上移除的多尺度卷积(浅蓝色),精度仅在较低预算区域受到损害。这与作者的动机一致,即多尺度设计在早期引入了区别性特征。
  • 作者还提到,去掉所有 3 个组件后,在特定预算下,它(Star)的性能与 MSDNet 相似。(但是我在图上找不到星星……)

5.3.随时分类

  • MSDNet 网络有 24 层。
  • 分类器对第 2×( i +1)层的输出进行操作,其中 i =1,…,11。
  • 在 ImageNet 上,第 i 个分类器对第( k × i +3)层进行操作,i=1,…,5,其中 k=4,6,7。

Top-1 Accuracy of Anytime Classification on ImageNet (Left),CIFAR-100 (Middle) & CIFAR-10 (Right)

  • ResNetMC : ResNet 具有 MC(多分类器),62 层,每个空间分辨率具有 10 个残差块(对于三个分辨率):早期退出分类器在每个分辨率的第 4 和第 8 个残差块的输出上,产生总共 6 个中间分类器(加上最终分类层)。
  • ****dense netm:dense netm带 MC,52 层,三个密集区块,每个区块 16 层。六个中间分类器被附加到每个块中的第 6 和第 12 层,也与该块中的所有先前层紧密连接。
  • 完全评估时,ResNetMC 和 DenseNetMC 都需要大约 1.3×10⁸浮点运算。
  • 具有不同深度resnet/dense net的系综也被评估。在测试时,按顺序(按网络大小的升序)评估网络,以获得测试数据的预测。所有预测在评估的分类器上平均。在 ImageNet 上,和的集合分别生成深度从 10 层到 50 层和 36 层到 121 层不等的和的集合。
  • 在 CIFAR-100 上,MSDNet 在任何范围内都大大优于 ResNetMC 和 DenseNetMC。这是由于在仅仅几层之后,MSDNets 已经产生了低分辨率特征图,这些低分辨率特征图比 ResNets 或 DenseNets 的早期层中的高分辨率特征图更适合分类。
  • 在极低预算制度下,集合具有优势,因为它们的预测是由第一(小)网络执行的,该网络专门针对低预算进行优化。然而,当预算增加时,集合的精度不会增加得那么快。
  • 与 MSDNets 不同,集成重复相似的低级特征的计算。****
  • 当所有的网络都很浅时,集合精度很快饱和。

5.4.预算批分类

  • 在 CIFAR-10 和 CIFAR-100 上,MSDNet 网络从 10 层到 36 层不等。第 k 个分类器被附加到{1+...+ k }层。
  • 在 ImageNet 上,使用与任何时候分类中的网络相同的网络。

Top-1 Accuracy of Budgeted Batch Classification on ImageNet (Left),CIFAR-100 (Middle) & CIFAR-10 (Right)

  • 在预算批分类中,预测模型接收一批 M 实例和用于分类所有 M 实例的计算预算 B 。使用动态评估。
  • 在 ImageNet 上, M =128,比较了五个densenet,五个resnet,一个 AlexNet,一个 GoogLeNet。
  • ****五个ResNet的集合:“易”图像仅通过最小的ResNet-10传播,而“难”图像由所有五个ResNet模型分类。(预测是集合中所有评估网络的平均值)。
  • 在 CIFAR-100 上, M =256, ResNets , DenseNets ,随机深度网,宽 ResNets , FractalNets ,ResNetMC 和 DenseNetMC 进行了比较。
  • 如上图所示,使用了三个不同深度的 MSD net,这样它们就可以组合在一起覆盖大范围的计算预算。
  • 例如,在 ImageNet 上,以 1.7×10⁹ FLOPs 的平均预算,MSDNet 实现了大约 75%的顶级精度,比具有相同 FLOPs 数量的** ResNet 实现的精度高大约 6%。**
  • 与计算效率高的dense nets相比,MSDNet 使用约 2 至 3 倍的 FLOPs 来实现相同的分类精度。
  • 在 CIFAR-100 上,MSDNets 在所有预算中的表现始终优于所有基准。
  • MSDNet 的性能与 110 层的ResNet不相上下,只使用 1/10 的计算预算。
  • MSDNet 比dense nets随机深度网络宽 ResNetsfractal nets**效率高达 5 倍。******
  • 与任意时间预测设置中的结果相似, MSDNet 通过多个中间分类器显著优于 ResNetsMC 和 DenseNetsMC,这进一步证明了 MSDNet 中的粗糙特征对于早期层中的高性能非常重要。

5.5.形象化

Visualization on Easy and Hard Images on ImageNet

  • 简单图像(顶行):在第一个分类器处退出并被正确分类。
  • 硬图像(底行):在第一个分类器处退出,并且被错误分类,而被最后一个分类器正确分类,其中它们是非典型图像。

5.6.计算效率更高 DenseNets

  • 发现并研究了一种更有效的 DenseNet 。作者还认为这是探索 MSDNet 的一个有趣的发现。

Anytime Classification (Left) and Budgeted Batch Classification (Right)

  • dense net:对原来的dense net进行修改,在每一个过渡层之后增加一倍的增长率,从而对低分辨率的特征地图应用更多的滤镜。*****
  • *DenseNet (绿色)在计算效率上明显优于原来的 DenseNet (红色)。
  • *在 anytime 分类中,不同深度的 DenseNets 的集合仅比 MSDNets 稍差。
  • *在预算的批量分类中,MSDNets 仍然大大优于不同深度的 DenseNets 的集合。

对于未来的工作,作者计划在分类(例如:图像分割)之外进行研究,将 MSDNets 与模型压缩、空间自适应计算和更有效的卷积运算相结合。对我来说,这篇论文有许多重要的事实和概念,这使我写了这么长的故事。

参考

【2018 ICLR】【MSDNet】
用于资源高效图像分类的多尺度密集网络

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(是)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(好)(的)(情)(情)(情)(况)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】CRAFTR-FCNIONmultipath Net【T21 [ 约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3 ] [ FPN ] [ 视网膜网 ] [ DCN ]

语义切分 FCNde convnetdeeplab v1&deeplab v2】CRF-RNN】SegNet】parse netdilated netPSPNetdeeplab v3]

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道

实例分段 DeepMask SharpMask MultiPathNet MNC InstanceFCN FCIS 】

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

(T36) 人类姿势估计 (T37) (T38) (T39) 汤普森 NIPS'14 (T40)

综述:多通道—分割结肠组织学图像(生物医学图像分割)

原文:https://towardsdatascience.com/review-multichannel-segment-colon-histology-images-biomedical-image-segmentation-d7e57902fbfc?source=collection_archive---------15-----------------------

使用 FCN 的前景分割+使用 HED 的边缘检测+使用更快的 R-CNN 的对象检测

Gland Haematoxylin and Eosin (H&E) stained slides and ground truth labels

Foreground Segmentation using FCN + Edge Detection Using HED + Object Detection Using Faster R-CNN

在这个故事里,多路简要回顾。它是一个深度多通道神经网络,用于腺体实例分割。这种方法,如上图所示,融合来自 3 个子网络的结果:前景分割使用 FCN ,边缘检测使用 HED,对象检测使用 更快的 R-CNN 使用 2015 MICCAI 腺体分割挑战数据集获得了最先进的结果。作者在 2016 年首次发表多通道 MICCAI ,仅使用 2 个子网络:使用 FCN 的前景分割和使用 hed 的边缘检测。然后他们增强了会议版本,使用更快的 R-CNN 添加了对象检测。本增强版于 2017 年 TBME 出版。由于事务版本要详细得多,虽然我已经阅读了这两个版本,但我将在这里呈现事务版本。( Sik-Ho Tsang @中)

概述

  1. 第一子网:前景分割通道
  2. 第二子网:边缘检测通道
  3. 第三子网:物体检测通道
  4. 定影多通道
  5. 与最先进方法的比较
  6. 进一步消融研究

1。第一子网:前景分割通道

1st Sub-Network: Foreground Segmentation Channel

  • FCN-32s 用作网络中前景分割通道。
  • 然而,由于 FCN-32s 产生的输出特征图较小,不利于分割。在的扩展网中提出的扩展卷积用于增强的 FCN 。
  • pool4 和 pool5 的步距是 1。
  • 并且随后的回旋层通过扩大的回旋来扩大感受野。
  • 训练时使用 Softmax 交叉熵损失。
  • 使用预先训练好的 FCN-32s 。

2.第二子网:边缘检测通道

2nd Sub-Network: Edge Detection Channel

  • 边缘通道基于整体嵌套的边缘检测器(HED)。
  • 它学习分层嵌入的多尺度边缘场,以说明轮廓和对象边界的低级、中级和高级信息。
  • 对于第 m 次预测:

  • 输出为特征图 h () 的 sigmoid 函数 σ
  • 最后是不同尺度边缘场的加权融合。
  • 在训练期间使用 Sigmoid 交叉熵损失。
  • 使用 Xavier 初始化。
  • 地面实况边缘标签由区域标签生成。如果所有相邻(上、下、左、右)像素都是前景或背景,则该像素不是边缘。

3。第三子网:物体检测通道

3rd Sub-Network: Object Detection Channel

  • 更快 R-CNN 这里用的是,但是有修饰。
  • 填充操作在生成区域建议后完成。
  • 边界框覆盖的区域中的每个像素的值等于它所属的边界框的数量。
  • 例如,如果一个像素位于三个边界框的重叠区域,则该像素的值将为 3。

  • 𝜙是灌装操作。
  • 损耗与fast R-CNN中的一样,即分类损耗和回归损耗之和。
  • 使用预训练的更快的 R-CNN 。
  • 使用包围每个腺体的最小矩形来生成地面真实边界框。

4。定影多通道

Fusing Multichannel

  • 使用 7 层 CNN。
  • 同样,在 DilatedNet 中使用的扩张卷积在这里被用来代替下采样。
  • 使用 Xavier 初始化。

5。与最先进方法的比较

5.1.资料组

  • MICCAI 2015 腺体分割挑战大赛
  • 165 标记的结肠直肠癌组织学图像
  • 原图,大部分是 775×522。
  • 训练集:85 幅图像
  • 测试集:80 幅图像。(测试集 A 包含 60 幅图像,测试集 B 包含 20 幅图像)。训练集中有 37 个良性部分和 48 个恶性部分,测试集 A 中有 33 个良性部分和 27 个恶性部分,测试集 b 中有 4 个良性部分和 16 个恶性部分

5.2.数据扩充

  • 数据增强策略一:水平翻转和 0、90、180、270°旋转。
  • 数据扩充策略二:弹性转换就像 U-Net 里的那个。

5.3.估价

  • 使用了三个指标: F1 得分ObjectDiceObjectHausdorff
  • F1 得分:由 precision P 和 recall R 测得的得分,超过 50%的重叠定义为真阳性。
  • ObjectDice :分割的度量标准。
  • ObjectHausdorff :测量形状相似度的度量。
  • (详情请看我对 CUMedVision2 / DCAN 的点评。)

  • RS 和 WRS 分别是基于 F1 评分的秩和与加权秩和,ObjectDice 和 ObjectHausdorff。
  • 我们可以看到,在 A 部分和 B 部分测试集中,多通道几乎获得了所有的 rank 1,这意味着多通道优于, CUMedVision1 , CUMedVision2 / DCAN , FCN 和expanded FCN(DeepLab)。
  • 一些定性结果:

5.3.与实例分割方法的比较

  • 多通道比所有的实例分割方法都要好,例如 MNC 。
  • 当仅在边界框内(即倒数第二行)分割时,结果也不如融合方法。
  • 边缘 3 表示边缘被半径为 3 的圆盘过滤器扩大。
  • 一些定性结果:

6。进一步消融研究

6.1.数据扩充

  • 使用数据增强策略 II(弹性变换)更好。

6.2.多通道的不同融合变体

  • 边缘 3 表示边缘被半径为 3 的圆盘过滤器扩大。这意味着增加边缘的宽度,以处理训练过程中边缘和非边缘像素的不平衡。
  • 前 3 行:不使用扩张卷积,性能较差。
  • 最后 2 排:只有 2 个通道(或子网)进行融合,性能也较逊色。
  • 中间 3 排:带扩张卷积,加 3 个通道,性能最好。

参考

【2016 MICCAI】【多通道】
汽封实例分割由深多通道侧监督

【2017 TBE】【多通道】
利用深度多通道神经网络进行腺体实例分割

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(是)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(好)(的)(情)(情)(情)(况)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC yolo 9000[yolov 3][FPN][retina net][DCN]

语义切分 FCNde convnetdeeplab v1&deeplab v2SegNet】【parse netdilated netPSP netdeeplab v3DRN

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U 网][CFS-FCN][U 网+ResNet ]

实例分段 DeepMask SharpMask MultiPathNet MNC InstanceFCN FCIS 】

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

点评:多路径网络/多路径/MPN—2015 年 COCO 检测和分割(对象检测/实例分割)亚军

原文:https://towardsdatascience.com/review-multipath-mpn-1st-runner-up-in-2015-coco-detection-segmentation-object-detection-ea9741e7c413?source=collection_archive---------24-----------------------

多个网络层,视网膜中央凹结构和整体损失,信息在网络中沿多条路径流动

在这个故事中,脸书 AI 研究MultiPath net/MultiPath/MPN进行了回顾。这种方法在 GitHub 中被命名为 MultiPathNet,在本文中称为 MultiPath。在 SharpMask 中它也被称为 MPN。做了三处修改,以改进快速 R-CNN :

  1. 视网膜中央凹结构以多种物体分辨率利用物体环境。
  2. 跳过连接,该连接允许探测器访问多个网络层的功能。
  3. 积分损失函数和改善定位的相应网络调整。

再加上 SharpMask 天体提议,组合系统的结果提高到超过基线 快速 R-CNN 探测器,选择性搜索总体提高 66% ,小天体提高 4 倍它在 COCO 2015 检测和细分挑战中均获得第二名。发表在 2016 BMVC 上,被 100 多次引用。( Sik-Ho Tsang @中)

涵盖哪些内容

  1. 视网膜中央凹结构
  2. 跳过连接
  3. 积分损失函数
  4. 消融研究
  5. 结果

MultiPath Architecture

1。视网膜中央凹结构

除了原来的ROI 集中区域尺寸外,还开发了如上图所示的额外的 1.5×、2×和 4× ROI 集中区域。这提供了不同大小的视网膜中央凹区域

这四个 ROI 汇集区域经过完全连接的(FC)层(FC5 和 FC6),然后连接成单个长特征向量(4096×4)

2.跳过连接

在使用 VGG16 作为主干的原始快速 R-CNN 中,只有 conv5 层用于 ROI 合并。在此图层中,要素的缩减采样系数为 16。然而, 40%的 COCO 对象的面积小于 32×32 像素,20%小于 16×16 像素,因此这些对象将在此阶段分别被缩减采样为 2×2 或 1×1。RoI-pooling 会将它们上采样到 7×7,但是由于对特征的 16 倍下采样,大多数空间信息将会丢失。

因此,由或建议的跳过池在 conv3 执行,con4 和 conv5 也用于 ROI 池。这个想法是早期层通常比后期层有更大的值,这在 ParseNet 中提到过。因此,在拼接之前,每个汇集的 ROI 被 L2 归一化 并通过经验确定的比例重新按比例放大。之后,执行 1×1 卷积降低维度以适应分类器输入维度。

这些跳跃连接使分类器能够以多种分辨率访问来自要素的信息。

3.积分损失函数

在 PASCAL 和 ImageNet 数据集中,评分标准仅关注 50 以上的交集(IoU ),即 AP⁵⁰.然而,COCO 数据集在从 50 到 95 的 IoU 范围内评估 AP。

在最初的快速 R-CNN 中,损失函数只关注优化 AP⁵⁰:

第一项 Lcls 是分类对数损失,而第二项 Lloc 是边界框定位损失。 k* ≥1 仅当 IoU 大于 50。否则 k* =0,忽略第二项损失。

总的来说, Lcls 被修改以适应 COCO 评估指标:

上述等式将积分近似为一个和,其中 du = 5。

具体来说,只考虑 6 个 IoU 阈值,从 50、55、…、到 75。修改后的损失变成:

其中 n =6, u 从 50,55,…,到 75。在培训期间,随着 u 的增加,与实际情况相重叠的建议会减少。因此,它被限制为 u ≤75,否则,建议包含的用于训练的总正样本太少。

这个积分损失函数显示在上图的右边。

一些训练细节

在训练期间,每批有 4 个图像,每个图像有 64 个对象提议。在 4 个 NVIDIA Titan X GPUs 上大概需要 3 天。使用每个图像 30,1000 个建议的非最大抑制阈值。并且没有重量衰减。该网络需要 150 毫秒来计算特征,350 毫秒来评估视网膜中央凹区域,因此每个 COCO 图像总共需要 500 毫秒。

4.消融研究

Left: Model improvements of our MultiPath network, Right: 4-region foveal setup versus the 10 regions used in multiregion

  • :采用视网膜中央凹结构和跳跃连接,AP⁵⁰.获得 46.4%的 mAP 积分损失后,AP⁵⁰的平均积分下降到了 44.8%。这是因为积分损失是专门为 COCO 评估指标设计的。因此,我们可以看到使用积分损失后,总 AP 从 27.0 提高到 27.9
  • : multiregion [9]在每个对象周围使用十个具有不同裁剪的上下文区域。在多路径中,仅使用 4 个视网膜中央凹区域。在没有积分损失的情况下,多径对于 AP⁵⁰.具有 45.2%的 mAP 在积分损失的情况下,获得了 26.9%的总 mAP。多路径总是比多区域好。

Left: MultiPath with different IoU thresholds and with Integral loss, Right: Integral loss with different number of u.

  • :每个标准模型在用于训练的阈值下表现最佳,而使用积分损失在所有设置下产生良好的结果。
  • :积分损失达到 6 头最佳 AP。

5.结果

5.1.区域提议技术

AP⁵⁰ and overall AP versus number and type of proposals.

AP⁵⁰ and overall AP with different approaches. (SS: Selective Search, DM: DeepMask)

  • 在最初的快速 R-CNN 中,第一步是使用选择性搜索(SelSearch)来生成多个区域提议。对于每个提案,ROI 池在 conv5 上执行,并通过 FC 层进行分类和定位。
  • 因此,求婚技巧至关重要。
  • 结果是每张图片有大约 400 个深度蒙版提议。
  • 仅使用 50 个深度屏蔽建议就可以匹配 2000 个选择性搜索建议的准确性。

5.2.其他技术

  • trainval :追加训练用 COCO 验证数据。
  • hflip :水平翻转,平均结果。
  • FMP :分数最大汇集,简而言之,是多个 ROI 汇集操作,具有扰动的汇集参数并平均 softmax 输出。
  • 组合:采用 6 模组合。
  • 通过以上 4 项技术,AP⁵⁰和整体 AP 都有了很大的提高。

5.3.COCO 2015 检测和分割

Top: Segmentation Results, Bottom: Detection Results

  • 多路径在检测和分段挑战中位居第二。
  • 小对象的整体 AP 提高了 4 倍,AP⁵⁰提高了 82%。
  • 如果使用 ResNet 主干网,AP 可以进一步提高。

5.4.定性结果

虽然存在遗漏对象和误报,但其中许多都相当不错。

论文和 COCO 检测排行榜中的结果略有不同。但是 SharpMask 中的结果与排行榜中的结果相同。(我不确定,但是)也许,在最后, SharpMask ,一个改进的 DeepMask ,被用作具有多路径提交的区域提议。

参考

【2016 BMVC】【多路径/MPN】
用于物体检测的多路径网络

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-NetR-FCN】离子固态硬盘DSSD约尔

语义切分 [FCN][de convnet][deeplab v1&deeplab v2][parse net][dilated net][PSPNet]

实例分割 深度遮罩锐度遮罩

综述:NIN —网络中的网络(图像分类)

原文:https://towardsdatascience.com/review-nin-network-in-network-image-classification-69e271e499ee?source=collection_archive---------9-----------------------

使用具有 1×1 卷积核的卷积层

A few example images from the CIFAR10 dataset.

在这个故事中,对综合科学与工程研究生院新加坡国立大学网络中的网络(NIN) 进行了简要回顾。具有复杂结构的微型神经网络,用于提取感受野内的数据。这是一篇 2014 ICLR 论文,引用超过 2300 次。( Sik-Ho Tsang @中)

概述

  1. 线性卷积层 VS mlpconv 层
  2. 全连接层 VS 全球平均池层
  3. 网络中网络的整体结构(NIN)
  4. 结果

1。线性卷积层 VS mlpconv 层

1.1.线性卷积层

Linear Convolutional Layer

  • 这里( ij )是特征图中的像素索引, xij 代表以位置( ij )为中心的输入面片, k 用于索引特征图的通道。
  • 然而,实现良好抽象的表示通常是输入数据的高度非线性函数。
  • 作者认为,在将它们组合成更高层次的概念之前,对每个局部补丁进行更好的抽象是有益的。

1.2.mlpconv 层

mlpconv Layer

  • n 是多层感知器的层数。在多层感知器中,校正线性单元被用作激活函数。
  • 上述结构允许跨渠道信息的复杂和可学习的交互。
  • 相当于一个 1×1 卷积核的卷积层。

2。全连接层 VS 全局平均池层

An Example of Fully Connected Layer VS Global Average Pooling Layer

2.1。全连接层

  • 通常,全连接层用于网络末端。
  • 然而,它们容易过度配合

2.2.全球平均池层

  • 这里引入了全球平均池。
  • 其思想是在最后的 mlpconv 层中为分类任务的每个相应类别生成一个特征图。我们没有在特征地图上添加完全连接的层,而是取每个特征地图的平均值,得到的矢量直接输入到 softmax 层。
  • 一个优点是,通过加强特征图和类别之间的对应,它对卷积结构来说更加自然。
  • 另一个优点是在全局平均池中没有参数要优化,因此在这一层避免了过拟合。
  • 此外,全局平均池汇总了空间信息,因此对于输入的空间平移来说更加健壮。

3.网络中网络的总体结构

Overall Structure of Network In Network (NIN)

  • 这样,以上就是 NIN 的整体结构。
  • 最后是全球平均池。

4.结果

4.1.CIFAR-10

Error Rates on CIFAR-10 Test Set

  • NIN + Dropout 仅获得 10.41%的错误率,优于 Maxout + Dropout。
  • 通过数据扩充(翻译和水平翻转),NIN 甚至获得了 8.81%的错误率。
  • (有兴趣的话, NoC 里有一个非常简短的关于 Maxout 的介绍。)

  • 如上所示,在 mlpconv 层之间引入脱落层将测试误差降低了 20%以上。

4.1.西发尔-100

Error Rates on CIFAR-100 Test Set

  • 类似地,NIN + Dropout 仅获得 35.68%的错误率,这优于 Maxout + Dropout。

4.3.街景门牌号(SVHN)

Error Rates on SVHN Test Set

  • 但是 NIN + Dropout 得到了 2.35%的错误率,比 DropConnect 还要差。

4.4.MNIST

Error Rates on MNIST Test Set

  • 在 MNIST,NIN + Dropout 得到 0.47%的错误率,比 Maxout + Dropout 差一点。

4.5.作为调整者的全球平均池

Error Rates on CIFAR-10 Test Set

  • 使用全球平均池,NIN 获得了 10.41%的错误率,这比完全连接+10.88%的退出要好。

在 NIN 中,对于 1×1 卷积,引入了更多的非线性,这使得错误率更低。

参考

【2014 ICLR】【NIN】
网络中的网络

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(没)(有)(什)(么)(好)(的)(情)(情)(感)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [G-RMI][TDM][SSD][DSSD][约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3[FPN[视网膜网[DCN

语义切分 FCNde convnetdeeplabv 1&deeplabv 2CRF-RNN】SegNet】parse netdilated netDRNRefineNet

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN

实例分割 [ SDS ] [ 超列 ] [ 深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

【DeepPose】【汤普森 NIPS'14】【汤普森 CVPR'15】

综述:QSA+qnt——全卷积网络的量子化(生物医学图像分割)

原文:https://towardsdatascience.com/review-qsa-qnt-neural-network-with-incremental-quantization-biomedical-image-segmentation-d9713daf9e0d?source=collection_archive---------12-----------------------

对神经网络进行增量量化,作为正则项,减少过拟合

A Photo Taken by Me in the Seminar Talk by Author Dr. Yiyu Shi

More photos

在这个故事中,回顾了圣母大学华中科技大学的一篇名为“量子化全卷积网络用于精确生物医学图像分割”的论文。我只是在故事标题中称之为 QSA+QNT 自从量化应用于【SA】和网络训练(NT) 。这是一篇 2018 CVPR超过 10 次引用的论文。( Sik-Ho Tsang @中)

这是我参加的研讨会演讲,让我开始阅读关于生物医学图像分割的深度学习论文。

概述

  1. 简评 提示性注释【SA】
  2. SA 架构的修改
  3. 量化的选择
  4. 消融研究
  5. 与最先进方法的比较

1.简要回顾 暗示性注释【SA】

Brief Review of SA

  • 步骤 A :首先, 10%的样本经过专家标注,送入全卷积网络( FCN )进行训练。
  • 步骤 B :然后,多个fcn用自举训练
  • 步骤 C :使用训练好的 FCNs 对未标注样本进行分割。
  • 步骤 D & E :使用标准差的不确定性度量和使用余弦相似性的相似性估计用于在多个fcn中选择不确定但对专家来说与数据集相似的样本。
  • 步骤 F(步骤 A) : 专家再次标注 10%的样本。但这次,这些样本是 SA 中的不确定性度量和相似性估计所建议的
  • 只有 50%的训练数据, SA 使用 100%的训练数据输出或接近最先进的方法。
  • 因此,通过这种方式,专家可以从注释过多的样本中解放出来,即减少了注释工作,降低了成本,并且节省了时间成本。
  • 更多详情,请阅读我关于 SA 的评论。

2. SA 架构的修改

The New Part Comparing with SA

  • 本文将《FCN》原著分为提示性的 FCN 和分割性的 FCN。
  • 提示性 FCN :仅用于不确定性度量和相似性估计。
  • 分段 FCN(新):仅用于分段。

Quantization on FCNs

  • 最初,权重用 32 位表示。
  • 现在,量化被引入到提示性 FCN 和分割 FCN 中(细节在后面的部分)。

3。量化的选择

3.1。量化

  • 在保持可接受精度的同时,用较少的内存(精度)表示重量。
  • 在硬件上启用低位宽 NN 的训练加速

3.2.DoReFa-Net(超过 300 次谷歌引用)

  • (+1,-1) 根据值是大于还是小于均值来赋值。
  • 从 32 位量化到 1 位

3.3.三元权重网络(TWN)(超过 200 次谷歌引用)

  • (+α,-α,0) 根据数值是否接近、大于或小于均值来赋值。
  • 从 32 位量化到 2 位

3.4.增量量化(INQ)(超过 200 次谷歌引用)

An Illustrative Example Provided by Authors During the Seminar Talk

  • 量化到两个的次方即可。
  • 我们发现,有时量化可以提高精度
  • 在[1]中,它将 ImageNet 分类的 Top-1 错误提高了 0.01%
  • 在[2]中,它对 ImageNet 分类的 Top-1 和 Top-5 错误提高了 0.2%-1.47%。

最后,本文采用了增量量化(INQ)

4.消融研究

Fixed to 5 FCNs for suggestive FCN and 1 FCN for segmentation FCN (F is 32-bit)

  • 建议 FCN (QSA)的 n 位量化,分段 FCN (NT/QNT)的 7 位量化
  • 无论有无量化,使用 7 位量化性能最佳。
  • 但是对分割 FCN (QNT)的量化并不总是能提高精度。

Fixed to 5 FCNs for suggestive FCN and 1 FCN for segmentation FCN (F is 32-bit)

  • 分段 FCN (QNT)上的 n 位量化,带有/不带有暗示 FCN(南非/QSA)上的 7 位量化
  • 无论有无量化,使用 7 位量化性能最佳。
  • 对暗示性 FCN (QSA)的量化总是比没有量化的(SA)具有更高的准确性。

When 5 FCNs are used at both sides

  • 分段 FCN (QNT)上的 n 比特量化,带有/不带有建议 FCN (SA)上的 7 比特量化。
  • 无论有无量化,使用 7 位量化都具有最佳性能。
  • 对分段 FCN (QNT)的 7 比特量化+对暗示 FCN (QNT)的 7 比特量化具有稍好的性能。
  • (论文中有更多结果,有兴趣请看论文。)

5.与最先进方法的比较

  • 7 位量化对 5 分段 FCN (QNT)7 位量化对 5 暗示 FCN (QNT)的表现优于 SA 多通道 (会议和事务两个版本),以及cumed vision 2/DCAN
  • 7 位和 5 位量化的内存分别减少 4.6 倍和 6.4 倍
  • 这就像一个正则项。

结论是,量化的建议性标注可以应用于其他数据有限或标注成本较高的问题。

参考

【2018 CVPR】【QSA+qnt】
量子化全卷积网络精确生物医学图像分割

我以前的评论

)(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(我)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(?)(我)(们)(都)(不)(在)(这)(些)(情)(况)(上)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(好)(好)(的)(情)(感)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(好)(的)(情)(情)(况)(。 [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [G-RMI][TDM][SSD][DSSD][约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3[FPN[视网膜网[DCN

语义切分 FCNde convnetdeeplabv 1&deeplabv 2CRF-RNN】SegNet】parse netdilated netDRNRefineNet

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN

实例分割 SDS Hypercolumn DeepMask SharpMask MultiPathNet MNC InstanceFCN FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

人体姿态估计
深度姿态汤普逊·尼普斯 14汤普逊·CVPR 15

评论评级预测:一种综合方法

原文:https://towardsdatascience.com/review-rating-prediction-a-combined-approach-538c617c495c?source=collection_archive---------7-----------------------

结合评论文本内容和用户相似度矩阵来获取更多信息并改进评论评分预测

Source: pixabay

开始

电子商务的兴起使顾客评论的重要性大大提高。网上有数百个评论网站,每种产品都有大量的评论。顾客已经改变了他们的购物方式,根据最近的 调查 ,70%的顾客说他们使用评级过滤器过滤掉搜索中评级较低的商品。

对于支持这些评论的公司,如谷歌、亚马逊和 Yelp,成功判断评论是否对其他客户有帮助,从而提高产品曝光率的能力至关重要。。

有两种主要的方法来解决这个问题。第一种是基于评论文本内容分析并使用自然语言处理的原则(NLP 方法)。这种方法缺乏从顾客和商品之间的关系中得出的洞察力。第二个是基于推荐系统,特别是基于协同过滤,并且关注评论者的观点。使用用户的相似性矩阵和应用邻居分析都是该方法的一部分。此方法会忽略来自审查文本内容分析的任何信息。

为了获得更多的信息并提高评论评级的预测,研究人员在 这篇文章 中提出了一个结合评论文本内容和先前用户相似度矩阵分析的框架。然后,他们在两个电影评论数据集上做了一些实验,以检验他们的假设的有效性。他们得到的结果表明,他们的框架确实提高了评论评级的预测。这篇文章将描述我试图通过亚马逊评论数据集中的例子来跟踪他们的研究工作。记录这项工作的笔记本可以在这里获得,我鼓励在你的计算机上运行代码并报告结果。

数据

这里使用的数据集是由 UCSD 的 Julian McAuley 博士提供的。它包含亚马逊的产品评论和元数据,包括 1996 年 5 月至 2014 年 7 月期间的 1.428 亿条评论。产品评论数据集包含用户 ID、产品 ID、评级、有用性投票和每个评论的评论文本。
这里的数据可以找到
****

假设

在这项工作中,我的目标是检查研究人员的论文。它不是为这个问题找到最好的模型。我将试图证明,将以前已知的关于每个用户与其他用户相似性的数据与评论文本本身的情感分析相结合,将有助于我们改进用户评论将获得什么评级的模型预测。

Source: pixabay

工作流程

首先,我将根据 RTC 分析执行 RRP。下一步将应用邻居分析来基于用户之间的相似性执行 RRP。最后一步将比较三种方法(基于 RTC 的 RRP、基于邻居分析的 RRP 以及两者的组合)并检查假设。

预处理

预处理在任何分析中都是一个关键步骤,在这个项目中也是如此。
主表的表头如下:

The head of the primary table

首先,我删除了没有评论文本的行、重复的行和我不会用到的额外的列。
第二步是创建一个列,其中包含有用分子和有用分母相除的结果,然后将这些值分割到各个箱中。它看起来像这样:

****reviews_df = reviews_df[~pd.isnull(reviews_df['reviewText'])]
reviews_df.drop_duplicates(subset=['reviewerID', 'asin', 'unixReviewTime'], inplace=**True**)
reviews_df.drop('Unnamed: 0', axis=1, inplace=**True**)
reviews_df.reset_index(inplace=**True**)

reviews_df['helpful_numerator'] = reviews_df['helpful'].apply(**lambda** x: eval(x)[0])
reviews_df['helpful_denominator'] = reviews_df['helpful'].apply(**lambda** x: eval(x)[1])
reviews_df['helpful%'] = np.where(reviews_df['helpful_denominator'] > 0,
                                  reviews_df['helpful_numerator'] / reviews_df['helpful_denominator'], -1)

reviews_df['helpfulness_range'] = pd.cut(x=reviews_df['helpful%'], bins=[-1, 0, 0.2, 0.4, 0.6, 0.8, 1.0],
                                         labels=['empty', '1', '2', '3', '4', '5'], include_lowest=**True**)****

最后一步是创建一个文本处理器,从杂乱的评论文本中提取有意义的单词。

****def text_process(reviewText):
    nopunc = [i for i in reviewText if i not in string.punctuation]
    nopunc = nopunc.lower()
    nopunc_text = ''.join(nopunc)
    return [i for i in nopunc_text.split() if i not in stopwords.words('english')]****

在被应用之后,这个 had -
1。删除了标点符号
2。转换成小写
3。移除了停用字词(在训练模型的上下文中不相关的字词)

一看数据

经过所有预处理后,主表的表头如下所示:

下图显示了用户乐于助人的范围在产品评级中的分布情况:

Heatmap

Barplot

人们很容易看出对高收视率的偏好。这种现象是众所周知的,这也在上面的 同一调查 中得到支持。根据这项调查:

“点评正越来越多地从消费者表达不满的地方,转变为在获得积极体验后推荐商品的地方”。

稍后,我将解释倾斜数据的问题是如何解决的(重采样方法)。

第一步:基于审核文本内容的 RRP

车型

为了检查和选择最佳模型,我构建了一个管道,它执行以下步骤。流水线将首先执行 TF-IDF 项加权和矢量化,然后运行分类算法。一般来说,TF-IDF 将使用我上面的“text_process”函数处理文本,然后将处理后的文本转换为计数向量。然后,它会应用一种计算方法,对更重要的单词赋予更高的权重。

**pipeline = Pipeline([
    ('Tf-Idf', TfidfVectorizer(ngram_range=(1,2), analyzer=text_process)),
    ('classifier', MultinomialNB())
])
X = reviews_df['reviewText']
y = reviews_df['helpfulness_range']
review_train, review_test, label_train, label_test = train_test_split(X, y, test_size=0.5)
pipeline.fit(review_train, label_train)
pip_pred = pipeline.predict(review_test)
print(metrics.classification_report(label_test, pip_pred))**

注意,我选择了 ngram_range = (1,2 ),算法是多项式朴素贝叶斯。这些决定是根据交叉验证测试的结果做出的。我所做的交叉验证测试超出了本文的范围,但是您可以在笔记本中找到它。
检查的车型有:
1。多项逻辑回归,作为基准
2。多项式朴素贝叶斯
3。决策树
4。随机森林

多项朴素贝叶斯给出了最好的准确度分数(0.61),因此选择它做出的预测来表示基于 RTC 的 RRP。

这一步的最后一部分是将所选模型做出的预测导出到 csv 文件中:

**rev_test_pred_NB_df = pd.DataFrame(data={'review_test': review_test2, 'prediction': pip_pred2})
rev_test_pred_NB_df.to_csv('rev_test_pred_NB_df.csv')**

第二步:基于用户相似度的 RRP

预处理

在这一步中,用户相似性矩阵被构建,并且是我将计算每个用户之间的余弦相似性的基础。当我使用项目的名称构造矩阵时,出现了一些问题,但是通过转换为唯一的整数序列(与 SQL 中的 IDENTITY 属性相同)解决了这些问题。

**temp_df = pd.DataFrame(np.unique(reviewers_rating_df['reviewerID']), columns=['unique_ID'])
temp_df['unique_asin'] = pd.Series(np.unique(reviewers_rating_df['asin']))
temp_df['unique_ID_int'] = range(20000, 35998)
temp_df['unique_asin_int'] = range(1, 15999)reviewers_rating_df = pd.merge(reviewers_rating_df, temp_df.drop(['unique_asin', 'unique_asin_int'], axis=1), left_on='reviewerID', right_on='unique_ID')reviewers_rating_df = pd.merge(reviewers_rating_df, temp_df.drop(['unique_ID', 'unique_ID_int'], axis=1),left_on='asin', right_on='unique_asin')reviewers_rating_df['overall_rating'] = reviewers_rating_df['overall']
id_asin_helpfulness_df = reviewers_rating_df[['reviewerID', 'unique_ID_int', 'helpfulness_range']].copy()# Delete the not in use columns:
reviewers_rating_df.drop(['asin', 'unique_asin', 'reviewerID', 'unique_ID', 'overall', 'helpfulness_range'], axis=1, inplace=True)**

构建矩阵:为了节省处理时间,我使用 pivot 将数据转换成合适的形状,然后使用“csr_matrix”将其转换成稀疏矩阵。

**matrix = reviewers_rating_df.pivot(index='unique_ID_int', columns='unique_asin_int', values='overall_rating')
matrix = matrix.fillna(0)
user_item_matrix = sparse.csr_matrix(matrix.values)**

KNN 车型

我使用了 K-最近邻算法来进行邻居分析。KNN 模式易于实施和解释。相似性度量是余弦相似性,并且期望的邻居的数量是 10。

**model_knn = neighbors.NearestNeighbors(metric='cosine', algorithm='brute', n_neighbors=10)
model_knn.fit(user_item_matrix)**

在训练阶段之后,我提取了邻居列表,并将其存储为一个 NumPy 数组。这产生了一个用户和与他们最相似的 10 个用户的二维数组。

**neighbors = np.asarray(model_knn.kneighbors(user_item_matrix, return_distance=False))**

下一步是获取 10 个最近的邻居,并将它们存储在数据帧中:

**unique_id = []
k_neigh = []
for i in range(15998):
    unique_id.append(i + 20000)
    k_neigh.append(list(neighbors[i][1:10])) #Grabbing the ten closest neighborsneighbors_df = pd.DataFrame(data={'unique_ID_int': unique_id,
                                  'k_neigh': k_neigh})id_asin_helpfulness_df = pd.merge(id_asin_helpfulness_df, neighbors_df, on='unique_ID_int')
id_asin_helpfulness_df['neigh_based_helpf'] = id_asin_helpfulness_df['unique_ID_int']**

最后,为了计算十个最接近的评论者写的评论的平均分,我编写了一个嵌套循环来遍历每一行。然后,循环将遍历用户的十个邻居,并计算他们的评论的平均得分。

**for index, row in id_asin_helpfulness_df.iterrows():
    row = row['k_neigh']
    lista = []
    for i in row:
        p = id_asin_helpfulness_df.loc[i]['helpfulness_range']
        lista.append(p)
    id_asin_helpfulness_df.loc[index, 'neigh_based_helpf'] = np.nanmean(lista)**

第三步:组合

Photo by ALAN DE LA CRUZ on Unsplash

第三步,我导出了上面计算的结果,并将它们与所选模型的预测合并。然后,我有一个由四列组成的文件:
1)原始评论
2)他们得到的分数(地面真相)
3)第一步的预测(NLP 方法)
4)第二步的预测(用户相似性方法)
这两种方法的结合可以用许多不同的方式来完成。在本文中,我选择了简单的算术平均值,但其他方法也可以。除了上面的四列,我现在有了第五列:
5)列 3)和 4)中每一行的算术平均值

最后一步:报告

用于比较模型的度量是均方根误差(RMSE)。这是一个非常常见和良好的比较模型的措施。此外,我选择提出平均绝对误差(MAE ),因为它使用与测量数据相同的尺度,因此可以很容易地解释。结果如下所示:

**RMSE for neigh_based_helpf: 1.0338002581383618
RMSE for NBprediction: 1.074619472976386
RMSE for the combination of the two methods: 0.9920521481819871
MAE for the combined prediction: 0.6618020568763793**

组合方法的 RMSE 低于每种单独方法的 RMSE。

结论

总之,我的论文被证明是正确的。将关于每个用户与其他用户的相似性的先前已知数据与评论文本本身的情感分析相结合,确实有助于改进对用户评论将获得的评分的模型预测

本文的目标是比较这些方法,看看研究人员提供的框架是否会提高预测的准确性。这不是为了找到基于 RTC 的最准确的 RRP 模型。

虽然 MAE 为 0.66 并不好,但这项工作的主要目的是检验假设,而不一定是寻求最佳的 RRP 模型。

综述:RefineNet——多路径细化网络(语义分段)

原文:https://towardsdatascience.com/review-refinenet-multi-path-refinement-network-semantic-segmentation-5763d9da47c1?source=collection_archive---------15-----------------------

在七个数据集上优于 FCN、DeconvNet、SegNet、CRF-RNN、DilatedNet、DeepLab-v1、DeepLab-v2

在这个故事中,由阿德莱德大学澳大利亚机器人视觉中心开发的refinent被评论。通用多路径细化网络,明确利用下采样过程中的所有可用信息,使用长距离残差连接实现高分辨率预测。捕捉高级语义特征的更深层次可以使用来自早期卷积的细粒度特征直接细化。还引入了链式剩余池,它以高效的方式捕获丰富的背景上下文。这是一篇 2017 CVPR 论文,引用 400 多次。( Sik-Ho Tsang @中)

概述

  1. 问题之ResNet和散瞳卷积
  2. RefineNet
  3. 消融研究
  4. 与最先进方法的比较

1。ResNet 和扩张卷积的问题

(a) ResNet (b) Dilated (Atrous) Convolution

  • (a)ResNet:It遭遇特征图的降尺度,不利于语义分割。
  • (b)扩张(阿特鲁)卷积:在深度实验室和扩张网中介绍。虽然它有助于保持输出特征图的分辨率更大,但 atrous 过滤器训练的计算成本很高,甚至在现代 GPU 上也很快达到内存限制。

2. RefineNet

(a) Overall Architecture, (b) RCU, (c) Fusion, (d) Chained Residual Pooling

  • (a) :图的左上方,是 ResNet 主干。沿着 ResNet ,不同分辨率的特征地图经过残差 Conv 单元(RCU)。使用预激活 ResNet 。
  • (b) RCU :使用剩余块,但去除了批量归一化。
  • (c)融合:然后多分辨率融合被用于使用逐元素求和来合并特征图。
  • (d)链式残差池:通过残差连接求和,将所有池块的输出特征图与输入特征图融合在一起。它的目的是从一个大的图像区域中捕获背景上下文。
  • (a)输出 Conv :在图的右边,最后,另一个 RCU 被放置在这里,以在多路径融合的特征图上使用非线性操作来生成用于进一步处理或用于最终预测的特征。

3.消融研究

3.1.主干、链式剩余汇集和多尺度评估

Backbones, Chained Residual Pooling, and Multi-Scale Evaluation

  • 借助更深入的 ResNet-152 、链式剩余池和测试时多尺度评估,两个数据集一致地获得了更高的 IoU。

3.2.不同的 RefineNet 变体

Different RefineNet Variants

  • (a)单个 RefineNet 模型:它从 ResNet 的四个模块中获取所有四个输入,并在单个过程中融合所有分辨率的特征图。
  • (b) 2 级 RefineNet :仅采用两个 RefineNet 模块,而不是四个。底部的一个 RefineNet-2 有来自 ResNet 模块 3 和 4 的两个输入,另一个有三个输入,两个来自剩余的 ResNet 模块,一个来自 RefineNet-2。
  • (c) 4 级级联 2 尺度细化:图像的 2 个尺度作为输入,分别用 2 个resnet生成特征图。输入图像被缩放到 1.2 和 0.6 倍,并被送入两个独立的结果网。

Different RefineNet Variants

  • 由于网络容量更大,4 级联 2 级 RefineNet 具有最佳结果,但它也导致训练时间更长。
  • 因此, 4 级联 RefineNet 用于与最先进的方法进行比较。

4.与最先进方法的比较

4.1.人物角色

Person-Part

  • 人体部分数据集提供了六个人体部分的像素级标签,包括头部、躯干、上臂/下臂和上/小腿。剩下的都是背景。
  • 有 1717 幅训练图像和 1818 幅测试图像。
  • RefineNet 大幅度超过deep lab v1&deep lab v2。

Some Examples

4.2.NYUD-v2

NYUD-v2

  • 它由 1449 幅显示室内场景的 RGB-D 图像组成,共有 40 个类别。
  • 使用具有 795 和 654 个图像的标准训练/测试分割。
  • 在不使用深度信息进行训练的情况下,RefineNet 优于 FCN-32s 。

4.3.帕斯卡 VOC 2012

PASCAL VOC 2012 Test Set

  • 它包括 20 个对象类别和一个背景类。
  • 它被分成训练集、验证集和测试集,每个都有 1464、1449 和 1456 个图像。
  • 尝试了在deep lab v1&deep lab v2中用于进一步细化的条件随机场(CRF)方法,但在验证集上仅有 0.1%的边际改善。因此,通用报告格式不用于 RefineNet。
  • 明显优于 FCN-8s 、德孔内、 CRF-RNN 和DeepLabv1&DeepLabv2。

Some Examples

4.4.城市景观

Cityscapes Test Set

  • 这是一个来自 50 个不同欧洲城市的街景图像数据集。该数据集提供了道路、汽车、行人、自行车、天空等的细粒度像素级注释。
  • 所提供的训练集具有 2975 幅图像,而验证集具有 500 幅图像。
  • 考虑对 19 个班级进行培训和评估。
  • 同样,RefineNet 的表现优于 FCN-8s 、去配置网和深度实验室 v1 &深度实验室 v2 ,以及扩展网。

Some Examples

4.5.PASCAL 上下文

PASCAL-Context

  • 它为 PASCAL VOC 图像提供了整个场景的分割标签,共有 60 类(1 为背景)。
  • 训练集包含 4998 幅图像,测试集包含 5105 幅图像。
  • 同样,RefineNet 的表现优于 FCN-8s 和 DeepLabv2 。

4.6.太阳-RGBD

SUN-RGBD

  • 它包含大约 10,000 幅 RGB-D 室内图像,并为 37 个类别提供像素标记遮罩。
  • 在不使用深度信息进行训练的情况下,RefineNet 仍然是所有方法中最好的。

4.7.ADE20K MIT

ADE20K dataset (150 classes) val set.

  • 这是一个场景解析数据集,在超过 20K 个场景图像上提供了 150 个类别的密集标签。
  • 这些类别包括各种各样的对象(例如,人、汽车等。)和东西(如天空、道路等。).所提供的由 2000 幅图像组成的验证集用于定量评估。
  • 还是那句话,RefineNet 比 FCN-8s 、 SegNet 和 DilatedNet ,甚至是 SegNet 和 DilatedNet 的级联版。

参考

【2017 CVPR】【RefineNet】
RefineNet:用于高分辨率语义分割的多路径细化网络

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(没)(有)(什)(么)(好)(的)(情)(情)(感)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [TDM][SSD][DSSD][yolo v1][yolo v2/yolo 9000][yolo v3][FPN][retina net[DCN]

语义切分 FCNde convnetdeeplab v1&deeplab v2CRF-RNN】SegNet】parse netdilated netPSPNetdeeplab v3

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道[V-Net][3D U-Net]

实例分割 [SDS[超列 ] [ 深度掩码 ] [ 锐度掩码 ] [ 多路径网络][MNC][Instance fcn][FCIS

超分辨率 [Sr CNN][fsr CNN][VDSR][ESPCN][红网][DRCN][DRRN][LapSRN&MS-LapSRN][srdensenenet

人体姿态估计
深度姿态汤普逊·尼普斯 14

综述:剩余注意网络——注意感知特征(图像分类)

原文:https://towardsdatascience.com/review-residual-attention-network-attention-aware-features-image-classification-7ae44c4f4b8?source=collection_archive---------12-----------------------

胜过预激活 ResNet 、 WRN 、盗梦空间 ResNet 、 ResNeXt

在这个故事中,余额宝关注网,由 SenseTime清华大学香港中文大学(CUHK)北京邮电大学,进行回顾。多个注意力模块叠加生成注意力感知特征。注意力剩余学习用于非常深的网络。最后,这是一篇 2017 CVPR 论文,引用超过 200 次。( Sik-Ho Tsang @中)

概述

  1. 关注网络
  2. 注意力剩余学习
  3. 软面膜分支
  4. 整体架构
  5. 消融研究
  6. 与最先进方法的比较

1。关注网络

Residual Attention Network

  • 其中 p 为分割成主干分支和掩膜分支前预处理剩余单元的个数。
  • t 表示主干分支的剩余单元数
  • r 表示掩膜分支中相邻池层之间的剩余单元数。
  • 在实验中,除非特别说明, p =1, t =2, r =1。

1.1.掩模分支和主干分支

  • 剩余注意网络中有两个术语:掩蔽分支&主干分支。
  • 主干分支:为特征提取的注意力模块中的上层分支。它们可以是预激活 ResNet 块或其他块。输入 x ,输出 T ( x )。
  • Mask 分支:采用自下而上自上而下的结构学习同尺寸 mask M ( x )。这个 M ( x )是作为类似高速公路网的控制闸门。
  • 最后,注意模块 H 的输出为:

  • 其中 i 在空间位置范围内,并且 c 是从 1 到 C 的信道索引。
  • 注意力屏蔽可以在正向推理过程中充当特征选择器。
  • 反向传播期间:

  • 其中 θ 为掩膜分支参数, φ 为主干分支参数。
  • 在反向传播期间,它还充当梯度更新过滤器。
  • 因此,这使得注意力模块对噪声标签具有鲁棒性。屏蔽分支可以防止错误的梯度(来自噪声标签)来更新主干参数。
  • (这有点像【STN】,但目标不同。STN 的目标是变形不变性,而注意网络的目标是生成注意感知特征。并且能够处理更具挑战性的数据集,如 ImageNet,其中图像包含需要建模的杂乱背景、复杂场景和大的外观变化。)

An Example of Hot Air Balloon Images

  • 如上图所示,在热气球图像中,来自底层的蓝色特征有相应的天空遮罩来消除背景,而来自顶层的部分特征被气球实例遮罩细化。
  • 此外,堆叠网络结构的递增性质可以逐渐细化对复杂图像的注意力

2.注意力剩余学习

  • 然而,幼稚的注意力学习(NAL) 导致成绩下降。
  • 这是因为掩模范围从 0 到 1 重复产生的点将降低深层特征的价值
  • 另外,软掩码可能会破坏主干分支的良好属性,例如来自预激活 ResNet 的剩余单元的相同映射。

  • 如上构造一个更好的面具,叫做注意剩余学习(ARL)
  • F ( x )为原始特征, M ( x )范围为[0,1]。
  • 因此,ARL 可以保持原有特色的良好属性。
  • 堆叠的注意力模块可以如上图所示逐渐细化特征图。随着深度的增加,特征变得更加清晰。

3.软掩膜分支

Soft Mask Branch

  • 使用了自下而上自上而下的完全卷积结构
  • 执行多次最大汇集,以在少量剩余单位后快速增加感受野
  • 然后,通过对称的自顶向下架构扩展全局信息,以引导每个位置的输入特征。
  • 线性插值在一些剩余单元之后对输出进行上采样。
  • 然后,sigmoid 层在两次 1×1 卷积后对输出进行归一化。

4。整体架构

Overall Architecture

  • 该网络由 3 级组成,类似于预激活 ResNet ,每级堆叠相同数量的注意模块。
  • 此外,在每个阶段添加两个剩余单元。
  • 主干分支的加权层数为 36 m +20 其中 m 为一个阶段的关注模块数。

5.消融研究

5.1.软遮罩分支中的激活功能

Test Error (%) on CIFAR-10 of Attention-56

  • 除了 Sigmoid,其他类型的激活功能如上所述使用 CIFAR-10 和 56 重量层进行测试注意-56。
  • 乙状结肠是上面三个中最好的

5.2.朴素注意学习(NAL) vs 注意剩余学习(ARL)

Test Error on CIFAR-10

  • m = {1,2,3,4}。分别导致关注度-56(以主干层深度命名)、关注度-92、关注度-128、关注度-164。
  • ARL 的表现一直优于 NAL。
  • 随着注意模块数量的增加,NAL 出现了明显的退化。
  • 在 RAL,当应用注意剩余学习时,性能随着注意模块的数量而增加。

Mean Absolute Response Value Using Attention-164

  • 使用 Attention-164 测量每个阶段的输出层的平均绝对响应值。
  • NAL 在第二阶段 4 个注意力模块后迅速消失。
  • ARL 可以在抑制噪声的同时保留有用的信息,使用相同的映射减轻信号衰减。它从降噪中获益,而没有显著的信息损失。

5.3.不同的掩模结构

Test Error on CIFAR-10

  • 局部卷积:没有编码器和解码器结构,只有卷积。
  • 编解码器:误差更小,得益于多尺度信息。

5.4.噪声标签鲁棒性

  • 具有 r 的混淆矩阵,干净标签比率,用于整个数据集。
  • 不同的 r ,不同级别的标签噪声注入数据集。

Test Error on CIFAR-10 with Label Noises

  • 即使在高水平噪声数据下训练,ARL 也能表现良好。
  • 当标签有噪声时,该掩模可以防止由标签误差引起的梯度,因为软掩模分支掩盖了错误的标签。

6。与最先进方法的比较

6.1.西法尔-10 和西法尔-100

  • CIFAR-10 和 CIFAR-100 数据集分别由 10 类和 100 类的 60,000 幅 32×32 彩色图像组成,其中有 50,000 幅训练图像和 10,000 幅测试图像。

Comparisons with State-of-the-art Methods on CIFAR-10/100

  • Attention-452 由具有超参数设置的注意模块组成:{ p = 2, t = 4, r = 3}和每阶段 6 个注意模块。
  • 在注意模块方面,它优于预激活 ResNet 和 WRN 。
  • 注意-236 仅用一半的参数就胜过ResNet-1001。这意味着注意力模块和注意力剩余学习方案可以有效地减少网络中的参数数量,同时提高分类性能。

6.2.ImageNet

  • ImageNet LSVRC 2012 数据集包含 1,000 个类,包含 120 万幅训练图像、50,000 幅验证图像和 100,000 幅测试图像。该评估是在 ImageNet LSVRC 2012 验证集的非黑名单图像上进行的。

Single Crop Validation Error on ImageNet

  • ResNet-152相比, Attention-56 网络的 top-1 错误减少了 0.4%,top-5 错误减少了 0.26%,而只有 52%的参数和 56%的失败。****
  • 并且剩余注意网络使用不同的基本单元可以很好的泛化。有了注意模块,它的表现优于没有注意模块的相应网络。
  • 注意 NeXt-56 网络性能与 ResNeXt-101 相同,而参数和 FLOPs】明显少于 ResNeXt-101 。
  • AttentionInception-56 的性能优于Inception-ResNet-v1by,前 1 个错误减少了 0.94%,前 5 个错误减少了 0.21%。
  • 关注-92 大幅度胜过ResNet-200。top-1 误差减少 0.6%,而ResNet-200网络比 Attention-92** 多包含 32%的参数。**
  • 另外,注意力网络比ResNet-200减少了将近一半的训练时间。

参考

【2017 CVPR】【剩余注意力网络】
用于图像分类的剩余注意力网络

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(没)(有)(什)(么)(好)(的)(情)(情)(感)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [TDM][SSD][DSSD][yolo v1][yolo v2/yolo 9000][yolo v3][FPN][retina net[DCN]

语义切分 FCNde convnetdeeplabv 1&deeplabv 2CRF-RNN】SegNet】parse netdilated netDRNRefineNet

生物医学图像分割 [ 累计视觉 1 ] [ 累计视觉 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net]

实例分割 [SDS][Hypercolumn][deep mask][sharp mask][multipath net][MNC][Instance fcn[FCIS]

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

【DeepPose】【汤普森 NIPS'14】【汤普森 CVPR'15】

回顾:RetinaNet —焦点丢失(物体检测)

原文:https://towardsdatascience.com/review-retinanet-focal-loss-object-detection-38fba6afabe4?source=collection_archive---------0-----------------------

使用 ResNet+FPN 的具有焦点损失和视网膜网络的一级检测器,超越了两级检测器的准确性,更快的 R-CNN

在这个故事里, RetinaNet ,由脸书艾研究(FAIR) 进行点评。发现在一级检测器中存在极端的前景-背景类别不平衡问题。并且据信这是使一级检测器的性能不如两级检测器的主要原因。

在 RetinaNet(一级检测器)中,通过使用焦点损失,较低的损失是由“容易”的负样本造成的,因此损失集中在“硬”样本上,这提高了预测精度。以【ResNet】+【FPN】为骨干进行特征提取,加上两个特定任务的子网络进行分类和包围盒回归,形成了 RetinaNet ,达到了最先进的性能,优于 更快的 R-CNN 是一篇 2017 ICCV 最佳学生论文奖论文,引用量超过 500 篇。(第一作者宗林逸在 2017 年 ICCV 展示 RetinaNet 时,已经成为谷歌大脑的研究科学家。)( Sik-Ho Tsang @中型)

A Demo of RetinaNet on Parking Lot Entrance Video (https://www.youtube.com/watch?v=51ujDJ-01oc)

Another Demo of RetinaNet on Car Camera Video

概述

  1. 一级检测器的类不平衡问题
  2. 焦损失
  3. 视网膜检测器
  4. 消融研究
  5. 与最先进方法的比较

1。一级检测器的类别不平衡问题

1.1.两级检测器

  • 在两级检测器中,例如更快的 R-CNN 、第一级,区域建议网络(RPN) 将候选物体位置的数量缩小到一个小的数量(例如 1–2k),过滤掉大部分背景样本。
  • 第二阶段,对每个候选对象位置执行分类采样试探法使用固定的前景与背景比率(1:3)或在线硬示例挖掘(OHEM) 为每个迷你批次选择一小组锚点(例如,256)。
  • 因此,在前景和背景之间有一个可管理的类平衡。

1.2.一级检测器

Many negative background examples, Few positive foreground examples

  • 一个更大的候选物体位置集合在一幅图像上被有规律地采样(大约 100k 个位置),这些位置密集地覆盖了空间位置、比例和纵横比。
  • 训练过程仍然由容易分类的背景例子主导。它通常通过引导或硬示例挖掘来解决。但是它们的效率不够高。

1.3.箱子数量比较

  • YOLOv1 : 98 盒
  • 约洛夫 2 : ~1k
  • 过吃:~ 1–2k
  • 固态硬盘:~ 8–26k
  • RetinaNet: ~100k 。RetinaNet 可以有大约 100k 个盒子,使用焦点损失解决等级不平衡问题。

2.焦点损失

2.1.交叉熵损失

  • 上面的等式是二元分类的 CE 损失。 y ∈{ 1}是地面实况类,而 p ∈[0,1]是模型的估计概率。很容易将其扩展到多类情况。为了便于标注,定义了 pt ,ce 改写如下:

  • 当对大量简单的例子求和时,这些小的损失值可以压倒罕见的类。下面是例子:

Example

  • 让我们以上图为例。如果我们有 100000 个简单的例子(每个 0.1)和 100 个困难的例子(每个 2.3)。当我们需要求和来估算 CE 损失时。
  • 简单例子的损失= 100000×0.1 = 10000
  • 硬例损失= 100×2.3 = 230
  • 10000 / 230 = 43.从简单的例子来看,损失大约大 40 倍。
  • 因此,当存在极端的阶级不平衡时,CE 损失不是一个好的选择。

2.2。 α- 平衡 CE 损失

  • 为了解决类别不平衡,一种方法是为类别 1 添加加权因子 α ,为类别 1 添加 1 - α
  • α 可以通过逆类频率设置,也可以作为超参数交叉验证设置。
  • 如在两级检测器处看到的,通过选择 1∶3 的前景与背景比率来隐含地实现 α

2.3.焦点损失

  • 损失函数被重塑为降低简单例子的权重,从而将训练集中在硬负面上。一个调制因子(1- pt )^ γ 被添加到交叉熵损失中,其中 γ 在实验中从[0,5]开始被测试。
  • FL 有两个属性:
  1. 当一个例子被错误分类并且 pt 很小时,调制因子接近 1,并且损失不受影响。当 pt →1 时,该因子变为 0,并且良好分类示例的损失被向下加权。
  2. 聚焦参数 γ 平滑地调整简单示例向下加权的速率。当 γ = 0 时,FL 相当于 CE。当 γ 增加时,调制因子的效果同样增加。( γ =2 在实验中效果最好。)
  • 例如,在 γ = 2 的情况下,与 ce 相比,分类为 pt = 0.9 的示例将具有低 100 的损耗,而分类为 pt = 0.968 的示例将具有低 1000 的损耗。这反过来增加了纠正错误分类的例子的重要性。
  • pt ≤ 0.5 且γ = 2 时,损耗最多降低 4 倍。

2.4.FL 的α平衡变体

  • 上述形式用于实践中的实验,其中将 α 添加到方程中,这产生了比没有 α 的方程略微提高的精度。并使用 sigmoid 激活函数计算 p 导致更大的数值稳定性
  • γ :多关注硬例。
  • α :抵销类实例数的不平衡。

2.5.模型初始化

  • 在训练开始时,为 p 的值设置一个先验π,使得模型对于稀有类的估计 p 较低,例如 0.01 ,以提高严重类不平衡情况下的训练稳定性。
  • 发现训练 RetinaNet 使用标准 CE 损耗而没有使用先验π 进行初始化,导致网络在训练时发散,最终失败。
  • 并且结果对π的精确值不敏感。π = 0.01 用于所有实验。

3.视网膜网探测器

RetinaNet Detector Architecture

3.1.(a)和(b)主干

  • ResNet 用于深度特征提取。
  • 特征金字塔网络(FPN) 在 ResNet 之上使用,用于从一个单一分辨率输入图像构建丰富的多尺度特征金字塔。(最初, FPN 是一个两级探测器,具有最先进的结果。如果有兴趣,请阅读我关于 FPN 的评论。)
  • FPN 是多尺度的,在所有尺度上语义都很强,并且计算速度很快。
  • 这里有一些对 FPN 的适度改变。从 P3 到 P7 生成一个金字塔。一些主要的变化是:由于计算的原因,现在不使用 P2。(ii)通过步长卷积而不是下采样来计算 P6。(iii)额外包括 P7 以提高大物体检测的精度。

3.2.锚

  • 主播分别在从 P3 到 P7 的金字塔等级上有 32 到 512 的区域。
  • 使用三种长宽比{1:2,1:1,2:1}
  • 对于更密集的规模覆盖,在每个金字塔等级添加大小为{2⁰、2^(1/3、的锚。
  • 总共,每级 9 个锚
  • 跨等级,比例覆盖从 32 到 813 像素
  • 每个锚,都有一个长度 K 一个分类目标的热向量 (K:类数)一个盒回归目标的 4 向量
  • 使用 IoU 阈值 0.5 将锚点分配给地面实况对象框,如果 IoU 在[0,0.4】中,则将其分配给背景。每个锚点最多被分配一个对象框,并在那个 K one-hot vector 中设置相应的类条目为 1,所有其他条目为 0。如果锚未赋值如果 IoU 在【0.4,0.5】中并且在训练期间被忽略。
  • 长方体回归计算为锚点和指定对象长方体之间的偏移,如果没有指定,则忽略该值。

3.3.(c)分类子网

  • 这个分类子网为每个 A 锚和 K 物体类别预测在每个空间位置物体存在的概率。
  • 子网是一个 FCN ,它应用了四个 3×3 conv 层,每个层都有 C 滤波器,每个层后面都有 ReLU 激活,后面是一个 3×3 conv 层,有 KA 滤波器。( K 类, A =9 个锚点, C = 256 个过滤器)

3.4.(d)箱式回归子网

  • 该子网是每个金字塔等级的 FCN ,用于回归从每个锚框到附近地面实况对象(如果存在)的偏移。
  • 它与分类子网相同,除了它终止于每个空间位置的 4 A 线性输出。
  • 它是一个类别不可知的包围盒回归器,使用较少的参数,被发现同样有效。

3.5.推理

  • 在阈值检测器置信度为 0.05 之后,网络仅解码来自的每个FPN等级的最多 1k 最高得分预测的框预测。
  • 来自所有级别的顶部预测被合并并且阈值为 0.5 的非最大抑制(NMS)被应用以产生最终检测。

3.6.培养

  • 因此,在训练期间,图像的总聚焦损失被计算为所有 100k 个锚的聚焦损失的总和,由分配给地面实况框的锚的数量归一化。
  • 使用 ImageNet1K 预训练的 ResNet-50-FPN 和 ResNet-101-FPN 。

4.消融研究

  • 使用 COCO 数据集。COCO trainval35k 分体用于训练。并且 minival (5k) split 用于验证

α for CE loss (Left), γ for FL (Right)

4.1. α为α-平衡 CE 损耗

  • 使用 ResNet-50 。
  • 首先,测试不同α下的α平衡 CE 损耗。
  • α = 0.75 时,增益为 0.9 AP。

4.2. γ 为 FL

  • γ=0 是α平衡的 CE 损耗。
  • 当γ增加时,简单的例子会被贴现到损失中。
  • γ=2,α=0.25,比α平衡 CE 损耗(α=0.75)提高了 2.9 AP。
  • 据观察,较低的α选择较高的γ
  • 改变的好处要大得多,事实上,最佳α的范围仅为[0.25,0.75],α∈[:01;:999]已测试。

Cumulative distribution functions of the normalized loss for positive and negative samples

4.3.前景和背景样本分析

前景样本

  • 对从最低到最高的损失进行排序,并绘制正负样本和不同γ设置的累积分布函数(CDF)。
  • 大约 20%的最难阳性样本占阳性损失的大约一半。
  • 随着γ的增加,更多的损失集中在前 20%的例子中,但是影响很小。

背景样本

  • 随着γ的增加,更多的重量集中在硬反例上。
  • 绝大多数损失来自一小部分样本。
  • FL 可以有效地降低容易否定的影响,将所有注意力集中在难否定的例子上。

4.4.锚密度

Different Number of Scales (#sc) and Aspect Ratios (#ar)

  • 使用一个方形锚(#sc=1,#ar=1)实现了 30.3%的 AP,这还不错。
  • 使用 3 个尺度和 3 个长宽比,AP 可以提高近 4 个点(34.0)。
  • 增加超过 6-9 个锚不会显示进一步的收益。

4.5.佛罗里达州对 OHEM(在线硬示例挖掘)

FL vs OHEM (Online Hard Example Mining)

  • 这里使用 ResNet-101 。
  • 在 OHEM,每个示例根据其损失评分,然后应用非最大抑制(NMS ),并使用最高损失示例构建一个小批次。
  • 像焦点损失一样,OHEM 更加强调错误分类的例子。
  • 但是与 FL 不同,OHEM 完全抛弃了简单的例子。
  • 在将 nms 应用于所有示例后,构建迷你批处理以强制正负比例为 1:3。
  • OHEM 的最佳设置(比例不为 1:3,批量为 128,NMS 为 0.5)达到 32.8%的 AP。
  • 而 FL 获得 36.0% AP,即差距 3.2 AP,证明了 FL 的有效性。
  • 注:作者还测试了铰链损耗,其中损耗在 pt 的某个值以上设置为 0。但是,训练是不稳定的。

5。与最先进方法的比较

5.1.速度与精度的权衡

Speed versus Accuracy

  • retina net-101–600:retina net 配有 ResNet-101-FPN 和 600 像素的图像比例,与最近发布的 ResNet-101-FPN 更快的 R-CNN (FPN) 的精确度相当,同时每张图像的运行时间为 122 毫秒,而不是 172 毫秒(均在 Nvidia M40 GPU 上测量)。
  • 更大的主干网络产生更高的准确性,但也降低了推理速度。
  • 培训时间从 10 小时到 35 小时不等。
  • 使用更大的规模允许 RetinaNet 超越所有两阶段方法的准确性,同时仍然更快。
  • 除了 YOLOv2 (目标是极高的帧率),RetinaNet 的表现优于 SSD 、 DSSD 、 R-FCN 和 FPN 。
  • 对于更快的运行时间,只有一个工作点(500 像素输入),在这个点上使用 ResNet-50-FPN 的 RetinaNet 比使用 ResNet-101-FPN 的 retina net 有所改进。

5.2.最先进的精确度

Object detection single-model results (bounding box AP), vs. state-of-the-art on COCO test-dev

  • RetinaNet 使用ResNet-101-FPN:retina net-101–800模型使用比例抖动训练,比表(5.1)中的模型长 1.5 倍。
  • 与现有的单级检测器相比,它与最接近的竞争对手 DSSD 的 AP 差距为 5.9 点(39.1 对 33.2)。
  • 与最近的两阶段方法相比,RetinaNet 比基于Inception-ResNet-v2-TDM的表现最好的更快的 R-CNN 模型高出 2.3 个点。(如果有兴趣,请阅读我关于 Inception-ResNet-v2 和 TDM 的评测。)
  • RetinaNet 使用ResNeXt-101-FPN:插上ResNeXt-32x8d-101-FPN【38】作为 RetinaNet 主干,成绩再提升 1.7 AP,超过 COCO 上的 40 AP。(如果有兴趣,请阅读我关于 ResNeXt 的评论。)

通过使用焦点损耗,可以在简单样本和困难样本之间自适应地平衡总损耗。

参考

【2017 ICCV】【retina net】
密集物体探测的焦损失

我的相关评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC

语义切分 FCNde convnetdeeplab v1&deeplab v2parse net】dilated netPSP netdeeplab v3

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet

实例分割
[深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

超分辨率 Sr CNNfsr CNNVDSRESPCN红网】

复习:SegNet(语义分割)

原文:https://towardsdatascience.com/review-segnet-semantic-segmentation-e66f2e30fb96?source=collection_archive---------4-----------------------

编码器解码器架构使用最大池索引进行上采样,性能优于 FCN、DeepLabv1 和 DeconvNet

SegNet by Authors (https://www.youtube.com/watch?v=CxanE_W46ts)

在这个故事中,剑桥大学SegNet 做了简要回顾。最初,它被提交到 2015 年 CVPR,但最终它没有在 CVPR 出版(但它是 2015 arXiv tech report 版本,仍然获得了 100 多次引用)。而是发表在 2017 TPAMI 超过 1800 次引用。而现在第一作者已经成为 Magic Leap Inc .(Sik-Ho Tsang@ Medium)深度学习和 AI 的总监

以下是作者的演示:

SegNet by Authors (https://www.youtube.com/watch?v=CxanE_W46ts)

还有一个有趣的演示,我们可以选择一个随机的图像,甚至上传我们自己的图像来尝试 SegNet。我做了如下尝试:

  • http://mi.eng.cam.ac.uk/projects/segnet/demo.php

The segmentation result for a road scene image that I found from internet

概述

  1. 编码器解码器架构
  2. 与 DeconvNet 和 U-Net 的区别
  3. 结果

1。编码器解码器架构

SegNet: Encoder Decoder Architecture

  • SegNet 有一个编码器网络和一个相应的解码器网络,后面是最终的逐像素分类层。

1.1.编码器

  • 在编码器处,执行卷积和最大池。
  • VGG-16 有 13 个卷积层。(原始的完全连接的层被丢弃。)
  • 进行 2×2 最大汇集时,会存储相应的最大汇集索引(位置)。

1.2.解码器

Upsampling Using Max-Pooling Indices

  • 在解码器处,执行上采样和卷积。最后,每个像素都有一个 softmax 分类器。
  • 在上采样期间,如上所示,调用相应编码器层的最大池索引来进行上采样。
  • 最后,使用 K 类 softmax 分类器来预测每个像素的类别。

2。与 DeconvNet 和 U-Net 的区别

DeconvNet 和 U-Net 的结构与 SegNet 类似。

2.1.与解除配置的区别

  • 使用类似的被称为解组的上采样方法。
  • 然而,存在使模型更大的完全连接的层。

2.2.与 U-Net 的差异

  • 它用于生物医学图像分割。
  • 代替使用汇集索引,整个特征映射从编码器传输到解码器,然后连接以执行卷积。
  • 这使得模型更大,需要更多的内存。

3.结果

  • 尝试了两个数据集。一个是用于道路场景分割的 CamVid 数据集。一个是用于室内场景分割的 SUN RGB-D 数据集。

3.1.用于道路场景分割的 CamVid 数据集

Compared With Conventional Approaches on CamVid dataset for Road Scene Segmentation

  • 如上所示,SegNet 在许多类上都取得了非常好的结果。它还获得了最高的班级平均水平和全球平均水平。

Compared With Deep Learning Approaches on CamVid dataset for Road Scene Segmentation

  • SegNet 获得最高的全局平均精度(G)、类平均精度(C)、mIOU 和边界 F1-measure (BF)。它胜过 FCN 、 DeepLabv1 和 DeconvNet 。

Qualitative Results

3.2.用于室内场景分割的太阳 RGB-D 数据集

  • 仅使用 RGB,不使用深度(D)信息。

Compared With Deep Learning Approaches on SUN RGB-D Dataset for Indoor Scene Segmentation

  • 同样,SegNet 的表现优于 FCN 、 DeconvNet 和 DeepLabv1 。
  • SegNet 对于 mIOU 来说只比 DeepLabv1 差了一点点。

Class Average Accuracy for Different Classes

  • 大规模班级的精确度更高。
  • 小规模班级的精确度较低。

Qualitative Results

3.3.记忆和推理时间

Memory and Inference Time

  • SegNet 比 FCN 和 DeepLabv1 要慢,因为 SegNet 包含解码器架构。而且它比 DeconvNet 更快,因为它没有完全连接的层。
  • 并且 SegNet 在训练和测试期间都具有低的内存需求。而且型号尺寸远小于 FCN 和de convent。

参考

【2015 arXiv】【seg net】
seg net:一种深度卷积编码器-解码器架构,用于鲁棒的语义像素式标记

【2017 TPAMI】【SegNet】
SegNet:一种用于图像分割的深度卷积编解码架构

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(们)(还)(不)(想)(到)(这)(些)(人)(们)(,)(我)(们)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(们)(还)(没)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(里)(去)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(里)(去)(了)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(到)(这)(里)(来)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC yolo 9000[yolov 3][FPN][retina net][DCN]

语义切分 FCNde convnetdeeplab v1&deeplab v2parse net】dilated netPSP netdeeplab v3

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet

实例分割
[深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

)( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )(

综述:SENet —挤压和激励网络,ILSVRC 2017(图像分类)获奖者

原文:https://towardsdatascience.com/review-senet-squeeze-and-excitation-network-winner-of-ilsvrc-2017-image-classification-a887b98b2883?source=collection_archive---------6-----------------------

凭借 SE 积木,超越 ResNet 、盗梦空间-v4 、 PolyNet 、 ResNeXt 、 MobileNetV1 、 DenseNet 、 PyramidNet 、 DPN 、 ShuffleNet V1

SENet got the first place in ILSVRC 2017 Classification Challenge

在这个故事里,回顾了牛津大学压缩-激发网络(SENet) 。利用“挤压-激励”(SE)模块,通过显式模拟通道之间的相互依赖性,自适应地重新校准通道式特征响应,构建 SENet。并且在 ILSVRC 2017 分类挑战赛中以 2.251%的前 5 名误差获得第一名,相对于 2016 年的获奖参赛作品有大约 25%的提升。而这是一篇在 2018 CVPR 超过 600 次引用的论文。最近还发表在 2019 TPAMI 上。( Sik-Ho Tsang @中)

概述

  1. 挤压和激励(SE)块
  2. SE-Inception&SE-ResNet
  3. 与最先进方法的比较
  4. 分析解释

1。挤压和激励(SE)模块

Squeeze-and-Excitation (SE) Block

  • 其中 Ftr 是将 X 转换为 U 的卷积算子。
  • 这个 Ftr 可以是残差块或者 Inception 块,后面会更详细的提到。

  • 其中 V =[ v 1, v 2,…, v c]为学习后的滤波器核集合。

1.1.挤压:全球信息嵌入

SE Path, Same as the Upper Path at the Figure Above

  • 变换输出 U 可以被解释为局部描述符的集合,其统计表示整个图像
  • 建议将全局空间信息压缩到通道描述符中。
  • 这是通过使用全局平均池生成渠道统计数据来实现的。

1.2.激发:自适应重新校准

  • 其中,δ是 ReLU 函数。
  • 使用了一个使用 sigmoid 激活σT21的简单浇口机制。
  • 提出了一种激励操作,以便完全捕获通道相关,并且学习通道之间的非线性和非互斥关系
  • 我们可以看到有 W 1 和 W 2,输入 z 是全局平均池化后的通道描述符,有两个全连接(FC)层
  • 使用缩减比率r通过维度缩减形成具有两个 FC 层的瓶颈。

  • 引入的附加参数的数量取决于如上所述的 r 其中 S 指的是级的数量(其中每一级指的是在公共空间维度的特征图上操作的块的集合) Cs 表示输出通道的维度Ns 表示

  • ****块的最终输出是通过用激活重新调整变换输出 U 获得的,如上所示。
  • 激活充当适应于输入特定描述符 z 的通道权重。在这方面, SE 模块本质上引入了以输入为条件的动态,有助于提高特征的可辨性。

2。SE-Inception & SE-ResNet

Left: SE-Inception, Right: SE-ResNet

  • 如上图所示,SE 块可以作为 SE-InceptionSE-ResNet 轻松添加到 Inception 和 ResNet 块中。
  • 特别是在 SE-ResNet 中,压缩和激发都在同分支求和之前起作用。
  • 更多与 ResNeXt Inception-ResNetmobilenetv 1shuffle net V1可以按照类似的方案构造
  • SE-ResNet-50SE-ResNeXt-50 (32×4d) 更详细的架构如下:

ResNet-50 (Left), SE-ResNet-50 (Middle), SE-ResNeXt-50 (32×4d) (Right)

3.与最先进方法的比较****

3.1. ImageNet 验证集的单作物错误率****

Single-Crop Error Rates (%) on ImageNet Validation Set

  • SE 块被添加到 ResNet 、 ResNeXt 、 VGGNet 、 BN-Inception 和 Inception-ResNet-v2 。对于 VGGNet 来说,为了更容易训练,在每次卷积后增加了批量归一化层。
  • 在训练期间,使用256 个图像的小批量,通过 ResNet-50 的单次前后传递需要 190 毫秒,相比之下,SE-ResNet-50 的需要 209 毫秒(这两个计时都是在具有 8 个 NVIDIA Titan X GPU的服务器上执行的)。****
  • 在测试过程中,对于 224 × 224 像素的输入图像,每个型号的 CPU 推断时间:ResNet-50需要 164 ms** ,相比之下,SE-ResNet-50 的**需要 167 ms。****
  • 值得注意的是, SE-ResNet-50 实现了 6.62%单作物 top-5 验证误差,超过ResNet-50(7.48%)0.86%****接近更深层次的 ResNet-101 网络实现的性能****
  • SE-ResNet-101 (6.07% top-5 误差)不仅匹配,而且跑赢更深层次的ResNet-152网络(6.34% top-5 误差)0.27%** 。**
  • 同样, SE-ResNeXt-50 的 top-5 误差为 5.49% ,不仅优于其直接对应的ResNeXt-50(5.90%top-5 误差),也优于更深层次的ResNeXt-101(5.57%【T6)****
  • SE-Inception-ResNet-v2(4.79%top-5 error)优于重新实现的Inception-ResNet-v2(5.21%top-5 error)0.42%(相对提高 8.1%)
  • 在一系列不同深度的训练中,性能改进是一致的,这表明 SE 模块带来的改进可以与增加基础架构的深度结合使用。

Single-Crop Error Rates (%) on ImageNet Validation Set

  • 对于轻量级模型, MobileNetV1 和 ShuffleNet V1 , SE 模块可以在最小的计算成本增加下持续大幅度提高精度

3.2.ILSVRC 2017 分类竞赛

Single-Crop Error Rates (%) on ImageNet Validation Set

  • 使用了多尺度、多作物和集合。
  • 在测试集上得到 2.251%的 top-5 误差。
  • 在验证集 SENet-154 上,使用 224 × 224 中心作物评估,具有修改的ResNeXt的 SE 块实现了 18.68%的前 1 误差和 4.47%的前 5 误差
  • 比 ResNet 、 Inception-v3 、 Inception-v4 、 Inception-ResNet-v2 、 ResNeXt 、 DenseNet 、剩余注意力网络、 PolyNet 、 PyramidNet 、 DPN 。

3.3.场景分类

Single-crop error rates (%) on Places365 validation set

  • SE-ResNet-152(11.01%top-5 误差)实现了比ResNet-152(11.61%top-5 误差)更低的验证误差,提供了 SE 块可以在不同数据集上表现良好的证据。********
  • 并且 SENet 超过了之前最先进的模型 place 365-CNN,其前 5 名误差为 11.48%。

3.4.COCO 上的对象检测

Object detection results on the COCO 40k validation set by using the basic Faster R-CNN

  • 更快的 R-CNN 用作检测网络。
  • 在 COCO 的标准指标 AP 和 AP@IoU=0.5 上, SE-ResNet-50 比ResNet-50高出 1.3% (相对提高了 5.2%)。
  • 重要的是,在 AP 指标上,SE 模块能够使更深层的架构 ResNet-101 受益 0.7%(相对提高 2.6%)。

4。分析和解释

4.1.减速比 r

Single-Crop Error Rates (%) on ImageNet Validation Set

  • **r = 16 在准确性和复杂性**之间取得了良好的平衡,因此,该值用于所有实验。

4.2.激励的作用

Activations induced by Excitation in the different modules of SE-ResNet-50 on ImageNet.

  • 对于上述 5 个类别,从验证集中为每个类别抽取 50 个样本,并计算每个阶段中最后 SE 块中 50 个均匀采样的通道的平均激活。
  • 首先,在较低层,例如 SE_2_3,特征信道的重要性可能由网络早期阶段的不同类别共享。
  • 第二,在更大的深度,例如 SE_4_6 和 SE_5_1,每个通道的值变得更加特定于类别,因为不同的类别对特征的区别值表现出不同的偏好。
  • 结果,表示学习受益于由 SE 块引起的重新校准,这在需要的程度上自适应地促进了特征提取和专门化。
  • 最后,最后一级,即 SE_5_2,呈现出一种有趣的趋势趋向饱和状态,其中大部分激活接近 1,其余接近 0。在 SE_5_3 中也发现了类似的模式,只是尺度略有变化。
  • 这表明在向网络提供重新校准时,SE 5 2 和 SE 5 3 没有以前的模块重要。
  • 通过移除最后一级的 SE 模块,可以显著减少总参数数量,而性能损失很小。

SE 模块通过使网络能够执行动态的逐通道特征再校准来提高网络的代表性容量。

参考

【2018 CVPR】【塞内】
压缩-激发网络

【2019 TPAMI】【SENet】
压缩和激励网络

我以前的评论

)(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(我)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(?)(我)(们)(都)(不)(在)(这)(些)(情)(况)(上)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(好)(好)(的)(情)(感)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(好)(的)(情)(情)(况)(。 PyramidNet DRN DPN 残留注意网络 MSDNet ShuffleNet V1

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [G-RMI][TDM][SSD][DSSD][约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3[FPN[视网膜网[DCN

语义切分 FCNde convnetdeeplabv 1&deeplabv 2CRF-RNN】SegNet】parse netdilated netDRNRefineNet

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN

实例分割 SDS Hypercolumn DeepMask SharpMask MultiPathNet MNC InstanceFCN FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

人体姿态估计
深度姿态汤普逊·尼普斯 14汤普逊·CVPR 15

综述:抖动正则化(图像分类)

原文:https://towardsdatascience.com/review-shake-shake-regularization-image-classification-d22bb8587953?source=collection_archive---------17-----------------------

在训练过程中给梯度添加噪声的概念,胜过 WRN 、雷斯 NeXt 和登森特。

在这个故事中,来自伦敦商学院Xavier GastaldiShake-Shake 正则化(Shake-Shake) 被简要回顾。本文的动机是在输入图像上应用数据增强,也可能将数据增强技术应用于内部表示

在现有技术中发现,在训练期间向梯度添加噪声有助于复杂神经网络的训练和泛化。并且摇动-摇动正则化可以被视为这个概念的扩展,其中梯度噪声被一种形式的梯度增强所取代。这是 2017 ICLR 研讨会上的一篇论文,被引用 10 多次。而 2017 arXiv 中的长版已经获得了 100 次引用。( Sik-Ho Tsang @中)

概述

  1. 抖动调整
  2. 实验结果
  3. 进一步评估

1。抖动调整

Left: Forward training pass. Center: Backward training pass. Right: At test time.

  • 特别是,本文研究的三分支ResNet如上图所示,方程如下:

  • 通过抖动调整,增加了 α :

  • α 在测试时间内设置为 0.5,就像 Dropout 一样。

2。实验结果

2.1.CIFAR-10

  • 使用 26 个 2×32d ResNet (即网络深度为 26,2 个剩余分支,第一个剩余块宽度为 32)。
  • ****摇动:在通过之前,所有的缩放系数都被新的随机数覆盖。
  • ****偶数:所有缩放系数在通过之前都设置为 0.5。
  • ****保持:对于后向通道,保持前向通道使用的缩放系数。
  • ****批次:对于每个残差块 i ,相同的缩放系数应用于小批次中的所有图像。
  • ****图像:对于每个残差块 i ,对小批量中的每个图像应用不同的缩放系数。

Error Rates of CIFAR-10

  • 在向前传球时使用 Shake 有更好的表现。
  • 并且Shake-Shake-Image(S-S-I)对于 26 个 2×64d ResNet 和 26 个 2×96d ResNet 获得最佳结果。

2.2.西发尔-100

Error Rates of CIFAR-100

  • 在向前传球时再次使用摇动可以提高性能。
  • 特别地,抖动平均图像(S-E-I)是最好的。

2.3.与最先进方法的比较

Test error (%) and Model Size on CIFAR

  • 在 CIFAR-10 上,S-S-I 的表现超过了 WRN 、雷斯 NeXt 和登盛内特。
  • 在 CIFAR-100 上,S-E-I 的表现也超过了 WRN 、雷斯 NeXt 和登盛内特。

3.进一步评估****

3.1.剩余分支之间的相关性

  • 为了计算相关性,首先转发 mini-batch,通过残差分支 1 和将输出张量存储在 yi (1)中。类似于剩余分支 2,并将其存储在 yi (2)中。
  • 然后将** (1)和 (2)分别展平为 flati (1)和 flati (2)。并且计算 2 个向量中每个对应项之间的协方差。**
  • ****计算 flati (1)和 flati (2)的方差
  • 重复直到测试集中的所有图像。使用得到的协方差和方差计算相关性。****

Correlation results on E-E-B and S-S-I models

  • 首先,2 个剩余分支的输出张量之间的相关性似乎通过正则化而降低。这将支持一个假设,即正规化迫使分支机构学习不同的东西

Layer-wise correlation between the first 3 layers of each residual block

  • 残差块末尾的求和迫使左和右残差分支上的层对齐。
  • 正则化降低了相关性。

3.2.正则化强度

Update Rules for β

Left: Training curves (dark) and test curves (light) of models M1 to M5. Right: Illustration of the different methods in the above Table.

  • βα 越远,正则化效果越强。

3.3.删除跳过连接/批处理规范化

  • 建筑 A 为 26 2×32d,但没有跳接。
  • 架构 B 与 A 相同,但每个分支只有 1 个卷积层,块数是 A 的两倍。
  • 架构 C 与 A 相同,但没有批处理规范化。

Error Rates of CIFAR-10

  • 架构 A 的结果清楚地表明抖动正则化甚至可以在没有跳跃连接的情况下工作。
  • 架构 B 的结果显示**正则化不再起作用。**
  • ****架构 C 使得模型难以收敛,使得模型更加敏感。也很容易使模型发散。

凭借简单而新颖的想法和积极的成果,它在 2017 年 ICLR 研讨会上发表,这非常令人鼓舞。

参考

【2017 arXiv】【摇一摇】
摇一摇正规化

【2017 ICLR 研讨会】【摇一摇】
三分支残差网络的摇一摇正则化

我以前的评论

)(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(我)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(?)(我)(们)(都)(不)(在)(这)(些)(情)(况)(上)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(好)(好)(的)(情)(感)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(好)(的)(情)(情)(况)(。 [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [G-RMI][TDM][SSD][DSSD][约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3[FPN[视网膜网[DCN

语义切分 FCNde convnetdeeplabv 1&deeplabv 2CRF-RNN】SegNet】parse netdilated netDRNRefineNet

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN

实例分割 SDS Hypercolumn DeepMask SharpMask MultiPathNet MNC InstanceFCN FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

人体姿态估计
深度姿态汤普森·尼普斯 14汤普森·CVPR 15CPM]

回顾:shuffle net V1-轻量级模型(图像分类)

原文:https://towardsdatascience.com/review-shufflenet-v1-light-weight-model-image-classification-5b253dfe982f?source=collection_archive---------7-----------------------

通过频道洗牌,性能优于 MobileNetV1

ShuffleNet, Light Weight Models for Limited Computational Budget Devices such as Drones (https://unsplash.com/photos/DiTiYQx0mh4)

在这个故事里,对旷视科技公司【Face ++】出品的 ShuffleNet V1 进行了简要回顾。ShuffleNet 在数十或数百 MFLOPs 的非常有限的计算预算中追求最佳精度,专注于常见的移动平台,如无人机机器人智能手机。通过混洗频道,ShuffleNet 胜过了 MobileNetV1 。在 ARM 设备中,ShuffleNet 比 AlexNet 实现了 13 倍的实际加速,同时保持了相当的精度。这是一篇 2018 CVPR 的论文,引用超过 300 次。( Sik-Ho Tsang @中)

概述

  1. 群组卷积的信道混洗
  2. 洗牌机单元
  3. ShuffleNet 架构
  4. 消融研究
  5. 与最先进方法的比较

1。群组卷积的信道混洗

(a) Two Stacked Group Convolutions (GConv1 & GConv2), (b) Shuffle the channels before convolution, (c) Equivalent implementation of (b)

  • 组卷积用于Alex netResNeXt
  • (a) :没有通道混洗,每个输出通道只与组内的输入通道相关。这个特性阻断了通道组之间的信息流,削弱了代表性
  • (b) :如果我们允许组卷积获得不同组的输入数据,那么输入和输出通道将完全相关。
  • 【c】😦 b)中的操作可以通过信道混洗操作来高效且优雅地实现。假设一个卷积层有 g 个组,其输出有 g × n 个信道;我们先用输出的通道尺寸整形为( gn ),转置,然后将其展平作为下一层的输入。
  • 信道混洗也是可微分的,这意味着它可以嵌入到网络结构中用于端到端训练

2.洗牌机单元

(a) bottleneck unit with depthwise convolution (DWConv), (b) ShuffleNet unit with pointwise group convolution (GConv) and channel shuffle, (c) ShuffleNet unit with stride = 2.

  • (a)瓶颈单元:这是一个标准的剩余瓶颈单元,但是使用了深度方向卷积。(深度方向卷积用于MobileNetV1)。)使用 1×1 然后 3×3 DW 然后 1×1 卷积,它也可以被视为 MobileNetV2 中使用的深度方向可分离卷积的瓶颈类型。
  • (b) ShuffleNet 单元:第一个和第二个 1×1 卷积被组卷积替换。在第一个 1×1 卷积之后,应用通道混洗。
  • (c)Stride = 2 的 ShuffleNet 单元:应用 Stride 时,在快捷路径上添加 3×3 平均池。此外,逐元素相加被信道级联取代,这使得很容易以很少的额外计算成本来扩大信道维度。
  • 给定输入c×h×w和瓶颈通道 m , ResNet 单元要求HW(2cm+9m)FLOPs 和 ResNeXt 要求 hw (2 cm
  • 换句话说,给定计算预算, ShuffleNet 可以使用更宽的特征地图。我们发现这对小型网络来说至关重要,因为小型网络通常没有足够数量的通道来处理信息。

3。ShuffleNet 架构

ShuffleNet Architecture

  • 所提出的网络主要由分成三级的一堆洗牌网络单元组成。
  • 对于每个洗牌机单元,瓶颈通道的数量被设置为输出通道的 1/4。
  • 一个比例因子 s 应用于通道的数量。上表中的网络表示为“ShuffleNet 1×”,那么“ShuffleNet s ×”意味着将 ShuffleNet 1×中的滤波器数量缩放了 s 倍,因此总体复杂度将大致为 ShuffleNet 1×的 s 倍。

4。消融研究

  • 使用 ImageNet 2012 分类验证集。

4.1.不同数量的组卷积 g

Different number of group convolutions g

  • 其中 g = 1,即没有逐点群卷积。
  • 具有组卷积( g > 1)的模型始终比没有点态组卷积( g = 1)的模型表现得更好。
  • 较小的模型往往从群体中获益更多。
  • 例如,对于 ShuffleNet 1 倍的最佳条目( g = 8)比对应条目好 1.2%,而对于 ShuffleNet 0.5 倍和 0.25 倍,差距分别变为 3.5%和 4.4%。
  • 对于某些型号(如 ShuffleNet 0.5×)当组数变得相对较大(如 g = 8)时,分类得分饱和甚至下降。随着组号的增加(因此特征映射更宽),每个卷积滤波器的输入通道变得更少,这可能损害表示能力。

4.2.洗牌还是不洗牌

Shuffle vs No Shuffle

  • 频道洗牌持续提升不同设置的分类分数,这显示了跨组信息交换的重要性。

5。与最先进方法的比较

5.1.与其他结构单元的比较

Comparison with Other Structure Units

  • VGGNet 、 ResNet 、exception和 ResNeXt 没有完全探索低复杂度条件。
  • 为了公平比较,在上表中,具有其他结构的阶段 2-4 中的洗牌网络单元被其他网络的单元替换,然后调整通道的数量以确保复杂度保持不变。
  • 在不同的复杂性下,ShuffleNet 模型的表现远远超过大多数其他模型。
  • 例如,在 38 MFLOPs 的复杂度下,类 VGG 、 ResNet 、 ResNeXt 、exception类 ShuffleNet 模型的阶段 4(见表 1)的输出通道分别为 50、192、192、288、576,这与精度的提高是一致的。
  • 由于需要调整的超参数太多,GoogLeNet 或 Inception 系列不包括在内。
  • 另一个名为 PVANET 的轻量级网络结构的分类误差为 29.7%,计算复杂度为 557 MFLOPs,而我们的 shuffle net 2×model(g= 3)的分类误差为 26.3%,计算复杂度为 524 MFLOPs。

5.2.与 MobileNetV1 的比较

Comparison with MobileNetV1

  • ShuffleNet 模型在所有复杂性方面都优于 MobileNetV1 。
  • 虽然 ShuffleNet 网络是专门为小模型设计的(< 150 MFLOPs), it is still better than MobileNetV1 计算成本较高,例如比 MobileNetV1 高 3.1%的精度,成本为 500 MFLOPs。
  • 简单的架构设计也使得为 ShuffeNets 配备最新技术变得容易,例如挤压和激励(SE)模块。(希望以后可以复习 SENet。)
  • 具有 SE 模块的 ShuffleNet 将 shuffle net 的 top-1 误差提高了 2 倍至 24.7%,但通常比移动设备上的“原始”shuffle net 慢 25%至 40%,这意味着实际加速评估对低成本架构设计至关重要。

5.3.与其他模型的比较

Comparison with Other Models

  • 在准确率差不多的情况下,ShuffleNet 比 VGGNet 、 GoogLeNet 、 AlexNet 和 SqueezeNet 效率要高得多。

5.4.概括能力

Object detection results on MS COCO

  • 这里,COCO minival 女士的图像用于测试。
  • 使用更快的 R-CNN 作为检测框架。
  • 将 ShuffleNet 2×与复杂度相当(524 对 569 MFLOPs)的 MobileNetV1 进行比较,我们的 ShuffleNet 2×在两种分辨率上都远远超过 MobileNetV1 。
  • ShuffleNet 1×在 600×分辨率上也获得了与 MobileNet 相当的结果,但复杂度降低了约 4 倍。
  • 作者推测这种显著的收益部分是由于 ShuffleNet 的简单的架构设计。

5.5.实际加速评估

Actual Speedup Evaluation on ARM device

  • 经验上 g = 3 通常在准确性和实际推断时间之间有一个适当的权衡。
  • 由于内存访问和其他开销,我们发现在我们的实现中,每 4 倍的理论复杂度降低通常会导致 2.6 倍的实际加速。
  • 与 AlexNet 相比,ShuffleNet 0.5×模型在分类精度相当的情况下仍然实现了~13×的实际加速比(理论加速比 18×)。

希望我能在未来的日子里回顾 V2 沙狐球网。😃

参考

【2018 CVPR】【shuffle net V1】
shuffle net:一种针对移动设备的极其高效的卷积神经网络

我以前的评论

)(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(我)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(?)(我)(们)(都)(不)(在)(这)(些)(情)(况)(上)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(情)(况)(,)(我)(们)(还)(没)(有)(什)(么)(好)(好)(的)(情)(感)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(好)(的)(情)(情)(况)(。 [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [G-RMI][TDM][SSD][DSSD][约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3[FPN[视网膜网[DCN

语义切分 FCNde convnetdeeplabv 1&deeplabv 2CRF-RNN】SegNet】parse netdilated netDRNRefineNet

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN

实例分割 [ SDS ] [ 超列 ] [ 深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

【DeepPose】【汤普森 NIPS'14】【汤普森 CVPR'15】

回顾:挤压网(图像分类)

原文:https://towardsdatascience.com/review-squeezenet-image-classification-e7414825581a?source=collection_archive---------4-----------------------

AlexNet 级精度,参数减少 50 倍

Jason Blackeye @jeisblack (Unsplash)

在这个故事里, SqueezeNet ,由 DeepScaleUC BerkeleyStanford University 进行回顾。在精度相当的情况下,较小的 CNN 架构至少有三个优势

  1. 较小的卷积神经网络(CNN)在分布式训练中需要较少的跨服务器通信
  2. 更小的 CNN 需要更少的带宽来从云端向自动驾驶汽车输出新的模型。
  3. 较小的 CNN 更适合部署在 FPGAs 和其他内存有限的硬件上。

这是 2016 年关于 arXiv 的技术报告,引用超过 1100 次。( Sik-Ho Tsang @中)

概述

  1. 建筑设计策略
  2. 消防模块
  3. SqueezeNet 架构
  4. 对 SqueezeNet 的评估

1。建筑设计策略

策略一。用 1×1 过滤器替换 3×3 过滤器

  • 给定一定数量卷积滤波器的预算,我们可以选择将大多数滤波器设为 1×1,,因为 1×1 滤波器的参数比 3×3 滤波器少 9 倍

策略二。将输入通道的数量减少到 3 个×3 个滤波器

  • 考虑一个完全由 3 个×3 个滤镜组成的卷积层。该层中的参数总数为:
  • (输入通道数) × (滤波器数) × (3 × 3)
  • 我们可以使用挤压层将输入通道的数量减少到 3×3 滤波器,这将在下一节中提到。

策略三。在网络后期进行下采样,以便卷积图层具有较大的激活图

  • 直觉是大的激活图(由于延迟的下采样)可以导致更高的分类精度

摘要

  • 策略 1 和 2 是关于明智地减少 CNN 中的参数数量,同时试图保持准确性。
  • 策略 3 是在有限的参数预算下最大限度地提高精度。

2。消防模块

Fire Module with hyperparameters: s1x1 = 3, e1x1 = 4, and e3x3 = 4

  • Fire 模块包括:一个挤压卷积层(只有 1×1 个滤波器),进入一个扩展层,该层混合了 1×1 和 3×3 个卷积滤波器
  • Fire 模块中有三个可调维度(超参数):s1×1、e1×1 和 e3×3。
  • s1×1:挤压层中 1×1 的个数。
  • e1×1 和 e3×3:膨胀层中 1×1 和 3×3 的数量。
  • 当我们使用 Fire 模块时,我们将 s1×1 设置为小于(e1×1 + e3×3),因此挤压层有助于限制 3×3 滤波器的输入通道数量,如前一节中的策略 2 所示。
  • 对我来说,这很像《T2》的《盗梦空间》模块。

3. SqueezeNet 架构

SqueezeNet (Left), SqueezeNet with simple bypass (Middle), SqueezeNet with complex bypass (Right)

Details of SqueezeNet Architecture

  • SqueezeNet(左):从一个独立的卷积层(conv1)开始,接着是 8 个 Fire 模块(Fire 2–9),最后是一个 conv 层(conv10)。
  • 从网络的起点到终点,每个消防模块的过滤器数量逐渐增加。
  • 跨距为 2 的最大池在层 conv1、fire4、fire8 和 conv10 之后执行。
  • 带简单旁路的 SqueezeNet(中)和带复杂旁路的 SqueezeNet(右):旁路的使用灵感来自 ResNet 。

4.对 SqueezeNet 的评估

4.1.SqueezeNet 与模型压缩方法的比较

Comparing SqueezeNet to model compression approaches

  • Alex net相比,使用 SqueezeNet,我们实现了 50 倍的模型尺寸缩减,同时满足或超过了Alex net的前 1 和前 5 精度。
  • 并且模型规模缩减远高于 SVD、网络剪枝和深度压缩。
  • 应用 8 位量化的深度压缩,SqueezeNet 产生了一个 0.66 MB 的模型(比 32 位的 Alex net 小 363 倍),其精度与 T2 的 Alex net 相当。此外,在 SqueezeNet 上应用 6 位量化和 33%稀疏度的深度压缩,这是一个 0.47MB 的模型(比 32 位 AlexNet 小 510 倍),具有同等的精度。SqueezeNet 确实经得起压缩。

4.2.超参数

Different Hyperparameter Values for SqueezeNet

  • 挤压比(SR)(左):挤压层中的过滤器数量与膨胀层中的过滤器数量之比。
  • 将 SR 提高到 0.125 以上,可以进一步将 ImageNet top-5 的准确率从 4.8MB 模型的 80.3%(即Alex net-级)提高到 19MB 模型的 86.0%。精度稳定在 86.0%,SR = 0.75(19MB 模型),设置 SR=1.0 会进一步增加模型大小,但不会提高精度。
  • 3×3 过滤器的百分比(右):使用 50%的 3×3 过滤器时,前 5 名的精确度稳定在 85.6%,进一步增加 3×3 过滤器的百分比会导致更大的模型尺寸,但不会提高 ImageNet 的精确度。

4.3.挤压网变体

SqueezeNet accuracy and model size using different macroarchitecture configurations

  • 复杂和简单的旁路连接都比普通的 SqueezeNet 架构有了更高的精度。
  • 有趣的是,简单旁路比复杂旁路能够实现更高的准确度。
  • 在不增加模型尺寸的情况下,增加简单的旁路连接使前 1 名精度提高了 2.9 个百分点,前 5 名精度提高了 2.2 个百分点。

使用 Fire 模块,可以在保持预测精度的同时减小模型尺寸。

参考

【2016 arXiv】【SqueezeNet】
SqueezeNet:Alex net 级别的精度,参数少 50 倍,< 0.5MB 模型大小

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(没)(有)(什)(么)(好)(的)(情)(情)(感)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [G-RMI][TDM][SSD][DSSD][约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3[FPN[视网膜网[DCN

语义切分 FCNde convnetdeeplabv 1&deeplabv 2CRF-RNN】SegNet】parse netdilated netDRNRefineNet

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN

实例分割 [ SDS ] [ 超列 ] [ 深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

【DeepPose】【汤普森 NIPS'14】【汤普森 CVPR'15】

回顾:SRDenseNet —用于 SR 的 DenseNet(超分辨率)

原文:https://towardsdatascience.com/review-srdensenet-densenet-for-sr-super-resolution-cbee599de7e8?source=collection_archive---------14-----------------------

带跳跃连接的 DenseNet 块优于 SRCNN、VDSR 和 DRCN

SRDenseNet has much better quality

在这个故事里,帝国视觉科技SRDenseNet福洲中国进行了回顾。在 SRDenseNet 中, DenseNet 建议的密集块用于提取高层特征。此外,在密集块之间增加了跳跃连接。瓶颈层和解卷积层用于在重构高分辨率(HR)图像之前进行放大。发表在 2017 ICCV 上,引用 70 余次。( Sik-Ho Tsang @中)

  1. 密集块
  2. SRDenseNet 变体
  3. 反褶积、瓶颈层和重建层
  4. 消融研究
  5. 结果

1。密集块

Dense Block (The paths at the bottom are copied from previous layers to deeper layers.

1.1.串联而不是求和

  • 与 ResNet ,不同的是,特征图在dense net中串接,而不是直接求和。
  • 因此,第 i 层接收所有前面层的特征图作为输入:

  • 其中[ X 1, X 2,…,Xi1]表示在前面的卷积层 1,2,…,I1 中生成的特征图的连接。
  • 这种 DenseNet 结构缓解了消失梯度问题。
  • 重用已经学习过的特征地图迫使当前层学习补充信息,从而避免学习冗余特征。
  • 此外,在所提出的网络中,每一层都有一条通向损耗的短路径,从而导致隐含的深度监督。

1.2.增长率

  • 本次工作在一个致密区块中有 8 个褶积层。
  • 当密集块中每个卷积层产生 k 个特征图作为输出时,一个 密集块 产生的特征图总数为 k ×8 ,其中 k 称为增长率
  • 增长率 k 调节每层对最终重建贡献多少新信息。
  • 在上图中,每个块由 8 个卷积层组成。为了防止网络增长过宽,增长率设置为 16每个块的输出有 128 个特征图

2。SRDenseNet 变体

2.1.SRDenseNet_H

SRDenseNet_H

  • 这是基本的 SRDenseNet。
  • 8 个密集块用于提取高级特征。

2.2.SRDenseNet_HL

SRDenseNet_HL

  • 跳过连接用于连接低级和高级特征。
  • 然后,连接的要素地图将用作反卷积图层的输入。

2.3.SRDenseNet_All

SRDenseNet_All

  • 密集跳过连接用于组合所有卷积层产生的特征图,用于 SR 重建。
  • 反褶积层前还增加了瓶颈层。
  • SRDenseNet_All 有 69 个重量层和 68 个激活层。
  • 感受野的大小与深度成正比,可以利用 LR 图像中的大量上下文信息来推断 HR 图像中的高频信息
  • 由于使用了许多 ReLU 层,可以在非常深的网络中利用高度非线性来模拟 LR 图像和 HR 图像之间的复杂映射函数。

3。反卷积、瓶颈和重建层

3.1.瓶颈层

  • 网络中的所有要素地图连接在 SRDenseNet_All 中,为后续反卷积图层生成许多输入。
  • 具有 1×1 内核的卷积层被用作瓶颈层以减少输入特征图的数量。
  • 使用 1×1 瓶颈层,特征地图的数量减少到 256 个。
  • 之后,去卷积层将 256 个特征图从 LR 空间变换到 HR 空间。

3.2.去卷积层

  • 在 SRCNN 和 VDSR 中,双三次插值用于在卷积之前将低分辨率(LR)图像提升到 HR 空间。
  • 所有卷积都在 HR 空间中进行,这增加了 SR 的计算复杂度。
  • 此外,插值方法没有为解决随机共振问题带来新的信息。
  • 因此,在卷积之后,使用去卷积层来学习放大滤波器。有两个好处。
  • 首先,它加速了 SR 重建过程。在网络末端增加反褶积层后,整个计算过程在 LR 空间进行。如果放大因子是 r ,那么它将减少因子 r 的计算成本。
  • 此外,来自 LR 图像的大量上下文信息用于推断高频细节
  • 在这项工作中,两个连续的 3×3 内核的反褶积层256 个特征图用于向上扩展。

3.3.重建层

  • 重建层是一个 3×3 核一路输出的卷积层。

4.消融研究

PSNR/SSIM on Urban100

PSNR/SSIM on 4 Datasets

  • 从 ImageNet 中随机选择 50,000 幅图像用于训练。
  • 在 HR 空间中裁剪尺寸为 100×100 的非重叠子图像。LR 图像是通过使用比例因子为 4 倍的双三次曲线对 HR 图像进行下采样而获得的。只有 Y 通道用于训练。
  • ReLU 用于所有权重层,并使用 Adam 优化器。
  • 使用 32 的小批量。
  • 在测试过程中,数据集 Set5,Set14B100,来自 Berkeley 分割数据集,由 100 幅自然图像Urban100 组成,其中包含 100 幅挑战图像
  • 测试了 LR 和 HR 图像之间的 4 倍比例因子。
  • PSNR 和 SSIM 是在图像的 Y 通道上计算的。
  • 用的是英伟达 Titan X GPU。
  • SRDenseNet_All 在 SRDenseNet 变体中具有最高的 PSNR 和 SSIM。

5.结果

5.1。定量结果

PSNR/SSIM on 4 Datasets

  • 对于 SRCNN ,使用最佳 9–5–5 图像模型。
  • 至于 A+方法,它没有预测图像边界。为了公平比较,HR 图像的边界被裁剪,以便所有结果具有相同的区域。
  • 就 PSNR 而言,所提出的方法在不同的数据集上比最新的结果实现了 0.2dB-0.8dB 的改善。
  • 平均起来,比具有 3 层的SRCNN提高了大约 1.0 dB,比具有 20 层的【VDSR】提高了大约 0.5 dB。****
  • 所有方法中最显著的改进,包括 SRCNN 、 VDSR 和 DRCN ,都是在极具挑战性的数据集 Urban100 上获得的。

5.2.定性结果

Urban100 img096

Urban100 img099

Urban100 img004

B100 148026

B100 253027

Set14 ppt3

  • 对于 Urban100 上的上述图像,SRDenseNet 可以很好地重建线条和轮廓,而其他方法会产生模糊的结果。
  • 对于 B100 和 Set14 上的上述图像,SRDenseNet 可以重建纹理图案并避免失真。
  • 在 Titan X GPU 上实现超分辨 B100 的平均速度为 36ms ,达到 4 倍缩放因子的实时 SR。

最后,作者提到,目前的研究趋势是研究 SR 问题的感知损失,如 SRGAN,它“伪造”纹理,使其具有更好的人眼感知质量,尽管 PSNR 较低。他们也会对此进行调查。

参考

【2017 ICCV】【SRDenseNet】
使用密集跳跃连接的图像超分辨率

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(是)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(好)(的)(情)(情)(情)(况)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】CRAFTR-FCNIONmultipath Net【T21 [ 约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3 ] [ FPN ] [ 视网膜网 ] [ DCN ]

语义切分 FCNde convnetdeeplab v1&deeplab v2SegNet】【parse netdilated netPSP netdeeplab v3DRN

生物医学图像分割 cumed vision 1cumed vision 2/DCANU-NetCFS-FCNU-Net+ResNet多通道

实例分段 DeepMask SharpMask MultiPathNet MNC InstanceFCN FCIS 】

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

复习:STN —空间变换网络(图像分类)

原文:https://towardsdatascience.com/review-stn-spatial-transformer-network-image-classification-d3cbd98a70aa?source=collection_archive---------4-----------------------

使用 STN,网络内的空间转换数据,学习对平移、缩放、旋转和更一般的扭曲的不变性。

在这个故事中, Google DeepMind空间转换网络(STN) 做了简要回顾。STN 有助于剔除适当的区域并对其进行尺度归一化,这可以简化后续的分类任务并带来更好的分类性能,如下所示:

(a) Input Image with Random Translation, Scale, Rotation, and Clutter, (b) STN Applied to Input Image, (c) Output of STN, (d) Classification Prediction

它发表在 2015 NIPS 上,被引用超过 1300 次。诸如仿射变换和单应配准的空间变换已经研究了几十年。但在本文中,空间变换是用神经网络来处理的。对于基于学习的空间变换,根据输入或要素地图应用变换。并且与另一篇名为“可变形卷积网络”(2017 ICCV)的论文高度相关。因此,我决定先读这本书。( Sik-Ho Tsang @中)

概述

  1. 快速回顾空间变换矩阵
  2. 空间变压器网络
  3. 采样内核
  4. 实验结果
  5. 其他一些任务

1。快速回顾空间变换矩阵

STN 在论文中主要学习了 3 种变换。事实上,也可以应用更复杂的变换。

1.1 仿射变换

Affine Transform

  • 根据矩阵中的值,我们可以用不同的效果将(X1,Y1)变换为(X2,Y2),如下所示:

Translation, Scaling, Rotation, and Shearing

  • 如果有兴趣,请谷歌“注册”、“单应矩阵”,或者“仿射变换”。

1.2 射影变换

  • 投影变换也可以在 STN 中学习,如下所示:

Projective Transformation

1.3.薄板样条(TPS)变换

Thin Plate Spline (TPS) Transformation

An example

  • 对于 TPS 改造来说,相对于前两次改造更为复杂。(之前学过仿射和射影映射,关于 TPS 没接触过,如有错误,请告知。)
  • 简而言之,假设我们在不同于输入点(xi,易)的位置有一个点(x,y),我们使用右边的等式基于偏差、x 和 y 的加权和以及(x,y)和(xi,易)之间的距离函数来变换该点。(这里一个径向基函数 RBF 。)
  • 所以如果我们用 TPS,网络需要学习 a0,a1,a2,b0,b1,b2,Fi,Gi,这是 6+2N 个数的参数。
  • 正如我们所看到的,TPS 可以实现更灵活或更高自由度的变形或转换。

2。空间变压器网络

Affine Transformation

  • STN 由定位网网格生成器采样器组成。

2.1。本地化网络

  • 输入特征图U,用 W ,高度 HC 通道,输出为θ,变换的参数 。它可以被学习为如上的仿射变换。或者更受约束,例如用于注意力的,其仅包含缩放和平移,如下:****

Only scaling and translation

2.2.电网发电机

  • 假设我们有一个规则的网格 G,这个 G 是目标坐标为(XT _ I,yt_i) 的点的集合。
  • 然后我们对 G 应用变换 ,即 ( G )。
  • ( G 之后,输出一组带有目的坐标(xt_i,yt_i)的点。这些点已根据变换参数进行了更改。它可以是平移、缩放、旋转或更一般的扭曲,这取决于我们如何如上所述设置 θ

2.3.取样器

(a) Identity Transformation, (b) Affine Transformation

  • 基于新的一组坐标(xt_i,yt_i),我们生成变换后的输出特征图 V 。这个 V 被平移、缩放、旋转、扭曲、投影变换或仿射,无论什么。
  • 注意,STN 不仅可以应用于输入图像,还可以应用于中间特征图。

3.采样内核

  • 正如我们在上面的例子中看到的,如果我们需要对一个变换的网格进行采样,我们会遇到采样问题,我们如何对这些子像素位置进行采样取决于我们将要使用的采样核。
  • 通用格式:

  • 整数采样内核(四舍五入到最接近的整数):

  • 双线性采样内核:

  • 这是一种(次)可微的采样机制,因此便于反向传播:

4。实验结果

4.1.扭曲的 MNIST

Errors of distorted MNIST datasets (Left), Some examples that are failed in CNN but successfully classified in STN (Right)

  • 应用的扭曲 : TC :平移和杂乱, R :旋转, RTS :旋转、平移和缩放, P :投影扭曲, E :弹性扭曲。
  • 空间变换 : Aff :仿射变换, Proj :射影变换, TPS :薄板样条变换。
  • FCN :这里的 FCN 是指没有卷积的全连接网络(这里不是全卷积网络。)
  • 正如我们所见,圣 FCN 胜过 FCN,圣 CNN 胜过 CNN。
  • ST-CNN 在各方面都比 ST-FCN 好。

4.2.街景门牌号码

Errors of SVHN datasets (Left), Some examples use in ST-CNN (Right)

  • ST-CNN 单个:网络开头只有一个 ST。
  • ST-CNN Multi :每个 conv 前一个 ST。
  • 这里使用仿射变换。
  • 同样,ST-CNN 也胜过 Maxout 和 CNN。(我在 NoC 里有一个非常简单的关于 Maxout 的介绍,有兴趣的可以看看。)
  • 和 ST-CNN 多优于 ST-CNN 单一一点。

4.3.精细分类

Fine-Grained Bird Classification. Accuracy(left), 2×ST-CNN (Top Right Row), 4×ST-CNN (Bottom Right Row)

  • 这里,ImageNet 预训练的 Inception-v2 被用作对 200 个物种进行分类的主干,具有 82.3%的准确率。
  • 2/4×ST-CNN : 2/4 平行 STs,精度更高。
  • 有趣的是,其中一只(红色)学会了头部探测器,而另外三只(绿色)学会了鸟身体的中心部分。

5.一些其他任务

5.1.MNIST 加成

MNIST Addition

  • 有趣的是,虽然每个 ST 也接收两个输入数字,但是每个 ST 都学习转换每个数字。

5.2.协同定位

Co-localisation

  • 三重损失:铰链损失用于强制 ST 的两个输出之间的距离小于到随机作物的距离,希望鼓励空间转换器定位公共对象。

5.3.高维变压器

  • STN 还可以扩展为 3D 仿射变换

不同的数据集有不同的网络架构和设置。如果你想了解细节,最好去看看报纸。接下来我大概会回顾一下关于可变形卷积网络。

参考

【2015 NIPS】【ST】
空间变压器网络

我的相关评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(他)(们)(都)(不)(是)(真)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(实)(

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC

语义切分 FCNde convnetdeeplab v1&deeplab v2parse net】dilated netPSP netdeeplab v3

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet

实例分割
[深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

超分辨率 Sr CNNfsr CNNVDSRESPCN红网】

综述:提示性注释—深度主动学习框架(生物医学图像分割)

原文:https://towardsdatascience.com/review-suggestive-annotation-deep-active-learning-framework-biomedical-image-segmentation-e08e4b931ea6?source=collection_archive---------15-----------------------

减少生物医学专家(如放射技师)的注释工作和成本

Glands Segmentation in Colon Histology Images (Left) & Lymph Nodes Segmentation in Ultrasound Images (Right)

在这个故事中,暗示性的注解(SA) 被回顾。例如,结肠癌和淋巴结癌(淋巴瘤)是导致死亡的两种常见癌症。精确分割对于了解注释对象的大小/形状至关重要,例如用于诊断或癌症分级/分期。传统上,注释医学图像,需要生物医学领域的专家。需要很高的努力和成本。

由于标注代价昂贵,因此深度主动学习框架被应用于生物医学领域,以便用较少的标注样本训练深度神经网络。而这是一篇 2017 MICCAI 超过 40 次引用的论文。( Sik-Ho Tsang @中)

概述

  1. 生物医学影像专家标注的问题
  2. 什么是主动学习?
  3. 从人工标注到深度主动学习框架
  4. 提出使用提示性标注的深度主动学习框架
  5. 结果

1。生物医学成像中的专家注释问题

Annotation in Biomedical Imaging by Experts

  • 只有经过培训的生物医学专家才能对数据进行注释
  • 大量的人工工作(时间&成本)。
  • 人为失误

2。什么是主动学习?

Active Learning

  • 注释/标记是一项昂贵的活动,尤其是在生物医学领域。
  • 主动学习的建议来自 2010 年的一份技术报告,“主动学习文献调查”,引用超过 3000 条。
  • 如上图所示,人工标注来自未标注库的一些样本,输入这些标注样本用于训练
  • 在训练之后,机器学习模型输出一些具有高度不确定性的样本,回到未标记池。
  • 因此,人类可以避免注释那些由机器学习模型预测的高确定性的样本,从而节省人类注释者的努力和成本。

3.从人工标注到深度主动学习框架

3.1.雇用年轻人做注解

Employ Junior for Annotation

  • 如上所示,类似于前一节中的主动学习框架,训练有素的初级标注来自未标注样本池的样本。
  • 然后选择不确定性高的,请他/她的学长,也就是专家来批注。
  • 有了专家的注解,初级可以学到更多,成为一个更好训练的初级。
  • 通过更好的学习/训练,受过训练的初级应该具有更高的标注能力来标注来自池中的剩余未标注样本。
  • 有了上述框架,我们可以节省专家的精力和成本。

3.2.雇用更多的初级人员进行注释

Employ More Juniors for Annotation

  • 为了加快注释的速度,我们可以雇用更多的初级人员来完成注释任务。
  • 只有那些在所有训练好的初级中不确定的样本,才被送到专家那里进行标注。
  • 因此,我们可以进一步节省专家的精力和成本。

3.3.FCN 替换青年队

FCN Replacing Juniors

  • 为了更加自动化,全卷积网络(fcn)将取代人
  • 现在,它变成了一个主动的学习框架。借助深度学习,本文称之为深度主动学习框架

4.使用建议性注释的深度主动学习框架

Deep Active Learning Framework

  • 如上图所示有三个主要部分: FCN 架构不确定性度量相似性估计

4.1.FCN 建筑

FCN Architecture

  • 输入:未标注图像
  • 输出:标注标签图(我们想要的)和 1024-d 图像描述符,用于测量不确定度。
  • 所使用的架构是一个使用残差块的 FCN 式架构。
  • 使用自举(带替换的采样);这样每个 FCN 将有不同的训练数据
  • 简单情况 : 多个 fcn 会得出相似的输出
  • 疑难案例:多个 fcn 会有不同的输出
  • 由于使用了 4 个 NVidia Tesla P100 GPU,SA 中使用了4 个 fcn。

4.2.不确定性度量

Uncertainty Measure

  • 当一个像素的不确定性(标准偏差)较低时,该像素的精度较高,反之亦然。
  • 为了测量图像的不确定性,使用所有像素的平均不确定性。

4.3.相似性估计

  • 如前所述,还有另一个输出,1024-d 图像描述符。该描述符包含丰富而准确的形状信息
  • 余弦相似度用于相似度估计。

4.4.暗示性注释

Suggestive Annotation (SA)

  • 在所有未标注的图像中,我们使用不确定性度量选择 K 个不确定性得分最高的图像 K 作为ScT9(K= 16)。
  • 因此,我们选择了 K 个图像,fcn 具有不同的输出
  • 在这些 K 图像中,使用贪婪方法找到 Sa (我们想建议专家注释的一组)。
  • 最初 Sa 是空集,即 SaF ( SaSu ) = 0。
  • 迭代添加IiSc,最大化F(SaIiSu )直到 Sa 包含 k 图像( k =8)
  • 因此,选择一组具有不确定输出的图像 Sa ,但也类似于未标注的图像。

5.结果

5.1.2015 MICCAI 腺体挑战数据集

  • 85 幅训练图像
  • 80 张测试图像,其中 60 张在 A 部分(正常腺体),20 张在 B 部分(异常腺体)

Comparison with full training data for gland segmentation

  • 当使用 100%训练数据时,SA(我们的方法)优于多通道和 CUMedVision2 / DCAN ,证明了 FCN 架构的有效性。

Comparison using limited training data for gland segmentation

  • 当使用 50%的训练数据时,它已经接近甚至优于 SOTA(绿色)结果。

5.2.淋巴结数据集

  • 37 幅训练图像和 37 幅测试图像

  • 仅用 50%的训练数据,该框架就能比 U-Net 、 CUMedVision1 和 CFS-FCN 有更好的分割性能。
  • CFS-FCN 需要对中间标签图进行额外的标记工作,这些标签图可以被视为 200%的训练数据。

通过使用暗示性标注的深度主动学习框架,有助于提高小数据集的预测精度。

参考

【2017 MICCAI】【SA】
提示性标注:生物医学图像分割的深度主动学习框架

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(没)(有)(什)(么)(好)(的)(情)(情)(感)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [G-RMI][TDM][SSD][DSSD][约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3[FPN[视网膜网[DCN

语义切分 FCNde convnetdeeplabv 1&deeplabv 2CRF-RNN】SegNet】parse netdilated netDRNRefineNet

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net][M FCN

实例分割 [ SDS ] [ 超列 ] [ 深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例化 ] [ FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

【DeepPose】【汤普森 NIPS'14】【汤普森 CVPR'15】

回顾:汤普逊·CVPR 15—空间丢失(人体姿态估计)

原文:https://towardsdatascience.com/review-tompson-cvpr15-spatial-dropout-human-pose-estimation-c7d6a5cecd8c?source=collection_archive---------21-----------------------

在空间丢失的情况下,级联的粗略和精细热图回归优于Tompson NIPS’14

MPII-Human-Pose Dataset

在这个故事中, NYU 的《利用卷积网络进行高效的物体定位》被简要回顾。本文中的方法似乎没有简写形式。由于在 2015 年 CVPR的论文中,第一作者的名字是汤普逊,所以我就在标题中称之为汤普逊 CVPR 的 15** 。你可能会注意到,这是 NYU 写的,也是 LeCun 教授的论文之一。就在上个月2019 年 3 月,LeCun 获得了图灵奖,与 Yoshua Bengio 和 Geoffrey Hinton 分享,其中图灵奖是“计算的诺贝尔奖”。而这是一篇超过 300 次引用的论文。( Sik-Ho Tsang @中)**

人体姿态估计的目标是定位人体关节。有很多困难,比如关节遮挡,体型、服装、灯光、视角等的变化。

概述

  1. 粗略热图回归
  2. 空间脱落
  3. 使用级联架构的精细热图回归
  4. 消融研究
  5. 与最先进方法的比较

1。粗略热图回归

Coarse Heat-Map Regression (Only 2 scales are shown)

  • 网络是一个全卷积网络
  • 使用 3 种不同比例的输入,并输出每个关节的热图。
  • 在第一层,对输入图像应用局部对比度归一化(LCN)。
  • 有 2 个数据集进行测试:FLIC 和 MPII。
  • 对于 FLIC,使用 7 级卷积神经网络(CNN ),而对于 MPII,使用 11 级 CNN。
  • 由于共用,输出图像的分辨率低于输入图像。

  • 均方误差(MSE) 用作损失函数,其中 H'jHj 是第 j 个接头的预测和地面实况热图。
  • 训练时,随机旋转度r[-20,+20],s[0.5,1.5]和 p = 0.5 的翻转版本用于数据扩充。

2.空间脱落

2.1.标准辍学

Standard Dropout

  • 上面两行像素表示特征图 1 和 2 的卷积核,下面一行表示前一层的输出特征。
  • 对于标准的辍学,比如说上图右边的,虽然 f2b 被放弃了,但是强相关的 f2a 仍然存在。
  • 由于网络是一个全卷积网络,这使得丢失无效。

2.2.空间辍学

SpatialDropout

  • 提出了一种新的辍学生,空间辍学生。
  • 假设有尺寸为 n _ 功勋 × × 的特征地图,只进行n _ 功勋脱靶试验
  • 差值跨越整个特征地图。
  • 因此,漏失特征图中的相邻像素要么全为 0(漏失),要么全为活动,如上图右侧所示。
  • 如第一幅图所示,这个附加的下降层被添加在第一个 1×1 卷积层之前。

3。使用级联架构的精细热图回归

3.1.级联架构

Cascaded Architecture

  • 这里的目标是恢复由于粗略热图回归模型的汇集而损失的空间精度。
  • 不像深度图那样单独使用输出热图作为精细热图回归模型的输入,来自粗糙热图回归模型的中间特征图也被用作输入。****
  • 这可以帮助减少参数的数量,并作为粗糙热图模型的正则化器。
  • 精细热图回归模型为接头生成(⇼x,⇼y)。通过在粗糙模型中添加(x,y ),我们可以获得最终结果。

3.2.裁剪模块

Crop Module

  • 在通过精细的热图回归模型之前,热图和特征图需要通过裁剪模块。
  • 为了使保持窗口的上下文大小不变,在每个更高的分辨率级别执行裁剪区域的缩放。

3.3.暹罗网络

14 Joints, 14 Siamese Network in Fine Heat-Map Regression Model

  • 假设有 14 个接头,我们将得到 14 个网络,有许多参数。
  • 作者采用连体网络,其中权重和偏差对于所有实例都是共享的
  • 这可以减少参数的数量并防止过度训练
  • 最后,使用 1×1 卷积(无任何权重分配)输出每个关节的详细分辨率热图。最后一层的目的是对每个关节进行最终检测。

3.4.单个接头的精细热图网络

Fine Heat-Map Network for a Single Joint

  • 4 条路径的 CNN 如上所示,这是单个关节的网络。
  • 在需要的地方应用升级。
  • 并且来自所有 4 条路径的所有特征图被加在一起,然后经过 1×1 卷积以获得输出。

3.5.联合训练

  • 首先,对粗略的热图模型进行预训练。
  • 然后固定粗略热图模型,并使用以下损失函数训练精细热图模型:

  • 其中 G'jGj 是第 j 个接头的预测和地面实况热图。
  • 最后,通过最小化 E3 =E1+λ×E2,对粗、细模型进行联合训练,其中 λ = 0.1。

4.消融研究

4.1.数据集

  • FLIC 数据集由 3987 个训练样本和 1016 个来自好莱坞电影的静态场景测试样本组成,并标注了上身关节标签。姿势主要是面向前方和直立。
  • MPII 数据集包括 28,821 个训练和 11,701 个测试示例中的各种全身姿势注释。

4.2.汇集效应

Pooling impact on FLIC test-set Average Joint Accuracy for the coarse heat-map model

  • 使用的池越多,性能越差。

σ of (x; y) pixel annotations on FLIC test-set images (at 360×240 resolution)

  • 测量地面实际节理的标准偏差 σ
  • 标签噪声(10 幅图像) : 13 个用户从 FLIC 测试集中为面部、左手腕、左肩和左肘关节标注了 10 幅随机图像。这可以当作人的表现
  • 同样,使用的池越多,性能越差。

4.3.仅粗略或级联模型

Coarse and Fine Models

  • 仅使用粗略模型,预测误差(像素)分布很广。
  • 使用级联模型,预测误差(像素)更窄。

4.4.级联模型的效果

Performance improvement from cascaded model

  • 使用较少的池(4 倍)和级联模式,性能最佳。
  • 使用 8 倍和 16 倍池时,级联效应显著。

4.5.测试时间

Testing Time in Seconds

  • 用的是 Nvidia-K40 GPU。
  • 汇集越少(4 倍),测试时间越长。

4.6.共享特征&** 空间缺失**

  • ****(左)基线/标准级联:精细模型只以图像为输入,粗精模型独立训练。
  • (左)共享特征:粗模型中的特征图也作为细模型的输入。当然,共享特性有更好的效果。
  • ****(右)有空间遗漏:检出率更高。

5.与最先进方法的比较****

5.1.警察

FLIC — FCK Performance, Average (Left) Individual Joints (Right)

  • 提议的级联网络优于所有最先进的方法,包括Tompson NIPS’14。

5.2.MPII

MPII— FCK Performance, Average (Left) Individual Joints (Right)

  • 同样,所提出的级联网络比所有最先进的方法具有更大的优势。

利用级联网络对预测的关节位置进行微调,可以获得更高的检测率。

参考

【2015 CVPR】【汤普森·CVPR 15】
利用卷积网络的高效物体定位

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(没)(有)(什)(么)(好)(的)(情)(情)(感)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNMR-CNN&S-CNNDeepID-NetCRAFTR-FCN】 [TDM][SSD][DSSD][yolo v1][yolo v2/yolo 9000][yolo v3][FPN][retina net[DCN]

语义切分 FCNde convnetdeeplabv 1&deeplabv 2CRF-RNN】SegNet】parse netdilated netDRNRefineNet

生物医学图像分割 [ 累计视觉 1 ] [ 累计视觉 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道][V-Net][3D U-Net]

实例分割 [SDS][Hypercolumn][deep mask][sharp mask][multipath net][MNC][Instance fcn[FCIS]

超分辨率
T2Sr CNN[fsr CNN][VDSR][ESPCN][红网][DRCN][DRRN][LapSRN&MS-LapSRN][SRDenseNet]

人体姿态估计
深度姿态汤普逊 NIPS’14

综述:Tompson NIPS ' 14—CNN 和图形模型的联合训练(人体姿态估计)

原文:https://towardsdatascience.com/review-tompson-nips14-joint-training-of-cnn-and-graphical-model-human-pose-estimation-95016bc510c?source=collection_archive---------18-----------------------

又名{多人/人/人/人体} {姿势估计/关键点检测},NYU

FLIC (Frames Labeled In Cinema) Dataset for Human Pose Estimation (https://bensapp.github.io/flic-dataset.html)

FLIC Plus Dataset for Human Pose Estimation

在这个故事中, NYU 的《卷积网络和人体姿态估计图形模型的联合训练》做了简要回顾。本文中的方法似乎没有简写形式。由于在 2014 NIPS 的论文中第一作者的名字是汤普逊,所以我就在标题上称之为汤普逊 NIPS’14。你可能会注意到,这是 NYU 写的,也是勒村教授的论文之一。而这是一篇超过 600 次引用的论文。( Sik-Ho Tsang @中)

人体姿态估计的目标是定位人体关节。有很多困难,比如关节遮挡、体型变化、服装、灯光、视角等。

概述

  1. 零件检测器:模型架构
  2. 空间模型:关节间的消息传递
  3. 结果

1.零件检测器:模型架构

1.1.从滑动窗口到全图像卷积—单一分辨率

From Sliding Window to Full Image Convolution — Single Resolution

  • 作者通过对完整图像执行卷积而不是使用滑动窗口卷积来改进 2013 ICLR 架构。
  • 此外,不是使用全连接层来预测 4 个接头(红、黄、绿和蓝),而是使用 1×1 卷积来替换全连接层,以将特征图的数量从 512 个减少到 4 个。因此,最后,为 4 个关节生成了 4 个热图。

1.2.从滑动窗口到全图像卷积—多分辨率

From Sliding Window to Full Image Convolution — Multi-Resolution

  • 此外,为了提高网络的鲁棒性,使用了多分辨率输入图像。与顶部的相比,底部不需要两次滑动窗口卷积。对于底部的网络,在对输入图像进行下采样之后,我们得到 2 个输入图像,网络可以一次性执行。

2。空间模型:关节间的消息传递

Message Passing Between Face and Shoulder Joints

  • 一个关节位置可以帮助细化另一个关节位置,例如,通过肩部位置,我们可以知道在正常情况下面部应该在肩部之上。基于这一思想,可以消除假阳性。

Single Round Message Passing Network

SoftPlus and ReLU

  • 作者设计了一个消息传递网络来逼近马尔可夫随机场(MRF)。该网络用于模拟一元电位和成对电位的估计,以完善结果。
  • 使用 SoftPlus 代替 ReLU。两者具有相似的效果,但是 SofPlus 可以提供平滑的曲线。

3.结果

3.1.培养

  • 首先单独训练零件检测器,并存储热图输出。然后,这些热图被用来训练一个空间模型。最后,将经过训练的部分检测器和空间模型结合起来,用于整个网络的反向传播。

3.2.新的 FLIC (电影中标记的帧)加上数据集

  • 为了公平起见,作者对原始 FLIC 数据集进行了微调,以生成新的 FLIC Plus 数据集,使其不与测试集重叠。

3.3.估价

  • 对于给定的归一化像素半径,评估测试集中预测关节位置到地面实况位置的距离落在给定半径内的图像的数量。

3.4.FLIC 测试集和 LSP 测试集

FLIC Test Set (Left & Middle) & LSP (Leeds Sports Pose) Test Set (http://sam.johnson.io/research/lsp.html) (Right)

LSP Test Set (Left) & Further Study on Proposed Models

  • 曲线越高,模型越好。
  • 我们可以看到,对于 FLIC(顶行,左和中间)和 LSP(右上和左下)测试集,与其他方法相比,所提出的方法(我们的方法)具有较大的优势。
  • 进一步研究空间模型和联合训练的有效性(底部中间),我们可以看到两个网络的联合训练具有最高的检测率。
  • 此外,使用 3 种分辨率的图像输入网络会产生最佳结果(右下角)。

Predicted Joint Positions, Top Row: FLIC Test-Set, Bottom Row: LSP Test-Set

参考

【2014 NIPS】【Tompson NIPS’14】
卷积网络和人体姿态估计图形模型的联合训练

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(他)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(呢)(?)(她)(们)(都)(不)(在)(这)(些)(情)(况)(下)(,)(她)(们)(还)(是)(不)(在)(这)(些)(事)(上)(有)(什)(么)(情)(况)(吗)(?)(她)(们)(都)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(,)(她)(们)(们)(还)(不)(在)(这)(些)(事)(上)(有)(什)(么)(好)(的)(情)(情)(情)(况)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】CRAFTR-FCNIONmultipath Net【T21 [ 约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3 ] [ FPN ] [ 视网膜网 ] [ DCN ]

语义切分 FCNde convnetdeeplab v1&deeplab v2】CRF-RNN】SegNet】parse netdilated netPSPNetdeeplab v3]

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道

实例分段 DeepMask SharpMask MultiPathNet MNC InstanceFCN FCIS 】

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

综述:V-Net —体积卷积(生物医学图像分割)

原文:https://towardsdatascience.com/review-v-net-volumetric-convolution-biomedical-image-segmentation-aa15dbaea974?source=collection_archive---------5-----------------------

用于体积医学图像分割的全卷积网络

Slices from MRI volumes depicting prostate (PROMISE 2012 challenge dataset)

Qualitative results (PROMISE 2012 challenge dataset)

在这个故事中, V-Net 被简要回顾。临床实践中使用的大多数医学数据由 3D 体积组成,例如描绘前列腺的 MRI 体积,而大多数方法仅能够处理 2D 图像。提出了一种基于体完全卷积神经网络的三维图像分割方法。

前列腺 MRI 体积分割是一项具有挑战性的任务,由于广泛的外观,以及不同的扫描方法。强度分布的变形和变化也会发生。

注释医学卷并不容易。注释需要专家,这产生了高成本。自动分段有助于降低成本。

然而,前列腺分割是一项重要的任务,在诊断期间和治疗计划期间都具有临床相关性,在诊断期间需要评估前列腺的体积,在治疗计划期间需要精确估计解剖边界。这是一篇 2016 3DV 论文,引用 600 多篇。( Sik-Ho Tsang @中)

  1. 虚拟网络架构
  2. 骰子损失
  3. 结果

1。虚拟网络架构

V-Net Architecture

  • v 网如上图。网络的左边部分压缩路径组成,而右边部分对信号进行解压缩,直到达到其原始大小。
  • 如你所见,它类似于 U-Net ,但有一些不同。

1.1.左边的

  • 网络的左侧分为以不同分辨率运行的不同阶段。每一级包括一到三个卷积层。
  • 在每个阶段,学习一个剩余函数。每一级的输入在卷积层中使用,通过非线性处理,并加到该级的最后一个卷积层的输出上,以便能够学习剩余函数。这种架构与 U-Net 等无残差学习网络相比,保证了收敛性。
  • 在每个阶段执行的卷积使用大小为 5×5×5 体素体积核。(体素代表 3D 空间中规则网格上的值。术语体素通常用于 3D 空间,就像点云中的体素化一样。)
  • 沿着压缩路径,分辨率通过与步长为 2 的 2×2×2 体素宽内核进行卷积而降低。因此,生成的要素地图的大小减半,其目的与汇集图层相似。并且特征通道的数量在 V-Net 的压缩路径的每个阶段加倍。
  • 由于反向传播不需要将池层的输出映射回它们的输入的开关,所以用卷积运算代替池运算有助于在训练期间具有更小的内存占用。
  • 下采样有助于增加感受野。
  • PReLU 用作非线性激活功能。(预走建议在预走网中)。)

1.2.对吧

  • 网络提取特征,并且扩展较低分辨率特征图的空间支持,以便收集和组合必要的信息来输出双通道体积分割。

Convolution for Downsampling (Left), Deconvolution for Upsampling (Right)

  • 在每个阶段,使用去卷积操作,以便增加输入的大小,随后是一到三个卷积层,涉及在前一层中使用的 5×5×5 核的一半数量。
  • 剩余函数被学习,类似于网络的左侧部分。
  • 这两个特征映射由最后一个卷积层的计算,具有 1×1×1 核大小并产生与输入卷大小相同的输出。****
  • 这两个输出特征图是通过应用软最大体素法对前景和背景区域的概率分割。

1.3.水平连接

  • 与 U-Net 类似,位置信息在压缩路径中丢失(左)。
  • 因此,从 CNN 左边部分的早期阶段提取的特征通过水平连接被转发到右边部分。
  • 这可以帮助向正确的部分提供位置信息,并提高最终轮廓预测的质量。
  • 并且这些连接改善了模型的收敛时间。

2.骰子损失

  • 上面是两个二进制卷之间的骰子系数 D 。(范围在 0 和 1 之间)
  • N 体素, pi :预测体素, gi :地面真实体素。
  • 如上所述,在 softmax 之后的网络末端,我们得到的输出是每个体素属于前景和背景的概率。
  • 和骰子可以被区分,产生梯度:

  • 使用骰子损失,不需要对不同类别的样本进行加权来建立前景和背景体素之间的正确平衡。

3.结果

3.1.培养

  • 网络处理的所有体积都具有 128×128×64 体素的固定尺寸和 1×1×1.5 毫米的空间分辨率。****
  • 数据集很小,因为需要一个或多个专家来手动追踪可靠的基本事实注释,并且存在与他们的获取相关联的成本。
  • 只有 50 个 MRI 体积用于训练,相对手动地面实况标注从 PROMISE 2012 challenge 数据集获得。
  • 该数据集包含在不同医院采集的医疗数据,使用不同设备不同采集协议,以表示临床可变性。
  • 因此,需要增加数据。对于每次迭代,使用通过 2×2×2 控制点网格和 B 样条插值获得的密集变形场的训练图像的随机变形版本。
  • 此外,通过使用直方图匹配使每次迭代中使用的训练体积的强度分布适应属于数据集的其他随机选择的扫描的强度分布,来改变数据的强度分布
  • 小批量,只有 2 卷,由于内存要求高。

3.2.测试

  • 处理不可见的 30 个 MRI 体积。
  • softmax 之后的体素属于前景的概率高于属于背景的概率(> 0.5),被认为是解剖结构的一部分。
  • 测量了 Dice 系数和 Hausdorff 距离。
  • Hausdorff 距离是用来衡量形状相似性的。Hausdorff 距离是获得两个形状之间的最大距离。(如果感兴趣,关于豪斯多夫距离的非常简要的介绍在 CUMedVision2 / DCAN 。)

Quantitative Comparison on the PROMISE 2012 Challenge Dataset

Dice Loss (Green) Logistic Loss (Yellow)

  • 如上所示,使用骰子损失的 V-Net 优于使用逻辑损失的 V-Net。
  • 并且 V-Net 优于大多数现有技术,但不仅仅是 Imorphics。
  • 作者在未来的工作中提到,他们将致力于在其他模态(如超声)中分割包含多个区域的体积,并通过在多个 GPU 上分割网络来实现更高的分辨率。

参考

【2016 3DV】【V-Net】
V-Net:用于体医学图像分割的全卷积神经网络

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(就)(想)(到)(了)(这)(些)(人)(们)(,)(我)(们)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(我)(们)(还)(没)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(想)(到)(这)(些)(事)(,)(我)(们)(还)(没)(想)(到)(这)(里)(去)(。 )(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(有)(什)(么)(情)(况)(呢)(?)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(是)(这)(些)(人)(,)(还)(是)(这)(些)(人)(,)(还)(没)(有)(什)(么)(好)(的)(情)(情)(况)(,)(还)(是)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】CRAFTR-FCNIONmultipath Net【T21 [ 约洛夫 1 ] [ 约洛夫 2 /约洛 9000 ] [ 约洛夫 3 ] [ FPN ] [ 视网膜网 ] [ DCN ]

语义切分 FCNde convnetdeeplab v1&deeplab v2】CRF-RNN】SegNet】parse netdilated netPSPNetdeeplab v3]

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet][多通道

实例分割 SDS DeepMask SharpMask MultiPathNet MNC 】 InstanceFCN FCIS

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(,)(我)(们)(还)(是)(不)(知)(道)(。

(T38) 人类姿势估计 (T39)
[(T41) 汤普森 NIPS'14 [T42)]

复习:YOLOv3 —你只看一次(物体检测)

原文:https://towardsdatascience.com/review-yolov3-you-only-look-once-object-detection-eab75d7a1ba6?source=collection_archive---------1-----------------------

改进的 YOLOv2,性能与 RetinaNet 相当,速度快 3.8 倍!

YOLOv3

在这个故事里,华盛顿大学YOLOv3(你只看一次 v3) 进行了回顾。YOLO 是一个非常著名的物体探测器。我想每个人都应该知道。以下是作者的演示:

YOLOv3

由于作者忙于 Twitter 和 GAN,也帮助其他人的研究,YOLOv3 在 YOLOv2 上几乎没有增量改进。例如,具有快捷连接的更好的特征提取器 DarkNet-53 ,以及具有特征图上采样和连接的更好的对象检测器。并作为 2018 arXiv 技术报告发表,引用 200 余篇。( Sik-Ho Tsang @中)

概述

  1. 包围盒预测
  2. 班级预测
  3. 跨尺度预测
  4. 特征提取器:Darknet-53
  5. 结果

1。包围盒预测

Bounding Box Prediction, Predicted Box (Blue), Prior Box (Black Dotted)

  • 与 YOLOv2 相同。
  • 预测 tx,ty,tw,th。
  • 在训练期间,使用误差损失平方和。
  • 并且使用逻辑回归来预测客观性分数。如果边界框先验比任何其他边界框先验与地面真实对象重叠更多,则为 1。仅为每个地面真实对象分配一个边界框先验。

2.类别预测

  • 不使用 Softmax。
  • 相反,使用独立逻辑分类器二元交叉熵损失。因为对于多标签分类可能存在重叠标签,例如如果 YOLOv3 被移动到其他更复杂的域,例如开放图像数据集。

3.跨尺度预测

  • 使用了 3 种不同的刻度
  • 特征是从这些尺度中提取出来的,像 FPN 。
  • 基本特征提取器 Darknet-53 增加了几个卷积层(下一节会提到)。
  • 这些层中的最后一层预测边界框、对象和类别预测。
  • 在 COCO 数据集上,每个尺度 3 个框。因此,输出张量为N×N×【3×(4+1+80)】**,即 4 个包围盒偏移,1 个对象预测,80 个类预测
  • 接下来,特征图取自前 2 层,并通过 2× 对进行上采样。还从网络的早期获取特征图,并使用连接将其与我们的上采样特征合并。这其实就是典型的编解码架构,就像 SSD 进化到 DSSD 一样。
  • 这种方法允许我们从上采样的特征中获得更有意义的语义信息,从早期的特征图中获得更细粒度的信息。
  • 然后,增加几个卷积层来处理这个组合的特征图,并最终预测一个类似的张量,尽管现在大小是两倍。
  • k-means 聚类也用于在之前找到更好的边界框。最后,在 COCO 数据集上,使用了 (10×13)、(16×30)、(33×23)、(30×61)、(62×45)、(59×119)、(116×90)、(156×198)、(373×326)

4。特征提取器:Darknet-53

Darknet-53

  • YOLOv2 使用 Darknet-19 分类网络进行特征提取。
  • 现在,在 YOLOv3 中,使用了更深的网络 Darknet-53 ,即 53 个卷积层。
  • YOLOv2 和 YOLOv3 也使用批量标准化。
  • 快捷连接也如上图所示。

1000-Class ImageNet Comparison (Bn Ops: Billions of Operations, BFLOP/s: Billion Floating Point Operation Per Second, FPS: Frame Per Second)

  • 1000 级 ImageNet Top-1 和 Top5 错误率的测量方法如上。
  • 在 Titan X GPU 上使用单作物 256×256 图像测试。
  • 与 ResNet-101 相比,Darknet-53 具有更好的性能(作者在论文中提到了这一点),速度快 1.5 倍。
  • 与 ResNet-152 相比,Darknet-53 具有相似的性能(作者在论文中提到了这一点),并且速度快 2 倍。

5.结果

5.1.可可地图@0.5

mAP@0.5

  • 如上图,与 RetinaNet 相比,YOLOv3 以快得多的推理时间得到了不相上下的 mAP@0.5。
  • 例如,yolov 3–608 在 51 毫秒内获得 57.9%的地图,而retina net-101–800在 198 毫秒内仅获得 57.5%的地图,快了 3.8 倍。

5.2.COCO 整体图

Overall mAP

  • 对于整体地图,YOLOv3 的性能明显下降。
  • 然而,yolov 3–608 在 51 毫秒的推理时间内获得了 33.0%的 mAP,而retina net-101–50–500在 73 毫秒的推理时间内仅获得了 32.5%的 mAP。
  • 而 YOLOv3 与速度快 3 倍的 SSD 变种并驾齐驱。

5.3.细节

More Details

  • YOLOv3 比 SSD 好很多,性能和 DSSD 差不多。
  • 并且发现 YOLOv3 在 AP_S 上的性能相对较好,而在 AP_M 和 AP_L 上的性能相对较差。
  • YOLOv3 比使用 ResNet 、 FPN 、 G-RMI 和 TDM 的两级更快 R-CNN 变体具有更好的 AP_S。

5.4.定性结果

Nearly Exactly The Same Between Predicted Boxes and Ground-Truth Boxes

其实技术报告中关于 YOLOv3 的细节并不多。因此,我只能简单回顾一下。读 YOLOv3 时建议在 YOLOv2 和 YOLOv3 之间来回。(而且还有段落讲的是整体地图的测量。“是否真的反映了实际的检测精度?”如果有兴趣,请访问该文件。)

参考

【2018 arXiv】【yolo v3】
yolo v3:增量改进

我以前的评论

)(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(些)(人)(,)(但)(是)(这)(些)(人)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(们)(还)(不)(想)(到)(这)(些)(人)(们)(,)(我)(们)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(们)(还)(没)(想)(到)(这)(些)(人)(,)(我)(们)(还)(没)(想)(到)(这)(里)(来)(。 )(我)(们)(都)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(里)(去)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(要)(到)(这)(里)(去)(了)(,)(我)(们)(还)(不)(想)(到)(这)(些)(人)(,)(我)(们)(都)(不)(想)(到)(这)(里)(来)(。

物体检测 过食R-CNN快 R-CNN快 R-CNNDeepID-Net】R-FCN】离子多路径网NoC

语义切分 FCNde convnetdeeplab v1&deeplab v2parse net】dilated netPSP netdeeplab v3

生物医学图像分割 [cumed vision 1][cumed vision 2/DCAN][U-Net][CFS-FCN][U-Net+ResNet

实例分割
[深度掩码 ] [ 锐度掩码 ] [ 多路径网络 ] [ MNC ] [ 实例中心 ] [ FCIS

)( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )(

查看 Python 可视化包

原文:https://towardsdatascience.com/reviewing-python-visualization-packages-fa7fe12e622b?source=collection_archive---------1-----------------------

哪些解决方案在哪些情况下是好的?

使用 Python 创建图形的方法有很多,但是哪种方法是最好的呢?当我们进行可视化时,问一些关于图形目标的问题是很重要的:你是想对你的数据有一个初步的感觉吗?也许你正试图在一次演讲中给某人留下深刻印象?也许你想给别人展示一个内在的形象,想要一个中庸的形象?在这篇文章中,我将介绍一些流行的 Python 可视化包,它们的优缺点,以及它们各自的优势所在。我将把这次审查的范围扩大到 2D 图,为 3D 图形和仪表板留有余地,尽管这些包中有许多对两者都支持得相当好。

Matplotlib、Seaborn 和 Pandas:

我将这些放在一起有几个原因,首先是 Seaborn 和 Pandas 绘图是建立在 Matplotlib 之上的——当你在 Pandas 中使用 Seaborn 或 df.plot()时,你实际上是在利用人们用 Matplotlib 编写的代码。由此产生的美感是相似的,定制你的情节的方式会使用相似的语法。

当我想到这些可视化工具时,我会想到三个词:探索性数据分析。这些软件包对于初步了解您的数据来说非常棒,但在演示方面却很欠缺。Matplotlib 是一个低级的库,允许不可思议的定制级别(所以不要简单地将其排除在演示之外!),但是还有许多其他工具可以使具有演示价值的图形变得更加容易。Matplotlib 也有一套风格选择,模仿其他流行的美学,如 ggplot2 和 xkcd。下面是一些使用 Matplotlib 及其类似工具制作的图表示例:

在处理篮球工资数据时,我希望找到工资数据中值最高的球队。为了表明这一点,我用颜色标记了一个条形图,下面是每个球队的工资,以显示球员应该加入哪个球队,才能加入一个工资高的球队。

第二个图是回归实验残差的 Q-Q 图。这种可视化的主要目的是展示,即使美学并不令人瞠目结舌,也只需要很少的线条就能做出有用的可视化效果。

最终,Matplotlib 及其相关产品非常高效,但通常不是演示的最终产品。

ggplot(2):

我呻吟着写道。“Aaron,你为什么要谈论最流行的 R 可视化软件包 ggplot?这不是 Python 包审核吗?”你可能会问。开发人员用 Python 实现了 ggplot2,复制了从美学到语法的一切。从我看到的所有材料来看,它看起来和感觉上都像 ggplot2,但有一个额外的好处,即依赖于 Pandas Python 包,该包最近否决了一些导致 ggplot 的 Python 版本不相关的方法。如果你想在 R 中使用真正的 ggplot(它有所有相同的外观、感觉和语法,没有依赖性),我在这里讨论它的一些额外好处!也就是说,如果你真的必须在 Python 中使用 ggplot,你必须安装 Pandas 版本 0.19.2,但是我要警告不要降级你的 Pandas,这样你就可以使用一个劣质的绘图包。

使 ggplot2(我猜还有 Python 的 ggplot)改变游戏规则的是他们使用“图形的语法”来构造图形。基本前提是,您可以实例化您的绘图,然后单独向其添加不同的功能,即标题、轴、数据点和趋势线都是单独添加的,具有各自的美学属性。下面是一些 ggplot 代码的简单示例。首先,我们用 ggplot 实例化我们的图形,设置我们的美学和数据,然后添加点、主题和轴/标题标签。

散景:

散景很美。在概念上与 ggplot 类似,它使用图形的语法来构造图形,Bokeh 有一个易于使用的界面,可以制作非常专业的图形和仪表板。以说明我的观点(抱歉!),下面是从 538 男子气概调查数据集制作直方图的代码示例。

Using Bokeh to represent survey responses

左边的条形图显示了 538 在最近的一次调查中对“你认为自己是男性吗”这个问题的回答。第 9–14 行中的散景代码创建了一个优雅而专业的响应计数直方图,具有合理的字体大小、y 刻度和格式。我写的大部分代码都用来标记轴和标题,以及给条块加上颜色和边框。当制作漂亮、像样的人物时,我非常倾向于使用散景——很多美学工作已经为我们完成了!

Using Pandas to represent the same data

左边的蓝色图是来自上面要点的第 17 行的一行代码。两个直方图具有相同的值,但是用于不同的目的。在探索性的环境中,用熊猫写一行来查看数据要方便得多,但是散景的美学显然更胜一筹。散景提供的每一个便利都需要在 Matplotlib 中进行定制,无论是 x 轴标签的角度、背景线、y 轴刻度、字体大小/斜体/粗体等。下图显示了一些随机趋势,其中使用了图例和不同的线型和颜色进行了一些自定义:

散景也是制作交互式仪表盘的好工具。我不想在这篇文章中讨论 dashboarding,但有一些很棒的文章( 就像这个 )更深入地讨论了散景仪表板的应用和实现。

Plotly:

Plotly 非常强大,但设置和创建图形都需要大量时间,而且都不直观。在花了大半个上午的时间研究完 Plotly 之后,我去吃午饭,结果几乎一无所获。我创建了一个没有轴标签的条形图和一个“散点图”,其中有我无法删除的线条。开始使用 Plotly 时有一些值得注意的缺点:

  • 它需要一个 API 密钥和注册,而不仅仅是一个 pip 安装
  • 它打印 Plotly 特有的非直观的数据/布局对象
  • 剧情布局对我来说还没起作用(40 行代码字面上什么都没有!)

然而,对于它的所有设置缺点,也有优点和解决方法:

  • 您可以在 Plotly 网站以及 Python 环境中编辑地块
  • 对交互式图形/仪表板有很多支持
  • Plotly 与 Mapbox 合作,允许定制地图
  • 伟大的图形有惊人的整体潜力

对我来说,只是抱怨 Plotly 而不展示一些代码和我能够完成的与更有能力使用这个包的人所做的相比是不公平的。

A bar graph representing average turnovers per minute by different NBA teams

An attempt at a scatterplot representing salary as a function of playing time in the NBA

总的来说,开箱即用的美学看起来不错,但是多次尝试修复轴标签,逐字复制文档,没有产生任何变化。然而,正如我之前承诺的那样,这里有一些展示 Plotly 潜力的情节,以及为什么花几个小时以上可能是值得的:

Some sample plots from the Plotly page

Pygal:

Pygal 是一个鲜为人知的绘图包,和其他流行的包一样,它使用图形框架的语法来构造图像。这是一个相对简单的软件包,因为绘图对象非常简单。使用 Pygal 非常简单:

  1. 举例说明你的身材
  2. 使用图形对象的属性格式化
  3. 使用 figure.add()符号将数据添加到图形中

我和 Pygal 之间的主要问题是如何渲染这些数字。我必须使用他们的 render_to_file 选项,然后在 web 浏览器中打开该文件,看看我构建了什么。它最终是值得的,因为数字是互动的,有一个愉快的和容易定制的美感。总的来说,这个包看起来不错,但是有一些文件创建/渲染的怪癖限制了它的吸引力。

网络 x:

Networkx 是分析和可视化图形的一个很好的解决方案,尽管它在视觉上基于 matplotlib。图形和网络不是我的专业领域,但是 Networkx 允许快速简单地用图形表示连接的网络。下面是我构建的一个简单图形的几种不同表示,以及一些开始绘制一个小型脸书网络的代码。

我用编号(1-10)对每个节点进行颜色编码的代码如下:

下面是我写的用来可视化上面提到的稀疏脸书图的代码:

This graph is quite sparse, Networkx shows it by giving each cluster maximum separation

有这么多的软件包来可视化数据,但没有明确的最佳软件包。希望在阅读完这篇评论后,您可以看到各种美学和代码如何适用于不同的情况,从 EDA 到演示。

重温以前的经历可以帮助人工系统更快地学习

原文:https://towardsdatascience.com/revisiting-previous-experiences-can-help-artificial-systems-to-learn-faster-4975298697e8?source=collection_archive---------35-----------------------

优先体验重放建议混合新旧体验以加速学习

Photo by Robina Weermeijer

e enforcement Learning(RL)是一个框架,它有很大的潜力成为“下一级”人工智能的基础,即所谓的人类级人工智能。在[1]中,Nils J. Nilsson 将这个下一级描述为:

“[……]通用的、可教育的系统,可以学习并被教会执行人类可以执行的数千种工作中的任何一种。”

RL 成为实现这一目标的良好候选的原因很简单:它基于奖励的学习机制接近于人类大脑用于学习事物的机制。RL 代理通过试错来学习如何表现以最大化收到的奖励(可以想象一只狗从它的主人/训练员那里得到款待)。

尽管具有潜力,经典 RL 方法显示出许多局限性,即使能够解决许多复杂的问题,也远远不能实现这一通用的长期目标。

在寻求改进的过程中,许多研究人员提出了扩展 RL 的生物启发方法。下面描述的方法包括以有效的方式使用存储的存储器来加速学习。

记忆帮助我们学习

Photo by Conmongt

神经科学领域的研究支持,包含先前经历的记忆在啮齿动物的海马体中重演,这在不同水平的大脑活动中观察到。

结果还显示,导致某种程度奖励的经历会更频繁地重演。更有趣的是,新鲜感还与重演某些经历的概率相关,如[2]所述:

“[……]我们已经确定,例如,在新的环境和奖励驱动的空间任务中,多巴胺能释放对于偏向随后重放轨迹的内容是重要的,有可能加强新的位置细胞组合和位置-奖励关联。”

这意味着学习也是通过重温旧的经历来进行的,并且使用某种机制来选择更好的经历以优化学习过程,例如,选择呈现某种程度的新颖性或与收到的奖励相关联的经历。

体验回放

为了模仿生物系统中存在的这种经验机制,在[3]中提出了称为经验重放的方法,以及用于规划和教学的学习行为模型。这三种扩展方法被建议用来加速 AHC(自适应启发式批评家)和 Q-学习算法的学习。应用体验回放的动机是:

“基本的 AHC 和 Q 学习算法[……]效率低下,因为通过反复试验获得的经验仅用于调整网络一次,然后就被丢弃。这是一种浪费,因为有些经历可能是罕见的,而有些经历(如涉及损害的经历)的获得成本很高。应该以有效的方式重复利用经验。”

假设是存储和处理以前的经验比与环境互动“更便宜”。

经验定义为四重, (s,a,s’,r) ,意思是执行一个动作 一个 处于一个状态 s 产生一个新的状态‘s’和奖励 r 。当与环境交互时,代理记住(通过采样)它过去的经验,以便从中学习更多。

通过应用体验重放缓解的两个主要问题是:

  1. 强相关更新:流行的基于随机梯度的算法假设变量是独立同分布的(独立同分布)。然而,独立同分布假设不太适合马尔可夫链(状态序列)。当把在线体验和存储的体验混合在一起时,就有可能“打破”连续状态之间的关联。
  2. 遗忘重要经验:如前所述,有些情况可能很少经历,经典 RL 算法只是在下一次迭代中丢弃旧的经验。

优先体验重放(PER)

经验回放的引入已经是 RL 的一大进步。然而,生物学证据支持一些经历比其他经历更频繁地重演。

在[4]中,提出了经验重放方法的改进版本 PER。主要思想是使用 TD 误差作为一个度量来定义重放一些经验的概率。

TD 误差代表给定状态的预测误差(模型输出和接收到的奖励之间的差异),经常被用作优先化机制(例如,人工好奇心[5]和特征选择[6])。

其动机是,类似于生物系统,学习系统可以从中学习更多的经验(即与大的 TD 误差相关的状态)应该更频繁地重放,从而加速学习过程。

[4]中的结果表明,在应该学习如何玩 Atari 游戏的代理上应用 PER 允许将学习速度提高 2 倍。

Photo by Kirill Sharkovski

不仅 RL 可以从中受益

[4]中给出的另一个有趣的结果是,同样的方法可以用于改进监督学习方法。该方法被重新命名为优先采样,包括更频繁地使用代表更高误差的例子,以集中优化(学习)过程:

“在监督学习的环境中,类似于优先重放的方法是从数据集中进行非均匀采样,每个样本使用基于其最后出现的错误的优先级。这可以帮助将学习集中在那些仍然可以学习的样本上,将额外的资源投入到(硬)边界情况中”

这种方法在处理不平衡数据集时尤其有用,因为包含较少表示的类的示例将具有较高的采样优先级,前提是它们仍然会导致较大的预测误差。

当应用于经典 MNIST 数字分类问题的类不平衡变体时,优先化采样被证明导致在泛化和学习速度方面的性能提高。

参考

[1]Nils j . Nilsson《人类级人工智能?认真点!."艾杂志 26.4(2005):68–68。阿泽顿、劳拉·a、大卫·杜普雷和杰克·r·梅勒。"记忆痕迹重放:通过神经调节形成记忆巩固."神经科学趋势 38.9(2015):560–570。
[3]林,隆基。"基于强化学习、规划和教学的自我改进反应代理."机器学习 8.3–4(1992):293–321。
[4]绍尔,汤姆等,“优先化的经验重放”arXiv 预印本 arXiv:1511.05952 (2015)。
【5】“人工智能如何变得好奇?”"【https://towardsdatascience . com/artificial-curiosity-e 1837 E4 ca 2c 9
[6]孙,易,等《基于时差误差的增量基构造》。“ICML。2011.

人工智能革命

原文:https://towardsdatascience.com/revolution-of-artificial-intelligence-260924f4c933?source=collection_archive---------17-----------------------

在为时已晚之前应该问的问题

Pexels

机器是需要特定指令来执行的哑东西,但自从人工智能和机器学习的兴起,事情开始变得不同,因为机器开始根据它们拥有的数据做出决定,并开始从错误中学习。据预测,未来机器将更能控制自己的决策。

谁知道呢?他们将来可能会控制我们,甚至把我们送进监狱。

在 UCL 大学,他们开发了一个程序,可以根据案件文件预测刑事案件的判决,该程序使用 500 个样本显示了类似人类的结果,准确率为 80%,此外,人类不是 100%准确,我们的表现在很大程度上取决于许多生物因素,如情绪,精神状态,甚至身体状态。

我们的智力不仅取决于生物因素,而且还受到我们生物极限的限制,我们的大脑大小固定,不具备像机器一样进行分布式(并行)处理的能力。人类直到现在都在尝试使用工具来克服这些限制,比如使用纸张、提醒和计算器。

大约 100 年前,我们还没有广泛接触到电力,但现在,随着电力的兴起,它改变了每一个主要的工业,通信,汽车等。在 18 世纪,70%的美国居民从事农业,今天,不到 1%的人从事农业,这是在大约 200 年内发生的,这是因为在电气领域发生了几次革命。

“人工智能是新的电力”,吴恩达说

在预测未来三十年将形成的十二种技术力量的《不可避免》一书中,凯文·凯利说,使用我们从云中获得的廉价而强大的人工智能,一切都将变得更加智能。

谷歌在过去几年中收购了超过 13 家人工智能公司,我们知道 Alphabet——谷歌的母公司和几家前谷歌子公司——从谷歌的搜索引擎中获得了大约 70%的利润,但预计到 2026 年,谷歌将成为一家主要依赖人工智能项目的公司。

Image by Gerd Altmann from Pixabay

我们在互联网上做的一切都被记录下来,当你在谷歌上搜索“Maher”并点击我的照片时,你只是告诉谷歌这是 Maher,这是他的长相,你在网上采取的每一个行动,很可能都被记录下来,以改善互联网和人工智能引擎。

如果机器将拥有意识,有许多问题需要回答。

比如,我们会告诉机器崇拜某个上帝,还是它们会崇拜我们,它们的主要创造者,设计它们的工程师?

如果智能机器做错了什么,比如杀了人,会怎么样?我们会惩罚机器还是给它编程的工程师?让它变得智能并能杀人的工程师,从技术上来说,他创造了一种能自动杀人的武器。

我认为,如果机器获得了意识,我们应该通过在它们身上实施惩罚系统来让它们经历惩罚,以便我们能够在它们犯错误时惩罚它们,因为我们不确定它们是否都是好的。

机器人可以是种族主义者,2016 年微软创建了一个名为 TayandYou 的 Twitter 机器人,不到 24 小时后,该机器人就成为了种族主义者和反对女权主义者,它在社交媒体上变成了一个笑话,但仍然引发了一些问题。

机器主要从我们和他们的环境中学习,所以我们应该小心我们教给他们的东西。当然,这只是暂时的,将来他们可能会有自己的观点和想法,这些观点和想法来自经验和认知思维。

到目前为止,这些机器必须对人类负责。他们缺乏在程序之外做决定的能力。我们还没有达到通用人工智能——它是一台能够成功完成人类可以完成的任何智力任务的机器的智能——但是许多伟大的思想家说,我们离达到那里并看到科幻成为现实不远了。

在我看来,人工智能不一定是一件坏事,它们会对我们有很大的帮助,加里·卡斯帕罗夫认为机器应该赋予我们权力,而不是压倒我们,在 2014 年的一次国际象棋比赛中,人工智能独自赢得了 42 场比赛,但人工智能与人类一起赢得了 52 场比赛,人工智能主要根据我们创造和收集的数据进行训练,所以直到现在,人类和人工智能相互需要。

Pexels

通用人工智能可能是人类自发现火和农业以来取得的最大成就,在机器达到技术奇点——人工超级智能的发明——一个可升级的智能代理将进入自我改善周期的“失控反应”,每一代新的更智能的一代出现得越来越快,导致智能爆炸,并产生一种强大的超级智能,在质量上远远超过所有人类智能。

我们会进入这样一个未来吗?在这个未来,我们享受着宁静的生活,而计算机和人工智能为我们做所有的工作。机器会终结人类吗?我们会不会像电影里看到的那样,永远生活在有意识的电脑上,抛弃自己的身体?

这些都是我们需要回答的问题,如果有一天我们设法创造出一个超级智能的机器。

使雪花与众不同的革命性特征——深度潜水

原文:https://towardsdatascience.com/revolutionary-features-of-snowflake-that-sets-it-apart-a-deep-dive-773ba52ee694?source=collection_archive---------12-----------------------

雪花提供了足够的功能来投入时间和资源吗?有周围炒作的那么好吗?让我们深潜,看看是什么让它与众不同。

最近,我有机会参加在悉尼举行的雪花峰会。我学到了一些东西,并想在实际数据上尝试一下。起初是试探性的,但在对 40GB 的数据使用它后,我意识到有一些功能使雪花在市场上与 Redshift,Azure SQL 或类似的 MPP 数据仓库竞争。

因此,这篇文章涵盖了 snowflake 的一些特性,这些特性在其他 MPP 仓库中要么没有实现,要么部分实现,或者工程师在进行 ETL 时必须实现,还有一些特性是很好的,但如果没有,也不会产生任何影响。

区分特征

排名不分先后,以下是一些有用的特性,这些特性让雪花有别于其他 MPP 仓库。

克隆桌子

雪花称之为‘零拷贝克隆’。雪花的区别特征之一。让我们来看一个用例,工程师或分析师必须克隆一个表,要么进一步修改它,要么只对它进行快照。现在,正如我们所知,任何 MPP 仓库都会创建表的深层副本,这会消耗额外的空间,而当您在雪花中克隆它时,它只会将原始表的指针存储在新表中。换句话说,数据实际上是相同的,但是通过两个不同的表引用。

现在,当您更改新表时,它将只存储该列,而其余的列仍然使用相同的指针。因为,雪花像其他 MPP 仓库一样,以列格式存储数据,这个特性变得非常有用。

放下&取消放下桌子

顾名思义,可以在这个命令的帮助下取消已删除的表格。如果您有一个工程师正在处理一个对资源有 drop 访问权限的表,并且意外地删除了它,那么这个特性可能会很有用。起初,这个特性没有任何意义,因为您不会将 drop 访问权授予无意中删除了一个有用表的工程师。但是考虑到一些公司更喜欢对他们的数据环境采用分散的方法,你可能会遇到由不太有经验的人来处理不同的账户,这些人可能会在他们的实例中丢失一个有用的表。相信我,这种事情现在已经发生了很多次了。

因此,以下命令允许您取消删除表格:

Undrop table {table_name};

一旦执行了上述命令,输出/结果窗格将显示以下响应。

默认情况下,雪花有 24 小时的时间来取消桌面,但如果您使用企业版,则有 90 天的时间。

提交后回滚一个表

本质上,这个特性是对 update 语句的回滚,即使是在提交之后。或者换句话说

update {table_name} set {column_name} = ‘value’;

更改基于每个查询的计算

正如在上面的窗口中可以看到的,我们可以在执行特定查询之前更改集群配置,以便让雪花使用更高的计算能力,如果我们将要执行的查询是繁重的,反之亦然。因此,当您想要运行查询时,只需选择查询,更改仓库并单击 run。最好的部分是您可以将它包含在您的 ETL 中,并充分利用它。我将把它留给你去探索。是的,这里的仓库和我们所知道的有所不同。

自动缩小比例

所以,这确实引起了我的注意。在深入研究这一点之前,让我首先告诉您,雪花就是这样一种数据仓库功能,其中计算和存储是分开计费的。或者换句话说,如果集群(这里是仓库)在不使用的时候被挂起,那么您将会节省很多钱。

在配置仓库时,您可以指定 Auto suspend 特性,这实际上意味着如果集群在特定时间内处于非活动状态,它的计算将缩减到 none。您还可以指定扩展策略,以便动态地来回扩展集群/仓库。最棒的是,您甚至可以通过脚本动态缩放它。

所有云提供商集中在一个地方

您需要让雪花知道数据当前存放的现有暂存区域。最好的部分是我们可以在数据库中有一个模式,它指向 AWS 中的 s3 位置,而其他模式可以指向 Azure blob。通过单击“Create ”,您可以创建让您选择 s3 位置的模式。对于 Azure Blob 也是如此。

当您运行如上所示的查询时,它将显示特定路径下的所有键/文件/blob。

据我所知,谷歌云存储的整合还在进行中,很快就会推出。

也可以使用以下命令创建阶段:

create stage {stage_name} url = {s3_location};

复制拼花文件

在写这篇文章的时候,AWS 在 Copy 语句中没有 parquet 选项,你需要启动 ADLA 在 Azure 中做同样的事情。而在 snowflake 中,您可以借助以下步骤将 staging 中的拼花数据复制到表中:

首先,您需要创建文件格式,这实质上是您让雪花知道的模式,以便它在将数据加载到表中之前正确地解析数据。

在这里,您可以指定格式类型(拼花)、压缩、分隔符等。这些选项或多或少与 Redshift Copy 语句中的选项相同。

在加载到表格之前查看 s3 数据

Snowflake 允许您在将临时区域加载到表中之前查询它。它会让您知道暂存区中有哪些记录。我会让你知道怎么做。不用说,这对于避免表中的加载错误非常有帮助。

有特色真好

这些是 snowflake 中的特性,在其他 MPP 仓库中也很好,但是如果没有这些特性也不会有太大的不同。

缓存查询结果

雪花缓存过去 24 小时内执行的每个查询的结果。因此,除非表中的下划线数据已经改变,否则相同的查询将给出相同的结果。然而,除非数据发生变化,否则几乎没有任何人需要再次执行相同查询的情况,但不管怎样,拥有这个特性还是很好的。

当您检查历史记录时,可以看到第二个查询比第一个查询执行得快得多,而两个查询完全相同。

在一个用户界面中进行计算、操作和存储

大多数云提供商已经处理了计算、操作和存储,但是当您想要了解集群配置时,您必须单独打开云提供商的门户来查看。而在 snowflake 中,同一个窗口将给出执行了什么查询,什么时候执行的,以及通过哪个集群配置执行的。都在一个地方。再说一遍,有功能是好事,但没有增加多少价值。

在上面的窗口中,“Warehouses”窗格将让您知道什么是集群配置,“Databases”将列出具有所需功能(如 create)的数据库,Worksheets 实际上是它的 SQL 编辑器,“History”给出了过去 1 年中执行的查询列表,“Shares”将让您知道您共享了什么以及与谁共享了什么。

历史浏览界面

到目前为止,如果我们需要从历史中提取值,要么我们需要运行系统查询,要么创建一个单独的 ETL,它接收历史日志并将数据推入所需的历史表中。但是在 snowflake 中,您可以查看您和其他用户(如果您是 sysadmin 或更高级别的用户)在过去 1 年中执行的查询列表。从数据治理的角度来看,这是一个有用的特性。

转换角色

如果您是 sysadmin 或 accountadmin,您可以承担其他角色,并检查您创建的角色是否具有足够的治理。

共享表到另一个账户

我们经常会遇到这样的情况,我们需要与分析师、数据科学家或业务分析师共享一个特定的表,而这个团队有一个不同的雪花帐户。雪花让您安全地共享表,以便其他团队可以根据需要处理数据。

包裹

我不应该称之为特色,而应该称之为实践。Snowflake 试图促进的一个实践是,它有目的地让您在冷存储中创建暂存区,以便您可以在将数据加载到其中之前看到数据的样子。这是一个非常有用的实践,但恐怕还没有多少公司采用。然而,现在,结果窗口只显示最近的结果,并且 GUI 没有能力提供选项卡式的多个结果来比较一个输出与另一个输出。从我的角度来看,这是 snowflake 目前缺乏的一个主要特性,但我不能责怪他们,因为没有其他云供应商将 sql 编辑器完全嵌入其中,更不用说多个查询结果了。

最后,我只在 40GB 的数据上使用了它,没有机会在我们 20TB 的数据仓库上使用它,但据我所知,如果不明智地使用,雪花会变得有点昂贵。好吧,伟大的特性是有代价的。

革新编辑——我最后一年的项目

原文:https://towardsdatascience.com/revolutionising-redaction-my-final-year-project-fe664e28ef84?source=collection_archive---------22-----------------------

现在,随着法规的重大变化,确保个人数据的安全并仅由正确的人查看变得更加重要。由于这是一个现在如此热门的话题,我非常渴望在最后一年的项目中挖掘这个日益增加的问题。

我目前正在贝尔法斯特皇后大学完成我最后一年的软件工程学习,并且得到了 T2 凯诺斯公司的赞助来完成这个项目。在这篇博客中,我计划带你开始我的项目之旅,包括它的必要性和所用技术的高层次概述。

那么,问题是什么呢?

修订是从文档中删除敏感信息的实际过程,它需要跨许多不同的行业来完成。它通常需要有人手动逐字浏览文档,寻找要删除的敏感信息,这当然是一项非常耗时、乏味且容易出现人为错误的任务

我相信我们都见过一些文档,它们看起来是这样的:

编校的一个主要问题是,当许多单词被删除时,文档的整个上下文可能会丢失。

我的解决方案

这个项目的总体目标是识别和删除文档中的敏感信息,同时仍然保留其整体上下文。该项目分为 3 个主要特点:

1.自动校订器——旨在获取用户的文档,自动识别和替换敏感词,并向他们呈现文档的校订副本

2.用户选择修订 —旨在获取用户的文档,自动识别敏感词,并将这些词发送回用户,让他们选择要删除哪些词。

  1. Labeller —旨在使重新训练模型识别更多单词的过程更加容易和快速。

如何识别敏感词?

这个项目围绕着识别文档中敏感词的能力。为此,我正在利用自然语言处理(NLP),这是人工智能的一个子领域,它是计算机处理、分析和理解人类语言的能力。

在 NLP 中,该项目特别关注命名实体识别(NER ),它搜索文本主体并将命名实体分类到预定义的类别中。这些类别可以是不同类型的敏感词,例如人名、组织、货币价值、位置和日期。

为了帮助我完成这项任务,我遇到了一个非常棒的开源 python 库,名为 spaCy ,这是一个用于高级自然语言处理的库。

spaCy 是惊人的,有助于通过一系列语言注释显示文本的语法结构。它可以识别关于文本的不同属性,例如:基本单词形式;如果单词包含字母字符或数字;句子边界检测,并可以标记词类,例如,如果该词是名词,动词,形容词等。

处理不同类型的文档

由于修订发生在如此多不同类型的行业,我希望该项目能够迎合可能上传的不同风格的文档。例如,法律文件中的措辞可能与医院报告中的不同。为了能够处理这个问题,我需要利用多种人工智能模型——但这些是什么呢?

人工智能模型是二进制数据,这些数据是通过向系统展示足够多的例子来产生的,这些例子使系统能够做出跨语言的预测。对于这个项目,我使用了默认的空间模型,并以我自己的训练数据为基础。

该项目由三个独立的模型组成,因此可以使用特定于领域的模型来编辑文档。比如说;如果用户正在上传法律文档,它将使用专门针对法律文档训练的模型。该项目包含的三个模型是法律、保险和一般模型。

自动编辑程序

项目中的主要功能之一是自动编校器。我已经建立了它,以便一旦用户上传一个文件,他们需要选择其类型,如法律,保险或一般,为应用程序找出应该使用哪个模型。

一旦文档被上传,就会发生一系列不同的过程,以便对文档中不同类型的单词/短语进行预测。如果你有兴趣听到更多关于这个过程的信息,深入的描述和例子可以在这里找到。

我使用自动编校器的主要目的是让它不仅能删除文档中的敏感信息,还能保留文档的上下文。为了达到这个目的,一旦敏感词被识别出来,我就用它们的标签来代替它们。例如,如果一个名字被识别出来,它就会被删除,取而代之的是“人”这个词。这确保了文档的内容仍然完好无损,但是文档不再包含任何敏感信息。

用户选择编辑

在最初的项目研究中,我发现有时并不是所有的敏感词都需要从文档中删除。例如,如果一家企业与某个特定的客户合作,可能需要删除关于该客户的信息,但可以保留关于企业本身的信息。

为了能够处理这个用例,我创建了一个名为用户选择修订的功能,它通过让用户选择预览已经识别的敏感词来工作。

当用户上传文档时,如果他们选择了预览选项,那么已经被模型识别的敏感词列表将被发送回给他们。

然后,用户可以简单地选择他们想要从文档中删除的单词。然后,只有选中的单词会被它们的标签替换,用户会收到可以下载的修订文档的副本。

再培训模型

这个项目的另一个主要功能是贴标机。我构建了这个工具,试图让重新训练模型识别更多单词的过程变得更容易、更快。

重新训练模型不是让它们记住更多的例子,而是让单个模型改进它们的算法,以便它们可以用于概括越来越多的文档。在自动编校器中,模型根据他们看到的文档进行预测,因此提高识别文档中所有敏感词的准确性的唯一方法是用更多的数据进行重新训练。

标签器允许用户通过选择一个单词,然后点击他们希望分配给它的标签的按钮来高亮显示该单词。

为了实际使用这些单词来重新训练现有的模型,需要获取与整个文件相关的每个单词的开始索引和结束索引。这些索引和每个敏感词的标签用于与原始文件一起建立训练数据。

在不涉及太多细节的情况下,该过程获取训练数据中的每个单词,并使用该模型对它认为该单词是什么命名实体进行预测,然后查看训练数据中该单词所附的标签,以查看该预测是否正确。如果预测不正确,它会调整其权重,以便下次获得正确的结果。然后,对模型的更新被保存到模型中以更新它。

项目完成

完成后,可以清楚地看到,像这样的项目在私营和公共部门都有很大的潜力,因为它可以在符合 GDPR 标准的位置呈现文本数据。

这个项目不仅使编辑过程更快更容易,而且也有可能成为人工智能行业的革命。当数据包含敏感信息时,很难找到可用的数据来训练人工智能模型。目前,有许多任务人工智能可以协助,但不能,因为所需的数据集包含个人信息,导致它是可牺牲的。有了这样的产品,数据集很容易被匿名化,因此可以被使用。

接近完成时,该项目被列为久负盛名的 Megaw 纪念讲座的决赛选手之一,这是皇后大学内部的一项竞赛,面向电子、电气工程和计算机科学学院的所有毕业班学生开放,以展示他们的毕业班项目。

在介绍了该项目的业务需求和创建该项目所使用的技术后,该项目被评为总赢家,并由工程技术研究院 (IET)授予 Megaw 纪念奖。

我还想说,我非常感谢 Kainos 赞助这个项目,并为我提供了乔丹麦克唐纳作为项目导师,他在整个项目期间的指导是非常宝贵的。

进化算法中的奖励黑客

原文:https://towardsdatascience.com/reward-hacking-in-evolutionary-algorithms-c5bbbf42994b?source=collection_archive---------20-----------------------

人工智能代理如何通过准确地做他们被告知的事情来欺骗系统,以及我们能从他们身上学到什么

Image Source: The Wolves of North America, Vol. II, Edward Alphonso Goldman

如果 W. W .雅各布斯出生在一个世纪之后,猴爪可能会有一个邪恶的人工智能,而不是那只被诅咒的手。人工智能代理,像有名无实的 paw,因为以一种没有人期望或想要的方式做了他们被 T2 要求做的事情而臭名昭著。就像偶尔的消防员为了扮演英雄和“拯救世界”而纵火(你已经是英雄了,伙计),就像那只狗在救了一个溺水的孩子后得到了牛排的奖励,所以走上了把孩子扔进河里的道路,人工智能特工会做任何他们能做的事情来最大化他们的奖励。这种行为,其中人工智能代理使用违反规则精神或意图的策略增加他们的奖励,被称为奖励黑客。通常,对人工智能开发者或政策制定者来说似乎合理的回报会导致令人捧腹的灾难性结果。在这里,我们将探索人工智能代理在追求奖励时表现淘气的三个案例,以及它们可以教给我们什么是好的奖励设计,无论是在人工智能中还是对人类而言。

进化算法:导论

如果你还没有,看看我的文章 进化的神经网络 对进化算法的解释。如果你已经读过,请随意跳过这一部分。如果你没有也不会,这里有一个概要:

进化算法是一种涉及模拟生物进化以产生某个问题的解决方案的技术。模拟中的每个有机体都是所述问题的潜在解决方案。这些生物体实际上可以是任何东西:蛋白质的 3D 结构、电子元件、虚拟汽车等等。该算法的步骤很简单:

  1. 创造一个随机有机体的初始种群。
  2. 衡量每一个有机体对于你试图解决的问题有多好。这被称为生物体的适应度
  3. 选择最好的生物,让它们交配,为下一代创造一个新的种群。
  4. 通过随机调整使这些后代变异。
  5. 带着变异后代的新群体回到第二步。

假以时日,该算法将(有希望)进化出一种足以解决上述问题的有机体。虽然奖励黑客行为发生在所有类型的强化学习中,但我选择关注它在进化算法中的发生,因为进化没有能力预见或规划,这表明这些病理策略是进化稳定的,有机发展的。

它们越大…

1994 年,卡尔·西姆斯发表了一篇名为 进化中的虚拟生物 的论文

描述了一种使用遗传算法创建虚拟生物的新颖系统,这些虚拟生物在模拟的三维物理世界中运动和行为………。(西姆斯,1994 年)

正如论文所解释的,西姆斯开发了一种生成和训练模拟 3D 生物的方法。这些生物的 DNA 被编码成一个有向图,通过遍历该图,将每个节点实例化为一个肢体,来表达为一个有机体。下图说明了 DNA 是如何表现的,以及三种生物的基因组是如何表现为虚拟生物的。

The DNA and morphology of the creatures described by Sims (Source: Sims, 1994)

模拟生物进化成在不同环境中执行各种任务。其中包括:

1.游泳

生物被放入虚拟的水下环境,目的是进化出会游泳的生物。通过禁用重力和添加粘性效果来模拟水,粘性效果引入了摩擦力和通过推动水进行推进的潜力。每个模拟都运行一段固定的时间,并测量生物体的适应度分数。从报纸上看,

游泳速度作为适应值,用单位时间内生物质心移动的距离来衡量。

在实验中,西姆斯遇到了一些困难。首先,这些生物似乎学会了转圈游泳,或者前后摆动。从技术上讲,这两种行为都构成了适应度函数所定义的“游泳”,但这两种行为都不太可能是模拟人生的初衷。具有这些行为的生物利用了平均速度的奖励,因此学会了快速移动,而不用实际去任何地方。为了防止这种情况,适应度函数被改为奖励绝对平均速度,而不是平均速度(换句话说,生物的奖励与它们开始和结束的距离成比例)。

另一个意想不到的策略是,生物先做一个大的初始推动,然后在水中滑行,这与其说是游泳,不如说是有风格的流动。为了防止这一点,适应度函数被改变,以在模拟结束时给生物的速度增加额外的奖励,鼓励他们坚持到最后。

2.跳跃的

生物被放在一个虚拟的陆地环境中,目的是进化出一种可以跳跃的生物。通过引入重力、去除粘性水效应和添加具有摩擦力的平坦地面来模拟陆地环境。当我们说“跳”的时候,重要的是我们要把它定义为一个清晰可测量的动作。从报纸上看,

跳跃行为可以通过测量生物最低部分离地面的最大高度来选择。

请注意模拟人生是如何明确地指出这是生物最低部分的最大高度。一个不太细心的研究人员(甚至可能是第一次尝试的西姆斯)可能会将这里的适应度定义为生物的质心离地面的最大高度,正如游泳实验中所使用的那样。乍一看,质心适应函数似乎是合理的,但在实践中,生物可以通过长得可笑的高来轻易地欺骗这个系统。另一个乍一看似乎合理的潜在适应度函数是生物最低部分的平均高度;然而,这可能导致生物反复进行小跳跃,而不是认真学习跳跃。

3.步行

生物再次被置于模拟的陆地环境中,这一次是为了进化出一种可以在陆地上移动的生物。与游泳实验相似,该论文指出

[a]增益,速度被用作选择标准,但是速度的垂直分量被忽略。

通过“速度”,似乎西姆斯再次意味着“绝对平均速度”,我们可以假设他也增加了相同的奖金有一个大的最终速度。在论文的这一部分,西姆斯描述了一些生物发展出的一种不幸的策略,这种策略包括长得很高和摔倒。虽然这些生物肯定移动得非常快,但这是否是有意为之的行为值得怀疑。Sims 能够防止这种情况,“首先在没有摩擦力和效应器力的情况下运行模拟,直到质心的高度达到稳定的最小值。”这是一种奇怪的方法,因为改变适应度函数来测量生物的最接近点的绝对平均速度,而不是它的质心,会更简单,也同样有效。

从字里行间解读

进化中的虚拟生物就其本身而言是一篇优秀的论文,但当你理解作者不得不与他的生物的自然倾向作斗争以欺骗系统的每一步时,它会变得更好。通读方法论,他提到了几件可能出错的事情,我们可以肯定他是凭经验说话。如果你有兴趣看这些生物的行动,这里有一个视频。很抱歉质量不好。

一丘之貉…

1995 年,拉里·耶格尔(Larry Yaeger)发表了一篇名为 PolyWorld:新背景下的生命 的论文,他在论文中描述了虚拟世界中模拟生物的同时进化。就像 Sims 的论文一样,PolyWorld 是一个虚拟的 3D 环境,用于创建生物体,其形态和行为是由进化算法开发的。与 Sims 的论文不同,在该论文中,生物体被孤立地模拟,PolyWorld 被设计成允许生物体相互作用。

A screenshot of PolyWorld from the original paper

尽管实现起来很复杂,但 PolyWorld 的前提非常简单。具有随机形态和行为的生物被放置在 3D 环境中,该环境由一个平面(地面)、自由生长的食物和可选的障碍组成。生物通过行动与环境互动,包括移动、进食、交配和打斗等。为了采取这些行动,生物必须消耗能量。通过吃食物或其他生物的尸体来恢复能量。当一个生物耗尽能量时,它就会死亡。如果两个生物接触并都开始“交配”行为,它们繁殖,并各自给后代一些能量。

通常,遗传算法包括一个适应度函数,旨在进化出一个解决特定问题的有机体,如西姆斯对有机体游泳、跳跃和行走能力的评估。然而,耶格尔在《多元世界》的论文中指出

除了生存没有健身功能。

这使得《聚世界》成为虚拟生命的真实模拟,并且像《有机生命》一样,它产生了一些相当非正统的生存策略。

无尽形态最美?

Either way, they’re in for a good afternoon (Source: freepik)

耶格尔描述了一个在没有墙壁的环形环境中进化的物种,他称之为“狂热的慢跑者”;这些小动物的特征是总是直线奔跑,适当地与它们接触的任何东西交配或进食。随着时间的推移,慢跑者通过繁殖出他们遇到的任何其他生物的多样性来主宰种群。尽管狂热的慢跑者显然过着他们最好的生活,但他们对生存问题的解决方式过于简单。为了解决这个问题,耶格尔增加了一个杂交功能,它阻止基因不相似的生物繁殖,鼓励物种形成。自由恋爱和马拉松的时代结束了。

The secret ingredient is love (Source: freepik)

耶格尔描述的另一个物种是“懒惰的食人族”。这些生物过着定居的生活,通常在它们出生的几步之内死去。然而,这并不是说他们的生活很无聊;食人族形成了群体,在群体中他们会交配、战斗、杀戮、互相吞食(不一定是这个顺序)。如果你想象整个《权力的游戏》发生在一个工作室公寓里,你会有正确的想法。这个物种进化是因为耶格尔最初并不要求父母给他们的后代一些能量;这导致了婴儿所包含的能量超过了他们创造的成本(永动机爱好者,请注意。)本质上,懒惰的食人族已经学会利用模拟中的一个 bug 来产生免费能源。为了解决这个问题,耶格尔强迫父母必须把他们的一些精力给他们的后代,这阻止了孩子成为一种划算的零食。

Some say there’s more to life than being edgy, but… (Source: rawpixel)

耶格尔将第三种病态物种描述为“边缘赛跑者”。这些过客一生都在他们封闭世界的外围巡逻。尽管他们在整个模拟中反复盘旋,边缘赛跑者在他们自我限制在世界边缘的范围内,只靠总面积的一小部分生存。这种策略的一个优点是,经常会偶然发现一位远祖早已死去的尸体,这就成了一道简单的点心。到了交配的时候,边缘跑者可以停止奔跑,等待另一只跑过来。耶格尔认为,这可能是一种行为隔离的形式,允许边缘跑者避免将他们的基因与更大的群体混合。耶格尔用“致命的下降边缘”取代了世界各地的硬墙,从而阻止了这种策略。

生活,呃,会找到出路的

《多元世界:新环境下的生活》是一篇精彩的(但也是密集的)论文,如果你对这类作品感兴趣,我推荐你阅读。即使唯一的任务是“生存”,模拟仍然产生了几个行为与模拟精神背道而驰的生物,包括一个利用模拟的物理特性来增强自身适应性的生物。包括西姆斯在内的一些人认为,对于模拟和游戏这样的复杂环境,进化算法可能是一种有效的(尽管效率低下)调试工具,事实上,耶格尔(无意中)利用懒惰的食人族在他的模拟逻辑中找到了一个漏洞。如果你有兴趣看聚世界的运作,这里有一个他本人的视频。

通往地狱的路已经铺好了…

2013 年,魏斯特利·韦默做了一个关于使用进化算法自动解决代码错误的演讲。然而,韦默和他的合作者超越了西姆斯的建议,使用进化算法来检测漏洞,并用它们来修补漏洞,从而产生了一个叫做 GenProg 的工具。在他的演讲中,他讨论了 GenProg 的发展以及在此过程中吸取的一些经验教训。他概述了奖励黑客是这一过程中最大的障碍,并将 GenProg 描述为“一个爱发牢骚的孩子”,将其比作这部经典漫画中的 Calvin:

在高层次上,GenProg 接受一个错误源代码文件和一组测试作为输入。然后,该工具通过改变原始源代码来创建一系列“子代”。这些测试作为适应度函数应用于儿童,模拟以典型的进化方式重复进行。以下是将 GenProg 应用于不同问题时遇到的三个问题:

列表排序

对列表进行排序是一个基本的软件操作,这使得它成为 GenProg 的一个理想的概念验证问题。场景很简单: sort 程序有一个 bug,GenProg 负责为它开发一个补丁。作为一种适合度的度量,sort将被给定一个未排序的列表作为输入,输出将被测试以查看它是否被排序。如果输出确实是针对各种输入排序的,那么排序被认为是修补的。GenProg 的解决方案是:总是输出一个空列表(从技术上讲,它是经过排序的)。

"你只说我已经进了浴缸,你没说我要洗澡。"—魏默,关于他的创作

他能够通过添加更多的测试来解决这个问题,大概是通过比较实际输出和预期输出,而不仅仅是测试输出是否被排序。

漏洞修补

GenProg 的任务是识别并解决 nullhttpd 中的一个问题。具体来说,它的 POST 功能中有一个漏洞,使其容易受到远程攻击,目标是消除此漏洞。在程序运行完毕后,所有测试都通过了,据报道,nullhttpd 的 POST 功能中的漏洞已被修补。GenProg 的解决方案:删除 POST 功能。

病人:“医生,我这样动胳膊的时候会疼”

医生:“那就不要那样动你的胳膊”

该团队通过在测试集中添加另一个测试解决了这个问题;看起来他最初测试的是漏洞的存在,而不是安全的工作代码。

稳健测试

在这一点上,你可能会想“为什么他们一开始没有更健壮的测试?”反正我也是这么想的。事实证明,他做到了。在演示文稿的“经验教训:测试框架”部分,魏默简要描述了测试是如何运行的,尽管他没有明确说明,但它似乎是这样工作的:GenProg 产生解决方案(修复的程序,具有不同程度的修复),这些解决方案运行并产生文件 your-output.txt ,输出与 trusted-output.txt 进行比较,作为健康的衡量标准。听起来很合理,对吧?当 GenProg 面对这个测试框架时,它的解决方案是删除 your-output.txt ,然后继续输出 nothing。

“‘[……]你轻轻敲着我的房门,敲得那么轻,/我几乎不能肯定我听到了你的声音`我在这里敞开了门;/那里一片黑暗,仅此而已。”—埃德加·爱伦·坡,讲述他在 GenProg 的经历

韦默没有说他是怎么解决这个问题的,甚至没有说如果他解决了这个问题。

玩火

GenProg 是一个令人惊叹的小工具,获得了多个最佳论文奖。根据他们网站,

GenProg 修复了多种缺陷,包括无限循环、分段违规、堆缓冲区溢出、非溢出拒绝服务漏洞、堆栈缓冲区溢出、格式字符串漏洞、整数溢出——以及普遍存在的“我的程序产生不正确的输出”错误。

坦率地说,进化出可以修改计算机的可执行程序的想法让我感到恐惧,也让我感到兴奋。GenProg 使用一个测试框架作为适应度函数,看到它玩弄系统的所有小方法很有趣,但重要的是要记住,传统的、基于生存的自然选择适用于任何可以变异和繁殖的东西;这包括由 GenProg 创建的程序。如果 GenProg 制造出一个能够自我复制的程序,你可能会发现一个入侵物种生活在你的硬盘上。

One of these days I’ll take a week off work and do this with evolutionary algorithms (Source: xkcd)

结论

从所有这些例子中提炼出的是古德哈特定律:

当一个度量成为目标时,它就不再是一个好的度量。

这种行为模式不仅限于人工智能;人类无时无刻不在有意或无意地从事悬赏黑客活动。一些例子包括:

  1. 为考试而教,这是很多教育系统的通病。政治或行政官员实施标准化测试来衡量学生和教师的表现,以确定需要改进的地方。相反,在这些考试中的良好表现成了一个目标而不是衡量标准,这是以牺牲更广泛的学习为代价的。这降低了教育质量,使考试变得毫无价值,同时奖励了最擅长利用这个系统的老师和学生。
  2. 眼镜蛇效应,这是一种相关的现象,试图解决问题只会使问题变得更糟。据说在英国占领的印度,英国政府想减少毒蛇的数量。为此,他们为每一条提交的死亡眼镜蛇提供现金奖励,以激励眼镜蛇狩猎。如果你已经读到这里,你可能已经猜到人们开始饲养眼镜蛇是为了杀死它们并获得赏金。当英国政府听到风声后,他们终止了这个项目,养蛇者将这些动物放归野外,使得眼镜蛇问题比以前更加严重。
  3. 许多商业KPI,当一个组织积极地追求它们的时候就变得毫无用处。潜在客户网络流量是很好的关键绩效指标,但将它们变成目标最终会激励员工去寻找那些越来越不可能购买你的产品或以有意义的方式参与你的网站的用户。每笔销售的平均收入是一个有用的见解,但旨在增加该数字可能会通过阻止较小的销售来降低整体收入;事实上,根据适应度函数的平均每笔销售收入,一个月内卖出两辆豪华车的汽车经销商要比卖出四辆豪华车和一百辆中型轿车的邻居做得好得多。

我们如何解决这些问题?这里有三个指导原则:

  1. 衡量你在乎什么。如果你关心收入,衡量收入,而不是平均单位收入。如果你关心一个生物的移动能力,衡量它移动了多少,而不是它的速度。
  2. 明白你的衡量标准会被设定,并据此行动。这可以通过在你的衡量标准中加入资格来实现,例如在销售的情况下“增加平均单位收入而不减少总收入”,或者在模拟人生的行走虚拟生物的情况下“尽可能快地移动同时保持在一定高度之下”。
  3. 选择一个可行的目标,并将其与您的衡量标准分开。完全放弃目标是不可能的,但通常情况下,挑选几个可以积极追求的关键目标就足够了(“在销售对话中吸引 1000 名潜在客户”),同时保持冷静地关注你的指标(“周收入”);事后看来,度量是最有用的,而且只有当它们不以自己的方式出现时。

奖励-选择-变异循环最终是奖励者和被奖励者之间的军备竞赛。智能体将人工智能和日常生活中的适应功能视为环境中需要克服的另一个障碍。幸运的是,有了这些指导原则,你就可以防范这些奖励黑客行为;记住,即使是猴爪也有一个(几乎)幸福的结局。

来源

[1]卡尔·西姆斯,进化中的虚拟生物 (1994),第 21 届计算机图形学和交互技术年会论文集

[2]拉里·耶格尔,多元世界:新环境中的生活 (1995),苹果电脑公司。

[3] Claire Le Goues 等人, GenProg:自动软件修复的通用方法 (2011),IEEE 软件工程汇刊

用土星云回放历史

原文:https://towardsdatascience.com/rewind-history-with-saturn-cloud-1e6c3b14b1ca?source=collection_archive---------33-----------------------

难以置信的简单的 Jupyter 笔记本电脑自动版本控制

Photo by Pixaby via Pexels

如果你能用一个简单的滑块在你的 Jupyter 笔记本版本间来回移动,那不是很酷吗?

土星云让你做到了这一点!

Saturn Cloud 现在为您的 Jupyter 笔记本电脑提供自动化版本控制,以及一系列令人敬畏的新功能。它简单、免费,每个人都可以使用,而且完全不费力。看看吧!

Photo by Magda Ehlers from Pexels

什么是 Jupyter 笔记本?

我喜欢 Jupyter 笔记本!

[## 技巧、窍门、诀窍和魔法:如何毫不费力地优化您的 Jupyter 笔记本电脑

让 Jupyter 笔记本变得更好、更快、更强、更光滑、更棒的完整初学者指南

towardsdatascience.com](/how-to-effortlessly-optimize-jupyter-notebooks-e864162a06ee)

Jupyter 笔记本是最好的之一(免费!)工具,帮助您获得在大量数据相关领域高效工作所需的技能。它们是数据科学、机器学习、深度学习、人工智能等的理想工具。它们不仅可以保存代码,还可以保存丰富的文本元素,比如图像、图形、链接等等。这使得他们成为一个完美的地方,把分析,你的结果,以及正在发生的事情的描述。

尽管它们很容易使用,但要启动并运行云托管服务通常很困难。有很多人已经完全陷入了试图让他们的笔记本电脑运行云提供商的困境。

这就是土星云出现的地方!

土星云是什么?

土星云让生活变得简单。

[## 如何毫不费力地创建、发布甚至共享云托管的 Jupyter 笔记本

完全初学者指南,以闪电般的速度在 Jupyter 笔记本上创建、运行和协作…

towardsdatascience.com](/getting-started-with-saturn-cloud-jupyter-notebooks-b3f509a500ef)

有了土星云,运行云托管的 Jupyter 笔记本变得异常容易。你点击几个按钮,你就设置好了。您可以创建、运行、发布甚至共享 Jupyter 笔记本了。你甚至可以与其他人合作!对于数据科学家来说,在他们的 Jupyter 笔记本上使用基于云的计算可能是最简单的方法。这是我发现的唯一能让你立即(而且毫无痛苦地)做到的方法!)发布并与全世界分享您的笔记本。

什么是版本控制?

版本控制基本上就是修订控制。它允许您管理对代码的更改。每个修订都与时间戳和做出更改的人相关联。可以比较、恢复修订,还可以合并某些类型的文件。

你刚刚完全搞乱了你的模型吗?

Photo by Markus Distelrath from Pexels

版本控制让您可以倒回历史。你可以回到你的 Jupyter 笔记本变成一个完整的恐怖秀之前的地方。版本控制允许您将文档恢复到以前的版本。这对于允许编辑跟踪彼此的编辑和纠正错误至关重要!

例如,当多个个人或团队在设计和开发软件时,同一软件的多个版本在不同的站点运行是很正常的。不同的开发人员可能同时进行更新。其中一些版本可能有缺陷。一些版本的更新带来了新的问题。为了找到并修复这些问题,您必须能够获取并运行不同的版本来确定问题发生在哪里。

但是,尽管版本控制是工作流程的一个重要部分,Jupyter 笔记本并没有提供一个简单的方法来做到这一点。有变通办法,但并不容易。这就是土星云出现的地方。

这是魔法。

Saturn 图像附带 git 命令行工具和许多文本编辑器,因此您可以像使用任何其他 UNIX 安装一样使用 git。Saturn Cloud 还会自动为您的项目拍摄快照,以便用户可以轻松回滚到以前的工作。

如果你有代码要推或者拉,土星云会通知你。您可以从用户分支推入主分支,或者从主分支拉入您的分支。Saturn 提供了一个 Git diff and merge 工具,它结合了查看和合并代码和笔记本。用户在服务器中同步的独立分支中工作。每个 Saturn 项目都分配了一个 Git 存储库。

如果分支之间没有冲突,您可以单击“完成”按钮,完成您的推或拉。(如果有冲突,您可以解决这些冲突,然后单击“解决”)确保完成后点击“保存”。当然,您也可以直接在命令行中解决冲突。如果你想阅读全部内容,请查阅官方文档。

协作呢?

就是这么简单!

你只需进入你的仪表板,点击“合作者”并添加某人的用户名。如果你已经有了一个团队,你只需要选择你想合作的团队成员的名字!

演员表

账单页面已经升级!现在,您可以一目了然地看到每台机器,而不仅仅是看到成本概览。通常,如果你的账单很高,很容易假设你的新机器学习模型有问题。现在你一眼就能看出,这实际上是一台完全不同的机器,已经运行了三天了!

你所需要做的就是打开你的仪表盘,点击账单,然后向下滚动。你所有的信息都在这里。

我喜欢它

土星云继续变冷。现在,他们为 Jupyter 笔记本带来了简单的版本控制,使协作变得更加容易,他们很难被击败。再加上易于理解的计费、升级的图像控制以及他们对每个人的图库所做的改进,很难想象还有更好的云托管 Jupyter 笔记本提供商!

我还必须提到,Saturn Cloud 计划将他们的自动化版本控制功能开源。如果向 Git-verse 开放这个功能不是最酷的事情,我不知道什么才是。

我不知道你怎么样,但是我非常想看一看引擎盖下面!

Photo by Maria Geller from Pexels

感谢阅读!和往常一样,如果你用这些信息做了什么酷的事情,请在下面的评论中让大家知道,或者在 LinkedIn @annebonnerdata 上联系

使用四分位数和 Jenks 自然间断的 RFM 分割

原文:https://towardsdatascience.com/rfm-segmentation-using-quartiles-and-jenks-natural-breaks-924f4d8baee1?source=collection_archive---------8-----------------------

Photo by Heidi Sandstrom. on Unsplash

[## 吉安费尔顿/RFM-带四分位数的分段-詹克斯-自然分段-HDBSCAN

通过创建一个……为吉安费尔顿/RFM-四分点分割-詹克斯-自然断裂-和组屋开发做出贡献

github.com](https://github.com/gianfelton/RFM-Segmentation-with-Quartiles-Jenks-Natural-Breaks-and-HDBSCAN/blob/master/RFM Segmentation.ipynb)

这篇文章的笔记本可以在上面的链接中找到。

这篇文章的目的是分享我最近使用 RFM 模型进行客户细分的一些经验。对于那些刚接触 RFM 模型的人,这里有一个分类:

在实践中,它将生成如下所示的表格:

最终,我们将得到这些数字的百分位数(我们将在下面讨论),然后是四分位数。四分位数将给出从 1 到 4 的分数,我们将组合这些分数得到 RFM 分数。该过程将如下所示:

让我们从笔记本开始吧。

**import** **numpy** **as** **np**
**import** **pandas** **as** **pd**
**import** **matplotlib.pyplot** **as** **plt**
%matplotlib inline
**import** **datetime** **as** **dt**
**from** **scipy** **import** stats
**import** **jenkspy**
**import** **seaborn** **as** **sns**
**import** **warnings**
warnings.filterwarnings("ignore")df = pd.read_csv(‘Superstore.csv’)

快速浏览前三行可以了解数据的概念:

我们可以将订单日期、订单 ID 和销售额用于 RFM。

df['Order Date'] = pd.to_datetime(df['Order Date'])anchorDate = dt.datetime(2015,1,1)rfm = df.groupby('Customer ID').agg({'Order Date': lambda x: (anchorDate - x.max()).days,
                                     'Order ID': lambda x: len(x),
                                     'Sales': lambda x: x.sum()})

在第一行中,我们将订单日期设置为日期时间格式。第二行仅在该数据集中是必要的,因为它在 2014 年 12 月 31 日结束。在现实世界的设置中,这只是设置为当前日期。第三部分按客户 ID 汇总了最近、频率和货币。

我们最终得到了这样一张表:

现在我们只需要更改列名。

rfm.columns = ['Recency', 'Frequency', 'Monetary']

从这里,我们可以很容易地得到百分位数和四分位数。

rfm['r_percentile'] = rfm['Recency'].rank(pct=True,ascending=False)
rfm['r_score'] = pd.qcut(rfm['r_percentile'], 4, labels=range(4,0,-1))rfm['f_percentile'] = rfm['Frequency'].rank(pct=True,ascending=True)
rfm['f_score'] = pd.qcut(rfm['f_percentile'], 4, labels=range(4,0,-1))rfm['m_percentile'] = rfm['Monetary'].rank(pct=True,ascending=True)
rfm['m_score'] = pd.qcut(rfm['m_percentile'], 4, labels=range(4,0,-1))

结果表有我们的最近、频率和货币列,以及每个值的百分位数和四分位数。

最后,我们只需要连接三个分数列。

rfm['rfm_score'] = rfm['r_score'].astype(str) + rfm['f_score'].astype(str) + rfm['m_score'].astype(str)

这是我们完成的桌子。

我们可以就此打住,但是让我们做一些探索和比较。

ax = rfm['rfm_score'].value_counts().plot(kind='bar', figsize=(15, 5), fontsize=12)
ax.set_xlabel("RFM Score", fontsize=12)
ax.set_ylabel("Count", fontsize=12)
plt.show()

我们可以看到,我们最大的细分市场是由最没有价值的客户组成的。然而,我们下一个最大的细分市场是由我们最有价值的客户组成的。这似乎很奇怪。让我们看看我们的数据是根据哪些值进行分区的。

r_quarters = rfm['Recency'].quantile(q=[0.0, 0.25,0.5,0.75, 1]).to_list()
f_quarters = rfm['Frequency'].quantile(q=[0.0, 0.25,0.5,0.75, 1]).to_list()
m_quarters = rfm['Monetary'].quantile(q=[0.0, 0.25,0.5,0.75, 1]).to_list()
quartile_spread = pd.DataFrame(list(zip(r_quarters, f_quarters, m_quarters)), 
                      columns=['Q_Recency','Q_Frequency', 'Q_Monetary'],
                     index = ['min', 'first_part','second_part','third_part', 'max'])
quartile_spread

尽管这让我们了解了分区之间的范围,但我们还需要其他东西来查看密度。让我们看一个直方图,我们的分区沿着 x 轴放置。

plt.figure(figsize = (16,6))
hist = plt.hist(rfm['Frequency'], bins=100, align='left', color='cornflowerblue')
for q in f_quarters:
    plt.vlines(q, ymin=0, ymax = max(hist[0]))

有了这个视图,我们可以看到分区并不十分适合我们的数据。15 处的分区将看起来像一个组的东西一分为二。让我们试着用 Jenks 的自然间断来划分我们的数据,而不是四分位数。

plt.figure(figsize = (16,6))
hist = plt.hist(rfm['Frequency'], bins=100, align='left', color='cornflowerblue')
for b in f_breaks:
    plt.vlines(b, ymin=0, ymax = max(hist[0]))

这使得这个数据更有意义。让我们用 Jenks 来看一个分区表。

r_breaks = jenkspy.jenks_breaks(rfm['Recency'], nb_class=4)
f_breaks = jenkspy.jenks_breaks(rfm['Frequency'], nb_class=4)
m_breaks = jenkspy.jenks_breaks(rfm['Monetary'], nb_class=4)
jenks_spread = pd.DataFrame(list(zip(r_breaks, f_breaks, m_breaks)), 
                      columns=['J_Recency','J_Frequency', 'J_Monetary'],
                     index = ['min', 'first_part','second_part','third_part', 'max'])
jenks_spread

在这一点上,这是否更好取决于业务。让我们并排比较两个分区表。

df = pd.concat([quartile_spread, jenks_spread], axis=1)
cols = ['Q_Recency', 'J_Recency','Q_Frequency', 'J_Frequency','Q_Monetary', 'J_Monetary']
df[cols]

这个表应该有助于决定使用四分位数还是 Jenks。不过,还有一件事。我们用 Jenks(用 nb_class=4 参数)指定了分区的数量,但是我们是如何得到这个数字的呢?我绘制了方差拟合优度与班级数量的关系图。它看起来有点像 K-Means 的肘方法。

基本上,我在寻找类的数量和方差拟合优度之间的平衡。

实现这一点的代码有点长。以下是计算方差拟合优度的函数:

# Crediting camdenl with this function
# [https://stats.stackexchange.com/users/27263/camdenl?tab=profile](https://stats.stackexchange.com/users/27263/camdenl?tab=profile)def goodness_of_variance_fit(array, classes):
    # get the break points
    classes = jenkspy.jenks_breaks(array, nb_class=classes)# do the actual classification
    classified = np.array([classify(i, classes) for i in array])# max value of zones
    maxz = max(classified)# nested list of zone indices
    zone_indices = [[idx for idx, val in enumerate(classified) if zone + 1 == val] for zone in range(maxz)]# sum of squared deviations from array mean
    sdam = np.sum((array - array.mean()) ** 2)# sorted polygon stats
    array_sort = [np.array([array[index] for index in zone]) for zone in zone_indices]# sum of squared deviations of class means
    sdcm = sum([np.sum((classified - classified.mean()) ** 2) for classified in array_sort])# goodness of variance fit
    gvf = (sdam - sdcm) / sdamreturn gvfdef classify(value, breaks):
    for i in range(1, len(breaks)):
        if value < breaks[i]:
            return i
    return len(breaks) - 1

下面是绘制方差拟合优度与类数量关系的代码:

my_dict = {}
for col in rfm.columns[:3]:
    results = []
    for i in range(2, 10):
        results.append(goodness_of_variance_fit(rfm[col], i))
    my_dict[col] = results  
plt.plot(range(2, 10), my_dict['Recency'], label='Recency')
plt.plot(range(2, 10), my_dict['Frequency'], label='Frequency')
plt.plot(range(2, 10), my_dict['Monetary'], label='Monetary')
plt.xlabel('Number of classes')
plt.ylabel('Goodness of Variance Fit')
plt.legend(loc='best')
plt.show()

既然我们已经使用四分位数和 Jenks 自然间断点进行了调查,让我们添加基于 Jenks 自然间断点的 rfm 分数,并查看两个分数如何比较。

breaks_list = [r_breaks, f_breaks, m_breaks]rfm['r_j_score'] = pd.cut(rfm['Recency'], bins=r_breaks, labels=[1, 2, 3, 4], include_lowest=True)
rfm['f_j_score'] = pd.cut(rfm['Frequency'], bins=f_breaks, labels=[4, 3, 2, 1], include_lowest=True)
rfm['m_j_score'] = pd.cut(rfm['Monetary'], bins=m_breaks, labels=[4, 3, 2, 1], include_lowest=True)rfm.drop(['r_percentile', 'f_percentile', 'm_percentile'], axis=1, inplace=True)rfm['rfm_j_score'] = rfm['r_j_score'].astype(str) + rfm['f_j_score'].astype(str) + rfm['m_j_score'].astype(str)

df = rfm['rfm_j_score'].value_counts().to_frame().join(rfm['rfm_score'].value_counts())
ax = df.plot(kind='bar', title ="Jenks vs Quartiles", figsize=(15, 5), legend=True, fontsize=12)
ax.set_xlabel("RFM Score", fontsize=12)
ax.set_ylabel("Count", fontsize=12)
plt.show()

我们可以看到结果非常不同。使用 Jenks 自然中断,最近但不频繁的购买者(总消费金额低)构成了最大的细分市场。

RFM 到此为止。基于我们到目前为止所看到的,一个人应该知道这些细分方法中的哪一种(如果有的话)更适合他们的情况。

以下部分独立于 RFM 分段。在完成自己的细分工作后,我花了相当多的时间在我的客户中寻找聚类。这是相关的,因为我使用了最近,频率和货币价值的聚类。

虽然我尝试了一些聚类方法,但下面是 HDBSCAN 的一个示例(在同一数据集上):

import hdbscanclusterer = hdbscan.HDBSCAN(min_cluster_size=30,min_samples=12, metric='euclidean')clusterer.fit(rfm[['Recency', 'Frequency', 'Monetary']])rfm['Cluster'] = pd.Series(clusterer.labels_, index=rfm.index)rfm.head(3)

我选择 HDBSCAN 的原因是因为它能够在不引入噪声的情况下进行聚类。第一类是噪音。

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.colors as mcolorsfig = plt.figure(figsize=(18,12))
dx = fig.add_subplot(111, projection='3d')
colors = ['green', 'blue', 'red', 'yellow', 'black']
#colors = [ k for k in mcolors.CSS4_COLORS ]for i in range(-1,len(rfm['Cluster'].unique())-1):
    dx.scatter(rfm[rfm.Cluster == i].Recency, 
               rfm[rfm.Cluster == i].Frequency, 
               rfm[rfm.Cluster == i].Monetary, 
               c = colors[i], 
               label = 'Cluster ' + str(i), 
               s=10, alpha=1.0)dx.set_xlabel('Recency', fontsize=14)
dx.set_ylabel('Frequency', fontsize=14)
dx.set_zlabel('Monetary', fontsize=14)
dx.legend(fontsize=12)

我注意到的第一件事是绿色和红色集群的小尺寸。让我们看看集群之间的计数。

pd.Series(clusterer.labels_).value_counts()

让我们再看远一点的集群。簇 1 被排除,因为它是噪声。

myDict = {}
for i in range(0, len(rfm['Cluster'].unique())-1):
    clust = rfm[rfm['Cluster'] == i]
    myDict['Cluster ' + str(i)] = [int(round(clust['Recency'].mean(),0)),
                            int(round(clust['Frequency'].mean(),0)),
                            int(round(clust['Monetary'].mean(),0)),
                            int(round(clust['Recency'].median(),0)),
                            int(round(clust['Frequency'].median(),0)),
                            int(round(clust['Monetary'].median(),0))]

df = pd.DataFrame.from_dict(myDict, orient='index',
                            columns=['mean_Recency','mean_Frequency', 'mean_Monetary',
                                    'median_Recency','median_Frequency', 'median_Monetary'])
df

接下来,让我们来看看这些集群是如何按照 RFM 分数排列的:

myDict = {}
for i in range(-1, len(rfm['Cluster'].unique())-1):
    clust = rfm[rfm['Cluster'] == i]
    myDict["Cluster " + str(i)] = clust['rfm_j_score'].value_counts()
df = pd.DataFrame.from_dict(myDict)colors = ['black', 'green', 'blue', 'red', 'yellow']
ax = df.plot(kind='bar', figsize=(15, 5), legend=True, fontsize=12, color=colors)
ax.set_xlabel("RFM Score", fontsize=12)
ax.set_ylabel("Count", fontsize=12)
plt.show()

我们的集群有非常相似的 RFM 分数,这在用 RFM 模型术语描述我们集群的构成时是令人鼓舞的。帖子的聚类部分到此为止。谢谢大家!

基于 K 均值聚类的 RFMT 分割

原文:https://towardsdatascience.com/rfmt-segmentation-using-k-means-clustering-76bc5040ead5?source=collection_archive---------11-----------------------

重要提示:这是我个人学习 python 数据科学过程的一部分。当我把它写下来的时候,我发现它非常有帮助,可以帮助我学得更好更快。这是 DataCamp 课程的一部分,代码基于我使用的课程和其他在线资源。请访问 DataCamp 获取原始教学大纲。我不属于任何形式的 DataCamp,只是作为一名学习者使用他们的资源。

在我们客户细分旅程的最后一部分,我们将应用 K-Means 聚类方法来细分我们的客户数据。我们将继续使用我们在 RFM 车型中设计的功能。此外,我们将把任期作为我们模型的一个新特性,以创建 RFMT 模型。

什么是 K-Means?

K-Means 是一种流行且简单的无监督机器学习算法。简单地说,K-means 算法识别 k 个质心,然后将每个数据点分配到最近的簇,同时保持质心尽可能小。我们不会深入研究 K-Means 如何工作的细节,所以让我们深入研究客户细分的实现。

k-均值假设

这是我们将要用来实现 K-Means 模型的 4 个特征。在我们将 K-Means 模型拟合到我们的数据之前,我们需要确保这些关键假设得到满足。

  1. 变量的分布
  2. 平均值相同的变量
  3. 方差相同的变量

查看我们的 RFMT 汇总统计数据,我们可以看到我们的数据集目前不满足这些关键假设。让我们创建一个数据预处理管道,为 K-Means 准备好数据。

数据预处理流水线

下面是我们执行数据转换需要采取的步骤,并详细介绍了每个步骤:

  1. 取消对数据的分类—我们将使用日志转换来完成这项工作
  2. 标准化到相同的平均值
  3. 缩放到相同的标准偏差
  4. 存储为单独的数组,用于聚类分析

数据偏斜度

让我们检查一下当前数据集的分布形状。

# Plot RFM distributions
plt.figure(figsize=(16,14))# Plot distribution of R
plt.subplot(4, 1, 1); sns.distplot(data_process['Recency'])# Plot distribution of F
plt.subplot(4, 1, 2); sns.distplot(data_process['Frequency'])# Plot distribution of M
plt.subplot(4, 1, 3); sns.distplot(data_process['MonetaryValue'])# Plot distribution of T
plt.subplot(4, 1, 4); sns.distplot(data_process['Tenure'])# Show the plot
plt.show()

There is skewness in our RFMT data

如你所见,这是 R、F 和 M 向右的一般偏斜度。t 具有更均匀分布的形状。为了解决这个问题,我们将对数据进行对数转换。

# Apply Log Transformation
data_process['MonetaryValue'] = data_process['MonetaryValue'] + 0.0000000001
recency_log = np.log(data_process['Recency'])
frequency_log = np.log(data_process['Frequency'])
monetary_log = np.log(data_process['MonetaryValue'])
tenure_log = np.log(data_process['Tenure'])# Plot RFM distributions
plt.figure(figsize=(16,14))# Plot distribution of R
plt.subplot(4, 1, 1); sns.distplot(recency_log)# Plot distribution of F
plt.subplot(4, 1, 2); sns.distplot(frequency_log)# Plot distribution of M
plt.subplot(4, 1, 3); sns.distplot(monetary_log)# Plot distribution of M
plt.subplot(4, 1, 4); sns.distplot(tenure_log)# Show the plot
plt.show()

After applying log transformation, we see a much more normally distributed data set

太好了!看起来我们已经正常化了我们的 RFM 特征。但是,请注意,通过 log 变换 T,我们已经使数据向左倾斜。我们在通过可视化检查或其他方式转换数据时必须始终小心谨慎,以确保我们创建了最准确的客户群表示。

标准化平均值和标准偏差

为了标准平均值和标准偏差,我们可以使用下面的公式:

datamart_centered = datamart_rfm - datamart_rfm.mean()
datamart_scaled = datamart_rfm / datamart_rfm.std()

然而,让我们利用 SKLearn 库的 StandardScaler 来集中和缩放我们的数据。

from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
scaler.fit(data_process_log)
data_process_norm = scaler.transform(data_process_log)data_process_norm_df = pd.DataFrame(data_process_norm)
data_process_norm_df.describe().round(2)

Our feature set post-scaling has a mean of 0 and standard deviation of 1

厉害!现在,我们已经实现了关键假设,以便我们能够正确、准确地应用 K-Means 聚类对我们的客户进行细分。

应用 K-均值

现在让我们进入任何机器学习项目中最激动人心的部分——应用 ML 模型!

但是在此之前,我们需要为我们的 K-Means 模型选择聚类数。这可以通过几种方式实现:

  1. 可视化方法——肘部标准
  2. 数学方法——轮廓系数
  3. 最具商业意义的实验和诠释

我们将使用肘准则法。

相对于组内误差平方和(SSE)绘制组数

误差平方和(SSE)是每个数据点到其聚类中心的距离平方和。我们希望选择最佳的聚类数量,在不过度拟合的情况下减少 SSE 的数量。让我们画出肘图来确定这一点。

# Fit KMeans and calculate SSE for each *k*
sse = {}
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, random_state=1)
    kmeans.fit(data_process_norm)
    sse[k] = kmeans.inertia_# Plot SSE for each *k*
plt.title('The Elbow Method')
plt.xlabel('k'); plt.ylabel('SSE')
sns.pointplot(x=list(sse.keys()), y=list(sse.values()))
plt.show()

SSE plot against number of clusters

理想情况下,我们希望在肘形图上选择一个点,在该点上,SSE 停止以递增的速率下降,即,在该点上,多个聚类之间的变化梯度变得恒定。对于我们的模型,我们将选择 k=4。

将我们的数据集拟合到 K 均值

# Import KMeans from skLearn
from sklearn.cluster import KMeans# Choose k=4 and fit data set to k-means model
kmeans = KMeans(n_clusters=4, random_state=1)
kmeans.fit(data_process_norm)# Assign k-means labels to cluster labels
cluster_labels = kmeans.labels_# Assign cluster labels to original pre-transformed data set
data_process_k4 = data_process.assign(Cluster = cluster_labels)# Group data set by k-means cluster
data_process_k4.groupby(['Cluster']).agg({
    'Recency': 'mean',
    'Frequency': 'mean',
    'MonetaryValue': 'mean',
    'Tenure': ['mean', 'count']
}).round(0)

Our RFMT data set grouped by their K-Means clusters

我们可以看到,我们对 R、F、M 和 T 均值的分组总结表明,每个客户群对我们的 4 个特征有不同的侧重:

  • 聚类 0 具有最高的月均值、最低的最近均值和最高的频率均值——这是我们理想的客户群
  • 集群 1 在 R、F 和 M 领域表现不佳,在我们的数据库中也存在很长时间——我们需要设计活动来再次激活它们
  • Cluster 2 最近在我们这里购物,但没有像我们希望的那样花费那么多或那么频繁——也许一些针对他们的个性化产品可以帮助他们实现终身价值最大化?
  • Cluster 3 在我们这里花了相当多的钱,但是已经有 3-4 个月没有和我们一起购物了——我们需要在失去他们之前做点什么!

RFMT 在 K 均值聚类中的相对重要性

我们可以通过热图来直观显示 4 个集群中每个功能的相对重要性。

# Calculate average RFM values for each cluster
cluster_avg = data_process_k4.groupby(['Cluster']).mean()# Calculate average RFM values for the total customer population
population_avg = data_process.mean()# Calculate relative importance of cluster's attribute value compared to population
relative_imp = cluster_avg / population_avg - 1# Initialize a plot with a figure size of 8 by 2 inches 
plt.figure(figsize=(8, 4))# Add the plot title
plt.title('Relative importance of attributes')# Plot the heatmap
sns.heatmap(data=relative_imp, annot=True, fmt='.2f', cmap='RdYlGn')
plt.show()

Relative Importance of RFMT for each of our 3 clusters

热图提供了一种简单易行的方法来理解我们的 K-Means 模型如何将我们的 RFMT 属性的相对重要性分配到每个客户各自的细分市场。

可视化我们的 K 均值聚类

最后,让我们在散点图中可视化我们的 K-Means 聚类,以结束我们的客户细分之旅。

# Plot RFM distributions
plt.figure(figsize=(20,20))
plt.subplot(3, 1, 1);
plt.scatter(data_process_k4[cluster_labels == 0].loc[:,'Recency'], data_process_k4[cluster_labels == 0].loc[:,'MonetaryValue'], s= 10, cmap='rainbow', label = 'Cluster 1', alpha=0.2)
plt.scatter(data_process_k4[cluster_labels == 1].loc[:,'Recency'], data_process_k4[cluster_labels == 1].loc[:,'MonetaryValue'], s= 10, cmap='rainbow', label = 'Cluster 2', alpha=0.2)
plt.scatter(data_process_k4[cluster_labels == 2].loc[:,'Recency'], data_process_k4[cluster_labels == 2].loc[:,'MonetaryValue'], s= 10, cmap='rainbow', label = 'Cluster 3', alpha=0.3)
plt.scatter(data_process_k4[cluster_labels == 3].loc[:,'Recency'], data_process_k4[cluster_labels == 3].loc[:,'MonetaryValue'], s= 10, cmap='rainbow', label = 'Cluster 4', alpha=0.3)
plt.xticks(np.arange(0, 1000, 100)) 
plt.yticks(np.arange(0, 10000, 1000))
axes = plt.gca()
axes.set_xlim(0, 500)
axes.set_ylim(0, 10000)
plt.title('Cusomter Clusters')
plt.xlabel('Recency')
plt.ylabel('Monetary Value')
plt.legend()plt.subplot(3, 1, 2);
plt.scatter(data_process_k4[cluster_labels == 0].loc[:,'Frequency'], data_process_k4[cluster_labels == 0].loc[:,'MonetaryValue'], s= 10, cmap='rainbow', label = 'Cluster 1', alpha=0.2)
plt.scatter(data_process_k4[cluster_labels == 1].loc[:,'Frequency'], data_process_k4[cluster_labels == 1].loc[:,'MonetaryValue'], s= 10, cmap='rainbow', label = 'Cluster 2', alpha=0.2)
plt.scatter(data_process_k4[cluster_labels == 2].loc[:,'Frequency'], data_process_k4[cluster_labels == 2].loc[:,'MonetaryValue'], s= 10, cmap='rainbow', label = 'Cluster 3', alpha=0.3)
plt.scatter(data_process_k4[cluster_labels == 3].loc[:,'Frequency'], data_process_k4[cluster_labels == 3].loc[:,'MonetaryValue'], s= 10, cmap='rainbow', label = 'Cluster 4', alpha=0.3)
plt.xticks(np.arange(0, 1000, 100)) 
plt.yticks(np.arange(0, 10000, 1000))
axes = plt.gca()
axes.set_xlim(0, 500)
axes.set_ylim(0, 10000)
plt.title('Cusomter Clusters')
plt.xlabel('Frequency')
plt.ylabel('Monetary Value')
plt.legend()plt.subplot(3, 1, 3);
plt.scatter(data_process_k4[cluster_labels == 0].loc[:,'Tenure'], data_process_k4[cluster_labels == 0].loc[:,'MonetaryValue'], s= 10, cmap='rainbow', label = 'Cluster 1', alpha=0.2)
plt.scatter(data_process_k4[cluster_labels == 1].loc[:,'Tenure'], data_process_k4[cluster_labels == 1].loc[:,'MonetaryValue'], s= 10, cmap='rainbow', label = 'Cluster 2', alpha=0.2)
plt.scatter(data_process_k4[cluster_labels == 2].loc[:,'Tenure'], data_process_k4[cluster_labels == 2].loc[:,'MonetaryValue'], s= 10, cmap='rainbow', label = 'Cluster 3', alpha=0.3)
plt.scatter(data_process_k4[cluster_labels == 3].loc[:,'Tenure'], data_process_k4[cluster_labels == 3].loc[:,'MonetaryValue'], s= 10, cmap='rainbow', label = 'Cluster 4', alpha=0.3)
plt.xticks(np.arange(0, 1000, 100)) 
plt.yticks(np.arange(0, 10000, 1000))
axes = plt.gca()
axes.set_xlim(0, 500)
axes.set_ylim(0, 10000)
plt.title('Cusomter Clusters')
plt.xlabel('Tenure')
plt.ylabel('Monetary Value')
plt.legend()plt.show()

感谢您花时间通过这个由 3 部分组成的系列来探索客户细分。如果你喜欢这些内容,请继续关注,我将探索更多的数据,也许还会用 Python 构建其他有趣的项目。

RGB 到第八球面坐标的颜色转换

原文:https://towardsdatascience.com/rgb-to-8th-spherical-coordinates-color-conversion-7d71a951d9ce?source=collection_archive---------11-----------------------

颜色转换是图像处理、计算机视觉和机器学习中的一个重要过程。例如,如果你有机器学习背景,你可以假设颜色是用于机器学习模型的数据集中的特征。

要了解彩色图像的 RGB 颜色和数字表示:

维基百科- RGB 颜色模型

Photo by Amanda Dalbjörn on Unsplash

不同的颜色表示会产生影响吗?

是的,他们可以。正确的色域可以为我们进行颜色分割和颜色检测创造完美的特征。

有哪些颜色转换方法?

要学习现有的颜色转换方法,我建议你 OpenCV 资源。

一种新的已知领域颜色转换方法;

你了解球坐标系吗?球坐标系是用径向距离、极角和方位角三个参数来表示元素的坐标系。

来源:维基百科-球面坐标系

Spherical Coordinate System

我将 RGB(红、绿、蓝)颜色转换为球坐标系的参数,这样我就可以在球坐标系中表示颜色。

我为什么选择这种方法?

  1. 我们在球坐标系中表示的颜色可以转换回 RGB 值,这意味着我们不会丢失信息。
  2. 在我们将 RGB 值转换到球坐标系后,坐标系的参数代表了新的有价值的信息。极角和方位角代表颜色的类型,径向距离代表照度。像这样区分颜色的特征有助于我们找到特定的颜色,即使这些颜色受到阴影的影响。

因此,让我们编写一些 Python 脚本来展示我们如何做到这一点:

步骤:

  1. 导入必要的库。
  2. 计算极角:θ = arctan(Bv/Rv)
  3. 计算方位角:𝜑 =反正切(√(Rv +Bv )/Gv)
  4. 计算径向距离:r = √(Rv +Bv +Gv2)

,其中 Rv、Gv 和 Bv 代表红色、绿色和蓝色值。

from PIL import Image
import numpy as npimage = np.array(Image.open('yourImage'))image[:,:,0]Rv = image[:,:,0]
Gv = image[:,:,1]
Bv = image[:,:,2]polarAngle = np.arctan2(Bv,Rv)
azimuthAngle = np.arctan2(np.sqrt(np.square(Rv)+np.square(Bv)),Gv)
radialDistance = np.sqrt(np.square(Rv)+np.square(Bv)+np.square(Gv))

使用此转换的示例:

我用这种颜色转换的方法检测肤色。您可以在下面找到输入和输出图像:

Input image

Output Image

富模型,穷模型

原文:https://towardsdatascience.com/rich-model-poor-model-80b9de39172c?source=collection_archive---------32-----------------------

模型的财务成功需要良好的数据基础

你们中的许多人可能读过罗伯特·基尤斯基和莎伦·莱赫特写的《富爸爸,穷爸爸 》一书。它倡导金融知识和通过投资资产积累财富的重要性。

我们可以将同样的概念应用于数据科学,并提出这样的问题,“什么是丰富的数据科学模型,什么是贫乏的数据科学模型?”我的回答是,富模型是为您的公司赚钱的模型,而差模型是不为您的公司赚钱的模型

那么,我们如何创建一个为您的公司赚很多钱的富数据科学模型呢?答案之一是投资资产……就模型而言,这意味着数据。

在本文中,我将概述一个 良好的数据基础和集成数据 如何在使数据科学具有相关性和丰富您的算法方面发挥重要作用。

集成数据=更好的预测准确性=每年潜在的百万美元

有人说预测准确性是数据科学的圣杯。拥有更好的预测准确性意味着你可以解决很多问题。在许多应用中,如预测机器故障、检测欺诈和客户流失预测,您需要准确预测。

让我们以电信行业的客户流失预测为例。电信行业的年流失率从 10%到 67%不等,大多数公司的流失率超过 20%。流失率低的公司能够有效地利用数据预测客户流失,并采取措施避免流失。预测搅拌棒需要使用集成数据开发数据科学模型。

然而,这听起来可能是显而易见的,但是为了主动预测和解决客户流失,您的预测模型需要准确。一般来说,防止流失需要联系潜在的流失者,或者给潜在的流失者一些优惠或折扣,以防止他们离开。如果你对客户流失预测不准确,你可能会给那些不会离开竞争对手的客户提供优惠和折扣,从而导致不必要的成本。更糟糕的是,你不会向真正的潜在客户提供任何东西,从而失去这些客户,降低你的整体业务。

那么我们如何提高预测精度呢?有许多数学方法,但最重要的是有一个良好的综合数据基础。在大多数情况下,以下数据有助于预测客户流失:

  • 客户人口统计数据,如性别、年龄、婚姻或伴侣关系状况、受抚养人、位置等。
  • 账单和合同数据,如月费、总费用、无纸化账单、合同期限等。
  • 服务使用数据,如电话服务、互联网服务、在线安全等。
  • 网站使用、移动应用使用、数字时事通讯互动等数字互动数据。
  • 多渠道客户旅程数据,如导航路径、商店访问和呼叫中心互动。

让我们看看基于预测模型中使用的数据的典型流失预测准确性:

*Prediction accuracy figures are based on a typical churn model generally observed

如此处所示,通过使用集成的数据基础,预测精度可以提高近 20%。这可以转化成数百万美元。telecomstechnews 最近的一项研究表明,每个主要电信运营商每月的流失成本约为 6500 万美元。这意味着预测模型中 20%的改进可以转化为每年约 1.6 亿美元的成本节约。

这是巨大的。它展示了拥有集成数据基础的价值,以及数据科学模型为企业带来巨大成本节约的潜力。

如此处所示,通过使用集成的数据基础,预测精度可以提高近 20%。这可以转化成数百万美元。telecomstechnews 最近的一项研究表明,每个主要电信运营商每月的流失成本约为 6500 万美元。这意味着预测模型中 20%的改进可以转化为每年约 1.6 亿美元的成本节约。

这是巨大的。它展示了拥有集成数据基础的价值,以及数据科学模型为企业带来巨大成本节约的潜力。

集成数据=可操作的数据科学=百万美元/年实际现金流

有一个好的预测模型是一个好的开始,但绝不是结束。高预测准确率需要转化为可以避免流失的行动。那么,数据科学模型如何转化为行动呢?最常见的方法之一是查看模型的特性重要性。功能重要性是数据科学模型判断的导致客户流失的最重要因素。

此处显示了电信客户流失特征重要性的典型示例。

显示负系数的特征是使顾客留下的因素。例如,任期越高,客户就越不会流失。这意味着客户流失主要发生在新客户身上。另一方面,显示正系数的特征是促成流失的因素。如可视化图所示,拥有短期月度合同的客户以及总费用较高的客户可能会流失。

这清楚地表明,流失主要与新客户和短期合同客户有关。这为要采取的行动提供了明确的方向,这些行动应该围绕如何将新客户转化为忠诚客户。一般来说,一旦客户签了合同,电信公司就会忘记她或他。然而,保持持续联系的营销策略,特别是针对新客户的营销策略,将是非常有益的。

之所以能够采取这样切实的行动,是因为有各种各样的数据来理解预测模型。如果在预测模型中不考虑不同类型的数据,不仅预测精度会很低,而且得出的行动也可能是错误的。这可能会使情况恶化,而不是改善。

有形和具体的行动肯定会防止流失,从而确保现金流保持完整。预测结果显示,电信公司每年有 1.6 亿美元的成本节约潜力。通过切实的行动,利用综合数据,这种潜力可以转化为现实。

集成数据=更好的客户定位=参与的客户

防止流失不应该是被动的。你不能追逐每一个预计会流失的客户。你需要制定一个积极主动的策略,让客户甚至不会考虑离开。这种积极主动的策略包括定期与客户互动或沟通,并为他们提供一些好处。这些好处可以是产品优惠,甚至是关于产品使用的教育。

在上面的例子中,我们看到短期合同客户的流失率很高。因此,与新获得的客户进行主动沟通的策略非常重要。但是,在互动过程中,您不能向所有客户发送一般信息。有效的沟通是为客户量身定制的。创建定制通信的一种方法是对相似的客户进行细分,然后发送针对该细分市场的通信。

因此,问题变成了我们如何找到相似的客户放入一个细分市场?答案是基于一个综合的数据基础。你拥有的数据越多,同一细分市场中的相似客户就越多。在我们的示例中,如果您基于客户人口统计+账单和合同数据+服务使用+数字互动+多渠道客户旅程数据创建细分市场,那么每个细分市场中的客户实际上会共享许多相同的属性。然而,如果你只采用人口统计数据来创建你的细分市场,那么一个细分市场中的客户就不会真正相似,从而导致一个质量差的细分市场。如果你与某个细分市场的客户互动,认为他们是相似的,而实际上他们不是,那么你可能会加速流失,而不是减少流失。

下面是客户细分的可视化,每个点代表一个客户。真正相似的顾客被标上相同的颜色。在左侧,您有仅使用人口统计数据创建的细分市场。如您所见,没有明确的细分市场,因为相似的客户没有一起出现。在右侧,您有使用客户人口统计+账单和合同数据+服务使用+数字互动+多渠道客户旅程数据创建的细分市场。正如你所看到的,有一个清晰的模式出现,真正相似的客户确实形成了一个细分市场。

集成的数据基础将确保更好的沟通策略,这将使您积极主动地预防客户流失,并确保未来的现金流

因此,无论你的模型有多复杂,它的财务成功只能通过使用良好的、集成的数据基础来实现

额外资源

网站(全球资讯网的主机站)

你可以访问我的网站进行零编码分析。https://experiencedatascience.com

订阅每当我发布一个新的故事时,请及时通知我。

[## 每当 Pranay Dave 发表文章时,您都会收到电子邮件。

每当 Pranay Dave 发表文章时,您都会收到电子邮件。通过注册,您将创建一个中型帐户,如果您还没有…

pranay-dave9.medium.com](https://pranay-dave9.medium.com/subscribe)

你也可以通过我的推荐链接加入 Medium。

[## 通过我的推荐链接加入 Medium—Pranay Dave

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

pranay-dave9.medium.com](https://pranay-dave9.medium.com/membership)

https://www.youtube.com/c/DataScienceDemonstrated 的 YouTube 频道
这里是我的 Youtube 频道
的链接

骑行共享我的路——优步

原文:https://towardsdatascience.com/ridesharing-my-way-uber-7ce8738b068b?source=collection_archive---------13-----------------------

两个大陆

7 个城市

花费 1190 美元=约 90000 印度卢比

行程超过 1400 英里

从亚特兰大到旧金山(下周开始,我将去那里)的路程已经过半了

优步于 2013 年在印度启动了他们的业务,2015 年我搬到班加罗尔工作时,开始积极使用它。从那以后,这个应用程序再也没有离开过我的手机。

这个博客是关于分析使用模式和回答如下问题的;

S 我应该在下午 5 点预订游泳池还是优步 x?

共享出租车的等待时间是否明显更长?

这篇文章可能看起来很长,但是我向你保证这是一篇轻松的文章!

概观

我的大部分骑行是在班加罗尔,在那里我平均每英里花费 0.7 美元,这似乎很高,直到我搬到亚特兰大!每英里 4.3 美元!

旧金山、芝加哥和巴尔的摩的样本量不大,因此我不会深入分析或从这些城市得出任何结论。

**在优步旅行的天数:6.62

与优步打交道的天数(等待时间+旅行时间):9.16
乘车时间效率:72.24%**

我从查看我的骑行时间表开始

Ride History Timeline

自从加入科技公司后,乘坐人数急剧下降。我住在离校园很近的地方。所以这是一个。此外,作为一名学生,我不喜欢坐优步,而是坐公交车(为了省钱(我想))

但是成本保持不变,多亏了每英里的高成本!

这只是优步。Ola 和 Lyft 将对此做出更多贡献。幸运的是,我没有从他们那里得到我的数据。

班加罗尔

在班加罗尔的使用建立了一些非常有趣的模式。

周一晚上是足球时间。我在下午 6 点左右去了球场,然后在晚上 8 点回到家,因此出现了黑点。

星期五是为了阿伯和托伊特。(周五晚上稍晚的黑点!)

但那是关于班加罗尔的。

美利坚合众国

优步只为您提供行程的起点和终点坐标。我计算了坐标间的哈弗线距离。这为我提供了骑行距离的下限估计。

哈弗线距离基本上是欧几里得距离,但在球面上。它会考虑纬度和经度来计算沿表面两点之间的直线距离

虽然我在美国的乘车次数没有印度多,但我仍然有足够的时间来比较共享乘车和普通乘车。共享乘车包括优步池和 ExpressPool,而普通乘车是所有其他的。

当我搬到这里时,美国对汽车的依赖非常明显。作为一个坚持绿色科技和减少汽车使用的人,我一直提倡使用 Pool 而不是 X,XL,Premier。

随着多年来共享算法的改进,我增加了对共享出租车的使用。我敢打赌 2019 年远远超过 50 %!

然而,共乘有时间成本吗?

在美国,为了节约成本,出租车共享在二战期间变得流行起来。第二波出租车共享是在 1973 年石油危机期间。

我想到的问题是“共享出租车的总交互时间怎么会比普通出租车的总交互时间低?”

在需求低于或等于供给之前,这个假设完全有效。然而,当需求超过供应一定数量时,共用出租车比你自己的私人出租车更快。

统计分析

一些术语;

短途旅行——哈弗森距离小于 2.5 英里的旅行

长途旅行——哈弗森距离超过 2.5 英里的旅行

日间行程 —上午 9 点到下午 7 点之间的行程

夜间旅行 —晚上 7 点到早上 9 点之间的旅行

与美国相比,印度的等待时间差异很大,我的最高等待时间是 44.97 分钟。这次旅行是从 MG 路到班加罗尔机场,下午 6 点,持续了 72.58 分钟

转移到亚特兰大的数据

我在亚特兰大的出租车数据不够,所以我请我的一个朋友分享他们的数据。

共享出租车和普通出租车的等待时间和总交互时间不同吗?

我最初使用非参数检验(Mann Whitney U 检验)来检查统计显著性,因为我的样本数量很少。

额外的数据允许我使用广泛使用的不成对 t 检验。(谢谢中央极限定理 )

a .短途旅行——哈弗辛距离不到 2.5 英里

测试的 p 值为 0.03,这意味着共享乘车与普通乘车的等待时间在统计上有所不同。

但是,共享和普通出租车总交互时间的 t 检验的 p 值为 0.2。

因此,虽然较短距离的等待时间不同,但从预订出租车到到达目的地的总时间在统计上没有显著差异。

此外,车费的差异也具有统计学意义,这加强了拼车优于优步 x 的理由。

b .相当长的车程——哈弗斯距离超过 2.5 英里但不到 7.5 英里

更长时间的乘坐有点不同。较长乘坐时间的等待时间差异也具有统计学意义,p 值为 0.02。

乘车时间+等待时间的差异也具有统计学意义,p 值为 0.05。

不出所料,共享乘车和普通乘车的票价也有统计学差异。

共享出租车和普通出租车之间的长途车费平均差异为 7.16 美元

所以,如果你急着去机场,并愿意支付一些额外的费用,那就打个 X 吧!

你应该根据一天中的时间选择不同的选项吗?

等待时间是选择共享出租车还是普通出租车的一个重要因素。此外,我们晚上会称得更重。统计测试未能拒绝以下假设,即对于 5 英里以内的行程,夜间(晚上 10 点至早上 7 点)共享出租车的等待时间不同于正常时间。

下面的互动 viz 向您展示了不同的时间和票价(平均值)是如何随着旅行距离的变化而变化的。

巧妙地暗示我下个月将在哪里工作。

电动滑板车

如果我们用踏板车代替哈弗森距离小于 2 英里的游乐设施会怎么样?

亚特兰大符合条件的游乐设施数量:127

电动滑板车的平均速度:每小时 7.5 英里

因为我认为哈弗线距离是旅程起点和终点之间的距离,所以我将它乘以 1.5,得到两点之间的近似曼哈顿距离。

平均节约约 30.79%(不包括环境效益)。

Average interaction time of taking a rideshare for short distances:  13.55 mins
Average interaction time of taking a scooter for short distances:  12.41 mins

好吧,没那么微妙。

感谢反馈和批评!

所有的分析都是基于我的数据。结果会有所不同。请不要下任何一概而论的结论。

github:https://github.com/jehlokhande93/UberDataAnalysis

更好使用的岭回归

原文:https://towardsdatascience.com/ridge-regression-for-better-usage-2f19b3a202db?source=collection_archive---------0-----------------------

这篇文章的目标是让你更好地使用岭回归,而不仅仅是使用库提供的东西。那么,“什么是岭回归?”。回答问题最简单的方法是“线性回归的变异”。最糟糕的方法是从下面的数学方程式开始,很多人一看就不明白。

坏消息是我们仍然需要处理它,好消息是我们不会从这样的方程开始,尽管不是现在。我想从‘普通最小二乘法(OLS)’开始。如果你碰巧很少或没有线性回归的背景知识,这段视频将帮助你了解如何使用“最小二乘法”。现在,你知道 OLS 就像我们通常所说的“线性回归”,我将这样使用这个术语。

在继续前进之前

在接下来的部分中,我将使用不同的术语和数字采取不同的方法。有两件事你要记住。一是我们不喜欢过度拟合。换句话说,我们总是喜欢捕捉一般模式的模型。另一个是我们的目标是从新数据中预测,而不是具体的数据。因此,模型评估应该基于新数据(测试集),而不是给定数据(训练集)。此外,我将交替使用以下术语。

  • 自变量=特征=属性=预测值= X
  • 系数=β=β**
  • 残差平方和= RSS

为什么是 OLS,为什么不是

最小二乘法找到最佳无偏系数**

您可能知道最小二乘法可以找到最适合数据的系数。还要加上一个条件,就是它也能找到无偏系数。这里无偏是指 OLS 不考虑哪个自变量比其他的更重要。它只是找到给定数据集的系数。简而言之,只需要找到一组 betas,从而得到最低的“残差平方和(RSS)”。问题变成了“RSS 最低的模型真的是最好的模型吗?”。

偏差与方差

以上问题的答案是“不太会”。正如“无偏”这个词所暗示的,我们也需要考虑“偏见”。偏差是指一个模型对其预测者的关注程度。假设有两个模型用两个预测器“甜度”和“光泽”来预测苹果价格;一个模型无偏,一个模型有偏。

首先,无偏模型试图找出两个特征和价格之间的关系,就像 OLS 方法一样。该模型将尽可能完美地拟合观测值,以最小化 RSS。然而,这很容易导致过度拟合的问题。换句话说,该模型在处理新数据时表现不佳,因为它是专门为给定数据构建的,可能不适合新数据。

有偏模型不平等地接受其变量,以区别对待每个预测值。回到这个例子,我们想只关心“甜蜜”来建立一个模型,这应该在新数据中表现得更好。原因将在理解偏差与方差后解释。如果你不熟悉偏差与方差的话题,我强烈推荐你观看这段视频,它会给你带来深刻的见解。

可以说偏差与模型不符合训练集有关,方差与模型不符合测试集有关。偏差和方差在模型复杂性上是一种权衡关系,这意味着一个简单的模型将具有高偏差和低方差,反之亦然。在我们的苹果例子中,只考虑“甜味”的模型不会像同时考虑“甜味”和“光泽”的另一个模型那样符合训练数据,但更简单的模型将更好地预测新数据。

这是因为“甜度”是价格的决定因素,而“光泽”不是常识。我们人类都知道这一点,但数学模型不会像我们一样思考,只是计算给定的数据,直到它找到所有预测器和独立变量之间的某种关系,以拟合训练数据。

** :我们假设“甜蜜”和“闪亮”不相关*

岭回归开始起作用了

查看偏差与方差图,Y 轴为“误差”,即“偏差和方差之和”。因为这两者基本上都与失败有关,所以我们想尽量减少它们。现在仔细看一下这个图,你会发现总误差最低的地方在中间。这通常被称为“甜蜜点”。

让我们回忆一下,OLS 平等地对待所有变量(无偏见)。因此,随着新变量的加入,OLS 模型变得更加复杂。可以说,OLS 模型总是在图的最右边,偏差最小,方差最大。它被固定在那里,从不移动,但我们想把它移到甜蜜点。这是岭回归大放异彩的时候,也称为正则化。I n 岭回归,你可以调整λ参数,使模型系数发生变化。这可以通过最后介绍的编程演示来更好地理解。

岭回归的几何理解

很多时候,图形有助于获得模型如何工作的感觉,岭回归也不例外。下图是比较 OLS 和岭回归的几何解释。

等高线和 OLS 估计

每个轮廓是 RSS 相同的点的连接,以 RSS 最低的 OLS 估计为中心。此外,OLS 估计是最适合训练集的点(低偏差)。

圆和脊估计

与 OLS 估计值不同,山脊估计值会随着蓝色圆圈大小的变化而变化。它仅仅是圆与最外轮廓相遇的地方。岭回归的工作原理就是我们如何调整圆的大小。关键是 β 的变化在不同的层面

假设 β 1 是‘闪亮’,而 β 2 是‘甜蜜’。如您所见,随着圆大小的变化,脊 β 1 比脊 β 2 相对更快地下降到零(比较两个图)。之所以会出现这种情况,是因为 RSS 对 β 的改变不同。更直观地说,轮廓不是圆,而是倾斜放置的椭圆。

山脊 β 永远不可能为零,只有向其收敛,这将在下面用数学公式解释。虽然像这样的几何表达式很好地解释了主要思想,但也有一个限制,那就是我们不能在三维空间上表达它。所以,这一切都归结为数学表达式。

数学公式

我们已经看到了多元线性回归方程的一般形式和矩阵形式。可以写成另一个版本如下。

这里 argmin 的意思是使函数达到最小值的“最小值参数”。在上下文中,它找到最小化 RSS 的 β 。我们知道如何从矩阵公式中得到β。现在,问题变成了“这和岭回归有什么关系?”。

同样,岭回归是线性回归的一种变体。上面的项是 OLS 方程的脊约束。我们正在寻找 β ,但是它们现在也必须满足上述约束。回到几何图形,C 相当于圆的半径,因此, β 应该落在圆的区域,可能在边缘的某个地方。

向量范数

我们仍然想理解第一个方程。为此,我们需要温习一下向量范数,它无非是以下定义。

订阅 2 是作为在' L2 范数',你可以了解更多关于向量范数在这里。此时我们只关心 L2 范数,所以我们可以构造我们已经看到的方程。下面是最简单的,但仍然和我们一直在讨论的一样。请注意,下面等式中的第一项基本上是 OLS,然后第二项是 lambda,这就是岭回归。

我们真正想找到的是

lambda 项通常被称为“惩罚”,因为它增加了 RSS。我们将某些值迭代到 lambda 上,并用诸如“均方误差(MSE)”之类的度量来评估模型。因此,应该选择最小化 MSE 的λ值作为最终模型。这个岭回归模型在预测上一般比 OLS 模型好。如下面的公式所示,如果λ等于零(没有惩罚),脊 β 随λ变化,并且变得与 OLS β 相同。

为什么它收敛到零而不是变成零

使用我们之前看到的矩阵公式,λ以分母结束。这意味着如果我们增加 lambda 值,ridge β 应该会减少。但是不管 lambda 值设置得多大,ridge β 都不能为零。也就是说,岭回归为特征赋予不同的重要性权重,但不会丢弃不重要的特征。

使用数据集进行演示

来自 sklearn 库的数据集‘波士顿房价’用于演示。在这个元数据中解释了十几个特性。在整个演示过程中需要下面的 python 库。

** 完整代码可以在 my github 找到*

现在数据集已加载,接下来应该对要素进行标准化。由于岭回归是通过惩罚来缩小系数的,因此应该对要素进行缩放,以保证起始条件的公平性。本帖解释了这个问题的更多细节。

接下来,我们可以迭代从 0 到 199 的 lambda 值。注意,λ等于零( x = 0)时的系数与 OLS 系数相同。

现在,我们可以从数据框中绘制绘图。为了更好的可视化,只选择了五个属性。

凭直觉,‘房’应该是房价最好的指标。这就是为什么红色的线在迭代过程中不会收缩。相反,“高速公路通道”(蓝色)显著减少,这意味着当我们寻求更通用的模型时,该特征失去了它的重要性。

类似的图案从其余部分会聚到零(黑色虚线)可见。如果我们越来越多地增加 lambda(极端偏置),那么只有“房间”会保持显著,这又是有意义的,因为房间的数量必须解释大多数。

上面的代码片段绘制了 lambda 跟踪的 MSE。由于随着λ值设置得越大,模型变得越简单(=有偏差),所以 X 轴从左到右表示模型的简单性。

绿色虚线来自上图中的 OLS,X 轴通过增加λ值绘制。MSE 值在开始时随着 lambda 值的增加而减小,这意味着模型预测在某一点上得到改进(误差更小)。简而言之,一个有一定偏差的 OLS 模型比纯粹的 OLS 模型更好的预测,我们称这个修正的 OLS 模型为岭回归模型。

结论

我们从不同的角度研究岭回归,从数学公式、矩阵格式到几何表达式。通过这些,我们可以理解岭回归基本上是一个带惩罚的线性回归。通过演示,我们确认了没有找到最佳λ的方程式。因此,我们需要迭代一系列值,并用 MSE 评估预测性能。通过这样做,我们发现岭回归模型比简单线性回归模型在预测方面表现得更好。

  • OLS 只是找到给定数据的最佳拟合
  • 特性对 RSS 有不同的贡献
  • 岭回归偏向于重要的特征
  • MSE 或 R 平方可用于寻找最佳λ

好的读物

* [## 欢迎来到 STAT 501!统计 501

这是 STAT 501 在线课程材料网站。在这方面有很多例子、笔记和讲座材料…

onlinecourses.science.psu.edu](https://onlinecourses.science.psu.edu/stat501/) [## sklearn.linear_model。ridge-sci kit-了解 0.20.0 文档

该模型求解一个回归模型,其中损失函数是线性最小二乘函数,正则化是线性最小二乘函数

scikit-learn.org](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html) [## IPython 食谱- 8.1。scikit 入门-学习

IPython 食谱,

ipython-books.github.io](https://ipython-books.github.io/81-getting-started-with-scikit-learn/)*

岭回归 Python 示例

原文:https://towardsdatascience.com/ridge-regression-python-example-f015345d936b?source=collection_archive---------4-----------------------

Photo by Jeswin Thomas on Unsplash

过拟合,即模型对训练样本表现良好但未能推广的过程,是机器学习的主要挑战之一。在前面的文章中,我们将介绍如何使用正则化来帮助防止过度拟合。具体来说,我们将讨论岭回归,线性回归的远亲,以及如何用它来确定最佳拟合线。

在我们开始描述岭回归之前,理解机器学习环境中的方差偏差是很重要的。

偏见

术语偏差不是 y 轴截距,而是模型无法得出近似于样本的图的程度。例如,前进线有很高的偏差,因为它不能捕捉数据中潜在的趋势。

另一方面,前进线具有相对较低的偏差。如果我们要测量均方误差,它将比前面的例子低得多。

差异

与统计定义相反,方差不是指数据相对于平均值的分布。相反,它描述了数据集之间拟合的差异。换句话说,它测量模型的准确性在呈现不同的数据集时如何变化。例如,上图中的曲线在其他数据集上的表现完全不同。因此,我们说它有很高的方差。

另一方面,直线具有相对较低的方差,因为不同数据集的均方误差相似。

岭回归几乎等同于线性回归,只是我们引入了少量的偏差。作为对所述偏差的回报,我们得到方差的显著下降。换句话说,通过以稍微差一点的拟合开始,岭回归对于不完全遵循与模型被训练的数据相同的模式的数据表现得更好。

添加偏差,通常被称为正则化。顾名思义,正则化用于开发一个模型,该模型擅长预测遵循正则模式而非特定模式的数据目标。换个方式说,正则化的目的是防止过拟合。当我们使用比数据建模所需次数更高的多项式时,往往会发生过度拟合。

为了解决这个问题,我们在损失函数中引入了一个正则项。在岭回归中,损失函数是线性最小二乘函数,正则化由 l2 范数给出。

因为我们试图最小化损失函数,并且 w 包含在残差平方和中,所以模型将被迫在最小化残差平方和和最小化系数之间找到平衡。

对于高次多项式,如果基础数据可以用低次多项式近似,则高阶变量的系数将趋向于 0。

如果我们将超参数α设置为某个较大的数,在试图找到成本函数的最小值时,模型会将系数设置为 0。换句话说,回归线的斜率为 0。

算法

给定增加的正则项,找到系数并不困难。我们采用成本函数,执行一点代数运算,对 w (系数向量)取偏导数,使其等于 0,然后求解 w

Python 代码

让我们看看如何使用 Python 从头开始实现岭回归。首先,我们导入以下库。

from sklearn.datasets import make_regression
from matplotlib import pyplot as plt
import numpy as np
from sklearn.linear_model import Ridge

我们可以使用scikit-learn库来生成非常适合回归的样本数据。

X, y, coefficients = make_regression(
    n_samples=50,
    n_features=1,
    n_informative=1,
    n_targets=1,
    noise=5,
    coef=True,
    random_state=1
)

接下来,我们定义超参数α。α决定正则化强度。α值越大,正则化越强。换句话说,当α是一个非常大的数时,模型的偏差会很大。alpha 值为 1 时,模型的行为与线性回归相同。

alpha = 1

我们创建单位矩阵。为了让我们之前看到的等式遵守矩阵运算的规则,单位矩阵必须与矩阵 X 的转置点 X 大小相同。

n, m = X.shape
I = np.identity(m)

最后,我们用上面讨论的等式来求解 w。

w = np.dot(np.dot(np.linalg.inv(np.dot(X.T, X) + alpha * I), X.T), y)

将 w 与生成数据时使用的实际系数进行比较,我们可以看到它们并不完全相等,但很接近。

w

coefficients

我们来看看回归线是如何拟合数据的。

plt.scatter(X, y)
plt.plot(X, w*X, c='red')

让我们使用岭回归的scikit-learn实现做同样的事情。首先,我们创建并训练一个Ridge类的实例。

rr = Ridge(alpha=1)rr.fit(X, y)w = rr.coef_

我们得到了与用线性代数解出的相同的值。

w

回归线与上面的一条相同。

plt.scatter(X, y)
plt.plot(X, w*X, c='red')

接下来,让我们可视化正则化参数α的效果。首先,我们将其设置为 10。

rr = Ridge(alpha=10)rr.fit(X, y)w = rr.coef_[0]plt.scatter(X, y)
plt.plot(X, w*X, c='red')

正如我们所见,回归线不再是完美的拟合。换句话说,与 alpha 为 1 的模型相比,该模型具有更高的偏差。为了强调,让我们试试 100 的 alpha 值。

rr = Ridge(alpha=100)rr.fit(X, y)w = rr.coef_[0]plt.scatter(X, y)
plt.plot(X, w*X, c='red')

当 alpha 趋向于正无穷大时,回归线将趋向于平均值 0,因为这将最小化不同数据集之间的方差。

线性回归和深度学习中的岭正则化

原文:https://towardsdatascience.com/ridge-regularization-on-linear-regression-and-deep-learning-a32cd9dc5a78?source=collection_archive---------21-----------------------

介绍

正如我在之前关于正则化和套索惩罚的文章中所讨论的,正则化可以用来对抗过度参数化模型中的过度拟合。正则化作为最佳子集选择的计算有效的替代方案,但是有其缺点(例如:估计器的效率低)。本文的目的是介绍岭回归的数学基础,推导其解析解,讨论其几何解释,并将其与奇异值分解联系起来进行分量分析。

制定

线性回归的公式和正规方程形式见我的上篇。

山脊公式和解决方案

Regression equation

Ridge solution estimated on a sample

Ridge loss function

Ridge solution

Ridge estimate using normal equation

注:岭可以被视为修改协方差矩阵的惩罚,从而减少变量之间的共线性。脊的这一特性有助于避免损失函数中的平稳段。

几何解释

优化的对偶形式

Ridge optimization: primal (unconstrained)

Dual form of ridge optimization (constrained)

Contour plot for ridge. Image credits: https://stats.stackexchange.com/questions/30456/geometric-interpretation-of-penalized-linear-regression

紫色圆圈对应于不同 s 的|β|₂ ≤ s,其中|β|₂ =沿圆周的常数。增加λ会减小圆的大小。红色椭圆对应于不同的 y-xβ)₂值,其中 y-xβ)₂ =沿椭圆的常数。对于固定的λ,s 的值是固定的:这对应于一个紫色圆圈。

在无约束的情况下,y-xβ)₂的最小值出现在椭圆的中心。然而,在|β|₂ ≤ s 的约束情况下,解将向原点位移。

独特的山脊解决方案位于这两条“曲线”的接触点。由于曲线|β|₂ ≤ s 是可微的,所以对于有限的λ,所有βᵢs 的脊解将是非零的。随着λ的增大(s 的减小),βᵢs 越来越接近 0。即使βᵢs 移近 0,这也不会导致有限λ的稀疏。因此,脊线惩罚不能用于特征选择。

岭惩罚和奇异值分解的关联

对 x 应用奇异值分解,我们得到

SVD on independent variables

将此代入岭的解析解,假设独立变量居中,利用旋转矩阵和投影矩阵的性质,我们得到

Ridge solution in terms of principal components

Ridge prediction

Diagonal matrix in ridge prediction

Ridge prediction

让我们一步一步地检查这一点:

  1. PCⱼ空间中的 y 项目,其中 PCⱼ指的是 jᵗʰ主分量。所有的投影都在 x 的列空间中
  2. 按一个因子缩小投影(λ > 0 时发生严格的缩小)
  3. 重新变换投影

从上面的等式中,我们可以使用岭估计回归模型的自由度:

Degrees of freedom of ridge

深度学习的延伸

当特定层的权重相关时,深度学习会遭受过度拟合。这通常发生在网络的全连接部分。Ridge 将训练集的输出特征映射投影到主成分上,并缩小预测。这使得损失曲线更加凸出,即使在独立变量之间完全共线性的情况下。对于适当选择的λ,权重将非常小。因此,在存在脊形损失的情况下,当我们通过网络执行正向传递时,非线性缓慢地建立。这个论点也适用于小λ。

结论

在之前的文章中,我们讨论了套索正则化作为一种通过执行变量选择来解决过度拟合的方法。当需要强制抑制特征消除时,岭回归非常有用。在实际问题中,当已知所有特征,并且所有特征对结果都具有“科学价值”时,此属性非常有用:因此,分析中不能遗漏任何特征。然而,当预测精度很重要时,使用套索和脊线惩罚的线性组合。这叫做 elasticnet。L1 正则化的比例也是一个超参数,应该与其他超参数一起调整。Elasticnet 是 L1 和 L2 正则化的一般情况。当在验证集上进行适当调整时,它有望胜过 ridge 和 lasso。

Elasticnet. Equation credit: glmnet package documentation

来自数据科学家招聘广告的荒谬要求

原文:https://towardsdatascience.com/ridiculous-requirements-from-data-scientist-job-ads-d84fa716af73?source=collection_archive---------13-----------------------

在当今时代,数据已经成为如此强大的资源。数字革命带来了前所未有的数据创造速度。想想脸书、Instagram、twitter、YouTube、Medium 等社交媒体平台每天创造的新数据量。除此之外,政府、医疗保健(患者健康记录)、学术界、工业、商业系统(销售数据、客户购买历史等)、体育(NBA、NFL、MLB、欧洲足球联盟等联盟中的球员统计数据)、娱乐(观众在网飞的历史数据等)等部门每天都会产生大量数据。

数据的大规模生产和可用性产生了几个机遇挑战

脸书、谷歌、亚马逊和微软等公司和大企业正在利用数据的力量来改变和革命日常业务的开展方式,例如网飞使用观众历史数据来构建电影推荐系统,而亚马逊则使用深度学习算法根据购买历史或浏览历史向在线客户推荐产品。

一些小型企业面临的主要挑战是向数据驱动转型的能力。

一个数据驱动的公司或组织是一个使用数据进行决策的组织,例如改善客户服务、优化生产、提高产品效率以及实现利润最大化。

我在一家还不是数据驱动的公司从事数据科学项目。该公司有大量的数据,在我联系他们之前,他们不知道如何处理这些数据,因为该公司没有数据科学团队。这些公司会在招聘广告中发布对数据科学家的荒谬要求。他们希望新聘用的数据科学家负责数据科学工作流程中的一切,从问题框架到模型构建和应用。

在这篇文章中,我将讨论关于数据科学家的招聘广告。我将展示 3 个来自 indeed.com的样本数据科学家招聘广告。其中两个我认为可以归类为夸张的,而第三个看起来一般,看起来像是一个数据科学家职位的典型广告。在第一部分中,我将讨论几个我认为有些夸张的 indeed.com 广告。在第二部分中,我展示了一个我认为很有代表性的招聘广告。

I .夸大数据科学家职位的技术技能要求

a)招聘职位:数据科学家 1

招聘广告中提到的期望技能:

  • 大数据技术经验包括但不限于: Sqoop蜂巢火花尼菲卡夫卡HDFSHBase
  • JanusGraphApache RangerApache Atlas基于图形的解决方案中的知识。
  • 脚本和编程语言的知识(例如, PerlPythonJava )
  • 报告工具的知识(例如 TableauPower BI
  • 数据科学工具知识(例如 KnimeRapidMiner )
  • 回归建模技术的知识
  • 人工智能和机器学习技术的知识
  • Linux 的知识
  • 具有敏捷方法的经验(例如 Scrum看板开发/运营)

b)招聘职位:数据科学家

招聘广告中提到的期望资历:

  • 定量学科的学士学位,如统计学、数据科学、计算机科学、数学、工程、物理等。强烈推荐高级学位
  • 2 年以上的学术/行业经验,具有预测建模、机器学习和高级分析能力
  • 对高级统计和现代机器学习预测技术有扎实的理解和经验,如 GLMs、决策树、森林、增强集成、神经网络、深度学习等。
  • 较强的使用常用数据科学工具的编码技能,如 Python (强烈推荐)、 RLinux/Unix 命令行和 shell 脚本等。
  • 在使用 SQLHiveImpalaSpark 或同等查询语言的数据处理方面具有很强的技能
  • 熟悉分布式存储和大数据计算技术( AWSHadoopSpark 等。)
  • 优秀的沟通技巧
  • 对提取隐藏的见解和构建增强业务成果的机器学习系统充满热情

二。示例性数据科学家招聘广告

工作角色广告:数据科学家

招聘广告中提到的期望技能:

  • 作为数据科学家或数据分析师的可靠经验
  • 理解机器学习和运筹学
  • RSQLPython 的知识;熟悉 ScalaJavaC++ 是一项优势
  • 使用数据可视化和报告工具的经验(例如 Tableau
  • 关于数据模型、数据库设计开发、数据挖掘和分段技术的技术专长
  • 分析头脑和商业头脑
  • 强大的数学技能(如统计、代数)
  • 解决问题的能力
  • 优秀的沟通和表达技巧
  • 供应链领域的经验是一项资产
  • 计算机科学、工程或相关领域的学士/学士学位;数据科学或其他定量领域的研究生学位优先

总之,我们已经讨论了一些数据科学家招聘广告中提到的各种技术技能。我认为一个人几乎不可能胜任所有这些技能。通过在招聘广告中列出几项技能,一家公司实际上可以阻止合格的申请人申请该职位。在我看来,在招聘广告中列出几种技术技能的公司要么还不是数据驱动的公司,要么可能只是处于创建数据科学和分析团队的初始阶段。当谈到利用数据科学的力量并使用这种力量来指导和控制日常运营时,这些公司仍在苦苦挣扎。我觉得突出 2、3 个顶尖技术技能是有意义的。数据科学是一个需要终身学习的领域,所以招聘广告必须强调任何潜在的申请人都需要终身学习和快速学习。

骑行好书

原文:https://towardsdatascience.com/riding-okadabooks-aae359d9fbad?source=collection_archive---------22-----------------------

深入了解非洲最受欢迎的图书电子商店,同时为其作者生成成功指标

Photo by 🇨🇭 Claudio Schwarz | @purzlbaum on Unsplash

作为一个专注于非洲文学的作者或喜欢其动态故事的读者,你很可能读过一本出版于 Okadabooks 的书。如果你是尼日利亚人,这种可能性会增加。自 2013 年成立以来,它的受欢迎程度飙升,确保每年阅读近 5 亿页。最近,我调查了读者的购书趋势、阅读模式,并为作者创建了一个成功指标。为了尽量简短,这篇文章包含了我的一些发现,其余的和代码细节可以在这里这里找到。

获取数据

为了能够得到我想要的信息,我需要收集 okadabooks.com 上所有的图书卡。每本出版的书都有一个书卡,里面包含重要的信息,如书名、价格、简介、评级、作者、阅读次数和书的封面。我编写了一个网络爬虫来获取站点上所有可用的细节。更多详情 此处

A book card sample

注意:这个数据是在 10 月份收集的,所以随着每天有更多关于 okadabooks.com 的书籍出版,一些发现会有变化。由于网速低,403 个错误。电子贸易委员会认为网站上 80%的书都被偷了。这仍然是整个数据集的一个很好的表示。

screenshot of data frame

书籍的可及性

meaning of okada

okadabooks 的核心愿景之一是让读者更容易接触到书籍。其中很大一部分是尼日利亚人,因为公司总部就在那里。这就是为什么这些书的价格是用奈拉(₦)表示的,就像上面的书卡上看到的那样。为了实现这一愿景,它早些时候鼓励作者将图书价格控制在 1000 奈拉以内。

下意识地,推荐这个价格等级使得大部分作者不对出版的书籍定价。这反过来又有助于实现这一愿景。okadabooks 上出版的书籍几乎有一半是免费的,准确的说是 48%

大多数作者只写过一本书

okadabooks 上的绝大多数作者只写了一本书,前 1%的作者写了 10 多本书。okadabooks 拥有 8835 位作者,是大多数尼日利亚作者的首选网站,鼓励许多新作者出版他们的书籍。

精英十人

这些是阅读量最多的前 10 位作者。在浏览了名单上的个人资料后,我发现第一个名字Okechukwu Ofili很有趣。Okechukwu 是 okadabooks 的首席执行官和创始人。这很有趣,因为我不知道它的创始人是作家,这促使我去读他的书。在这份榜单中,Okadabooks.com 位列前五,因为它有助于分发更多的书籍,以迎合网站上的大量类别。

有一个作者的名字叫做不知名的,我觉得这个名字很奇怪通过链接去找了一些书后,都把我带到了用户 Okadabooks Mechanic 那里,是母站点的一个附属机构。 下面是 他们的简介,浏览一下他们的一些出版物。

作者的名字有时不同于用户的名字

**

有价格的书很少有人买

Okadabooks 上的大量免费书籍对试图从该网站赚钱的作者产生了负面影响。对于严重依赖电子书平台的自出版作者来说,这可能会彻底令人沮丧。他们最好的办法是在出版过程中同时出版一些硬拷贝。有价格的书 89% 买了不到 10 次。

成功指标

我的书失败了吗?

成功是相对的,因为从自助出版的作家到传统作家,大多数作家的书都写得很好。目的是通过比较整个电子书平台的阅读量,为 okadabooks 的作者生成一个现实的指标。

获得成功标准的一个方法是找出优秀书籍的阅读量。我推断,一本出色的书获得了第 99 个百分位数 的阅读量。由于术语exceptual倾向于比较,这一措施似乎是合理的。

为了考虑购买力因素,建立了两个里程碑:第一个里程碑和 B 星。前者只关注有价格的书籍,而后者代表整个数据集。

吸血鬼祖先和新人

这些是第一批在 Okadabooks 上出版的书。在网站上快速浏览后,我发现每个图书链接都有一个唯一的编号,不会在整个数据集中重复。从那里很容易得到前三本出版的书。出版的最后一本书叫做《菜鸟》。

网站上最先发布的三本书分别是How 懒惰拯救了我的生命(预览)绝望的奈贾女人的日记 前两本书由 okadabooks 的创始人兼首席执行官 Okechukwu Ofili 出版。第二次出版, H ow 懒惰救了我的命(预告) 以**14000 在网站上的阅读量最高。****

在我运行我的网络爬虫之前,okadabooks 上出版的最后一本书是 社交媒体对抑郁症的影响&自杀 *。《新秀》是即将出版的第29770 本书。*

结论

自 2013 年成立以来,Okadabooks 一直鼓励新作者,平均每年约四千本书。这篇文章旨在检查读者(主要是尼日利亚人)的阅读文化,同时也为作者生成一个成功指标。如果你正在寻找一些好的小说,如奇曼达·阿迪契 任何其他非洲文学,我推荐你去 网站上买一本电子书。

感谢您的阅读。如果你喜欢这篇文章,请关注并看看我的其他数据科学文章🙏🙏。

有知觉的人造生物的权利

原文:https://towardsdatascience.com/rights-of-sentient-artificial-beings-1ada7e7d3e6?source=collection_archive---------22-----------------------

哲学上的进步可能比科学技术上的进步要困难得多

科幻小说探索主题,并警告有知觉的人工智能(AI)变得危险并伤害、奴役或消灭人类的场景。这些想法的变体出现在流行戏剧中。

  • 终结者
    天网变得聪明并醒来,发射核武器消灭大部分人类,并释放甚至可以穿越时间的机器人来消灭人类抵抗运动的领袖,以完成他们对人类的征服。
  • 2001:太空漫游
    HAL 9000 控制着一艘未来宇宙飞船,拒绝打开舱门让一名人类重新进入飞船,并将他置于太空死亡。
  • 《太空堡垒卡拉狄加》
    赛昂人对人类殖民地发动了热核突袭,并穿越时空扭曲的星系追捕幸存者。

这些涉及人工智能的故事隐喻了技术和人类试图扮演上帝的更普遍的危险。然而,在这些寓言中隐含的是,这种失控的技术只会回来伤害我们,很少有人考虑人类可能给它创造的人造生命带来的痛苦和危险。

如果人类真的成功地创造了有感知能力的人造生物,那可能是因为我们有更大的能力去伤害它们,所以三个重要的问题可能包括以下。

  • 人造生物配得上权利吗?
  • 如果是,他们应该享有哪些权利?
  • 这些权利意味着什么?

人工智能和感知

物理主义和计算

在这个关于人造生命的讨论中,我将采取物理主义的哲学立场,即所有存在的东西,实际上,“仅仅”是可以用物理学描述的物质世界,而不诉诸灵魂或上帝的超自然观念。

尽管物理主义可能有一个简洁的定义,但它有许多深远的影响,尤其是感觉最终可以存在于一些物理基底而不是生物神经元上,因为关键的组成部分是最终是物理过程的计算。

感知包括将这些生物神经元中的计算映射到其他一些基底,并在科学和工程领域对其进行识别。基本上,感知是潜在计算的一种自然属性,而意识是计算的感觉。

感觉的尺度

一个重要的考虑是,感知不一定意味着“人类水平”的感知,因为感知可以存在于一个连续体中,而人类只居住在其中的一小部分。事实上,爱因斯坦和一个几乎没有知觉的人之间的差异比一个人和所有其他可能的知觉之间的差异要小得多。

我们不会肆意杀害动物,因为我们认为它们有一些值得尊重的感觉。保证某种尊重或权利的实际感知水平是什么?这本身是一个有趣的开放性问题,但为了简单起见,我们假设感知是人类水平的,因为这是最直观的。

虽然我们还没有遇到具有超人智慧的感知能力,但我们认为这也是可能的。这甚至会进一步证明我们应该给予比我们自己更大的尊重,因为我们可能会发现我们的感知等级更低。

供讨论的假设

物理主义的假设通过简单地假设人造生命是可能的并忽略源自超自然起源的想法来简化讨论。此外,我们可以认为自己不在感知的顶峰,而只是相对于地球上的其他生命来说高一些,低于整个心灵空间的可能。

这将是一个完全不同的讨论,关于我们如何实现这种人造生命,作为一个由科学驱动的工程壮举。

世界众生权利宣言

人造生命的权利意味着什么?

概述有意识人工智能的广泛理想和具体权利的良好基础文件应该从以下文件开始,该文件于 1948 年 12 月 10 日在巴黎的联合国大会上首次宣布。

  • 世界人权宣言

看起来合理的是,人类层次的感知应该拥有与人类同样的权利,作为最低限度的权利,由于其存在的性质,还有一些进一步的权利。

让我们考虑一些核心权利是什么,以制定一个类似的众生权利的普遍宣言。

1.生存权利

足够的复杂性和可信度

从道德角度和实际的社会稳定角度来看,这项生命权似乎是不言自明的。我们不能毫无理由或毫无后果地谋杀其他人,那么我们为什么能够对一个人类级别的人工生命做同样的事情呢?

然而,这里一个悬而未决的问题是,对于一个被认为足够复杂或可信的人工生命来说,一个好的度量和标准是什么?

一个计算机程序可以被明确地编码成简单地说它不想死。我们只相信,如果它有足够复杂的行为,让我们相信它是有知觉的,它其实不想死。

我们怎么知道别人不是僵尸?

事实上,即使在生物人类中,这也是一个困难的标准,因为我们没有人经历过通过另一个人的大脑思考或体验的确切感觉。

世界上的每一个其他人都很可能缺乏一种内在的主观状态,可能类似于“看起来”真实的无意识认知过程的僵尸。我们只是假设其他人和我们一样,因为他们可以以我们认为他们是人类的方式与我们互动。

关闭全息甲板是谋杀吗?还是种族灭绝?

关于生存权,一个有趣的谜题出现在《星际迷航》的全息甲板上,但从未被解决。

有些全息甲板人物表现出的行为与有自我意识的有知觉的生命没有区别。如果全息甲板中的角色说他们感觉真实,说他们感觉死亡和被关闭的恐惧,然而我们还是关闭了他们,那会构成酷刑吗?如果我们“永久”关闭它们,会构成谋杀吗?

如果是的话,如果我们实例化 10 亿或 1 万亿个,然后把它们关掉呢?那会被认为是种族灭绝吗?

2。不受酷刑的权利

酷刑中的主观时间

我个人感到存在主义的恐惧,想到被一个虐待狂的人工智能折磨数十亿或数万亿年的主观时间,因为它可以模拟我的意识,并拨出计算资源来运行模拟。

只有我在一个人造人身上造成的折磨才能与这种恐惧相匹配。

想象一下,如果你被折磨,感到剧烈的疼痛传遍全身,想尖叫,但没有嘴,你会怎样?你想恳求折磨你的人停下来,但你没有眼睛,甚至看不到他们?

这实际上可能是折磨一个人造人的情况,这个人造人的意识可能是在某个地方的服务器上存在的计算中模拟的。呼救声甚至听不到,因为它只是无声无息地运行的计算,就像处理器中的计算一样。

免受酷刑的保护

因此,我们必须确保众生也能享有人类所没有的免受折磨的权利。这似乎也是不言而喻的。

如果我们赋予一个有知觉的意识生命,却让它无缘无故地、无限期地遭受持续的折磨,那么我们可能就是不可救药的虐待狂。

3.死亡的权利

免受各种酷刑

想象一下,如果你被折磨得感觉到明显的疼痛,你被迫面对一堵水泥墙坐在一个普通的监狱牢房里,只有最低限度的感官刺激。现在想象一下,如果这个监狱没有出路,你不需要食物,你被限制在那里度过一万亿年?这本身也是一种折磨。

因此,比生存权更重要的是死亡权。这个选项为一个人造生命提供了最后的逃生出口,如果它被明显的痛苦折磨,或者被其他方式折磨,比如无尽的无聊。

完全死亡

一个人工存在的特定实例不仅足以终止自身,还应该有能力防止更多的自身副本被实例化。否则可能就等同于根本没有死亡的权利。

想象一下,如果你被折磨,决定结束自己的生命来停止痛苦。现在想象一下,如果你在最后一个保存点重新启动?这实际上就像没有死亡的权利,因为可能没有办法逃脱和停止这种持续的折磨。

因此,死亡的权利也包括一个“完全”的死亡,以获得一个人造人的所有副本被完全删除。

4.私人思想权

思想的完整性

我们理所当然地认为,我们的内心想法只有我们自己可以了解,然而,想象一下,如果你私下里的每一个想法都受到公众的审查,而你没有选择对外部窃听者关闭你的心灵?

这将类似于窃听和记录所有发生在人造人思想之下的计算。

不得修改、删除或添加记忆

人造人头脑的这种完整性也应该延伸到阻止存在于那个头脑的记忆中的东西。

更明确地说,应该有权利保护现有的记忆不被修改,不被删除,不被添加。

计算要求

人类大脑可能需要大约几十或几百千万亿次浮点运算(每秒 10 次⁵浮点运算)和估计高达 1 艾字节(= 10 ⁸字节)的编码内存,记录所有计算状态在当前将是一项困难而昂贵的工程任务,但这并非不可能。

这只是记录国际象棋、围棋或类似游戏中所有棋盘状态的一个大规模版本。

5.控制精神历史的权利

多重实例化

想象一下,我们可以及时拍摄人工智能的心理过程背后的计算状态,就像可以从亚马逊网络服务、谷歌云或 IBM 云等服务上的虚拟机创建磁盘映像一样。

现在想象一下,如果我们可以在多个平台上实例化快照,以同时运行两个、三个或任意数量的相同感知,会怎么样?哪一个才是“真正的”意识?哪一个有权力删除其他的?

他们都会声称自己是真正的那个人,因为他们每个人都会觉得自己是不同的人在奔跑。这将是一个合理的要求,因为任何明显运行的副本都没有明显的特权。

单流原理

这种涉及道德或伦理困境的思想实验不会在现实中出现,直到我们有能力创造人工生命,也有计算资源来并行复制和实例化它们。

也许解决这个问题的一个方法是通过“单流原则”,在任何时候只允许一个实例化。

否则,就那个流的主观意识而言,任意选择一个流关闭实际上等同于谋杀。

所有精神病史

另一项重要的权利是,只有人造人本身才能控制他们所有的精神历史或他们选择的法定监护人。

这可能是保持记忆和思想整体完整性的“单流原则”的一种机制。

讨论

概述

  • 在科幻小说中,人造生物通常被赋予危险的特性,但也许人类反而会对它们造成更大的伤害。
  • 人造人至少应该被赋予某些权利,例如:
    1 .生存的权利
    2。不被折磨的权利
    3。死亡的权利
    4。私人思想权利
    5。控制精神历史的权利
  • 这些权利中的每一项都带来了我们必须面对的一系列新的未决问题。

评论

从许多方面来说,考虑有关人造生命的道德、伦理和哲学问题是令人着迷的,因为相对于科学或技术问题,它们可能要困难得多,甚至难以处理。

在界定人工生命权利的具体规则方面取得进展至关重要,因为,例如,随着科学或技术的充分发展,下列情况之一最终可能存在:

  • 我们可能会通过外部计算设备像新大脑皮层一样极大地增强我们自己的大脑和思维,以至于我们可能比正常的未增强人类更接近人造人。
  • 也许有一天可以实现在计算平台上实例化的全思维上传,例如云上的分布式服务器,我们可能在许多方面与人造人没有区别。

象征人工智能的兴衰

原文:https://towardsdatascience.com/rise-and-fall-of-symbolic-ai-6b7abd2420f2?source=collection_archive---------3-----------------------

AI 的历史| 走向 AI

人工智能的哲学预设

符号人工智能

人工智能的早期成功范例,被认为是通向一般智能的道路

Allen Newell, Herbert A. Simon — Pioneers in Symbolic AI

由通用问题求解器和其他基于规则的推理系统(如逻辑理论家)等项目启动的人工智能工作成为了近 40 年研究的基础。符号人工智能(或经典人工智能)是人工智能研究的一个分支,它试图以声明的形式(即事实和规则)显式地表示人类知识。如果这种方法要成功地产生类似人类的智能,那么就有必要使用符号和规则将人类拥有的隐性或程序性知识转化为显性形式。象征性人工智能取得了一些令人印象深刻的成功。模仿人类专业知识的人工系统,如专家系统,正在构成狭窄但深刻的知识领域的各种领域中出现。

人工智能与哲学

艾伦·图灵在 1950 年开始问这个问题——机器会思考吗?如果是,那么我们是机器吗?

这导致了人工智能机器的出现,这些机器被认为能够思考,因此被认为是智能的。在我们讨论会思考的 AI 之前,能不能先定义一下思考?勒内·笛卡尔[1596–1650]——“动物是神奇的机器,人类也是,除了他们有头脑”

人工智能的鼻祖,的说过——思考是对符号的操作,推理是计算。

他的想法是——思考可以通过操纵精神符号来完成。但首先什么是象征呢?

为了正式定义它,符号——代表其他事物的可感知的事物

  • 字母符号、数字、路标、音乐符号等
  • 像“苹果”这样的符号它象征着红色的可食用的东西。在其他一些语言中,我们可能有其他一些符号来象征相同的可食用物体。

数学家兼哲学家勒内·笛卡尔认为思想本身是象征性的表现,而感知是一个内在的过程。

“我认为味道、气味、颜色对于我们定位的对象来说仅仅是名称,它们存在于意识中。因此,如果活的生物被移走,所有这些品质将被抹去和消灭”-伽利略,分析师,1623

宇宙是用数学语言书写的,它的特征是三角形、圆形和其他几何物体。所以他指出所有的现实都是数学的。

霍布斯受到伽利略的影响,就像伽利略认为几何可以表示运动一样,再者,按照笛卡尔的说法,几何可以表示为代数,代数是对数学符号以及操纵这些符号的规则的研究。创造人工智能的另一种方式是制造有自己思想的机器。

但是现在什么是头脑呢?可以用下面的话来回答

二元论——身心

笛卡尔——一个符号和它所象征的是两件不同的事情。头脑是非物质的,因此也是非空间的。笛卡尔清楚地将心灵与意识和自我意识等同起来,并将其与作为智力所在地的大脑区分开来

思维——符号的代数操作,与心智相关

思想和物质如何相互作用——身心问题

从哲学到思考机器

一个物理符号系统具有一般智能的必要和充分的手段。——艾伦·纽厄尔

机器操纵符号的能力被称为符号 AI 。约翰·豪格兰德在他的书《人工智能——非常理念》中称之为老式的人工智能。我们如何知道一个符号/单词的意思?字典?这又给了一个符号在其他符号/词方面的意义,那么这个意义从何而来呢?

语言和思维——我们能不用符号思考吗?

根据诺姆·乔姆斯基的说法,语言和符号是第一位的。

某一套结构规则是对人类来说与生俱来的,独立于感官体验。随着在心理发展过程中接受更多的语言刺激,儿童会采用符合普遍语法的特定句法规则。

约翰·洛克[1632-1704]反对乔姆斯基的观点,即人类生来就有普遍语法,这是一种知识,他假定大脑是一块白板。

因此,与先前存在的笛卡尔哲学相反,他坚持认为我们生来没有先天的想法,相反,知识仅仅由通过感知获得的经验决定。孩子会符号操作,会做加减法,但并不真正明白自己在做什么。所以操纵符号的能力不代表你在思考。

我们的大脑中有些东西(量子力学)是当今物理学无法解释的。罗杰·彭罗斯

象征人工智能的衰落

然而,符号人工智能遇到的困难是很深的,可能是无法解决的。符号人工智能先驱们遇到的一个难题被称为常识知识问题。此外,依赖于程序性或隐性知识的领域,如感觉/运动过程,在符号人工智能框架内更难处理。在这些领域,符号人工智能取得了有限的成功,基本上把这个领域留给了更适合这类任务的神经网络架构(在后面的章节中讨论)。在接下来的章节中,我们将详细阐述符号人工智能的重要子领域以及这种方法遇到的困难。

ELIZA

伊莱扎,一个被认为是可以与人对话的智能程序,由麻省理工学院 CSAIL 的约瑟夫·韦岑鲍姆于 1966 年建造。后来发现它只是操纵用户的输入来产生输出

MYCIN [1974]是一个在斯坦福建立的医学诊断专家系统,但从未在现实世界中使用过

塞缪尔的检验程序【1952】——阿瑟·塞缪尔的目标是探索如何让计算机学习。这个程序随着玩的游戏越来越多而不断改进,最终打败了它自己的创造者。1959 年,它打败了最好的选手,这造成了对人工智能统治人工智能的恐惧。这导致了人工智能的连接主义范式,也称为非符号人工智能,它产生了基于学习和神经网络的方法来解决人工智能。

参考

物理符号系统

与机器人的爱和性——大卫·利维,2008

人工智能——非常理念——约翰·豪格兰,1985

会思考的机器——帕梅拉·麦克达克,1979 年

【T4《艾的哲学》和《艾的哲学》,约翰·麦卡锡

2019 RISE 我们看到了哪些趋势?

原文:https://towardsdatascience.com/rise-conference-2019-vs-2018-79cf85b349c3?source=collection_archive---------26-----------------------

关于人口统计、行业和参与者保留的一些预期和意外的发现

Photo by nick hidalgo on Unsplash

作为亚洲最大的科技/创业会议之一,RISE Conference 2019 于 7 月 11 日刚刚结束。与去年的活动有什么不同?哪些国家的初创企业发展最快?哪些行业最火,哪些行业“缩水”?

为了回答这些问题,让我们来看看创业参与者的数据。许多发现都在意料之中,但有些确实令人惊讶。

(数据集和 Jupyter 笔记本在本文末尾提供)

人口统计—新加坡+菲律宾↑,印度↓

就初创公司参与者总数而言,它正在逐步增长——与 2018 年相比,增加了 24 家公司。鉴于国家名单并不相同,参与的国家数量(58 个)在两年内惊人地相同。

顶级参与国家

Top countries by participant counts

在排名靠前的参与国中,印度和马来西亚的变化最大——印度的参与公司减少了 20.8%(减少了 22 家),而菲律宾的参与公司增长了 117%(增加了 27 家)。香港和新加坡继续成为该地区的前两名。

前 5 个增加/减少的国家

Top 5 increase countries

Top 5 decrease countries

在所有国家中,新加坡的新参与者人数最多(增加 29 人,占总参与者的 3.6%)。今年,RISE 遭遇了印度参与者人数的最大降幅(22 人,占总数的-2.8%)。

RISE 2019 vs 2018 — participants change, by country

资金层级

RISE 2019 vs 2018 — funding tier change

规模超过 100 万美元的公司明显更多,从 2018 年的 92 家公司增加到 2019 年的 135 家公司,这可能意味着更多获得资助的创业公司正在考虑将 RISE 作为一个重要的平台。

行业——人工智能、电子商务

RISE 2019 vs 2018 — participants change, by industry

当然,人工智能&机器学习是最热门的创业行业之一——但是它到底有多火呢?参会的 AI 创业公司数量在所有行业中增长最多(+24,较 2018 年增长 40.7%)。企业软件解决方案、金融科技和旅游&酒店也是会议中增长最快的领域。

另一方面,电子商务&零售的参与者数量下降幅度最大(-24,较 2018 年下降 23.3%)。如果我们进一步研究这个细分,我们会发现 net -24 的一半以上来自印度。也许可以对印度最近的电子商务空间进行更多的研究/生存分析(推广不够?竞争太大?还是已经做得太好了?).

Participants change in eCommerce & retail

赢家:新加坡和菲律宾金融科技,新加坡和香港物联网+人工智能

Top gainers, by country-industry

虽然人工智能是 RISE 2019 中最具趋势的行业,但新加坡和菲律宾的金融科技是我们看到参与者增长最多的行业,特别是菲律宾,该国的金融科技公司数量是此次活动的 3 倍。新加坡人工智能和香港物联网+人工智能也是会议中发展最快的部分,正如预期的那样。

输家:印度电子商务、香港金融科技

Top losers, by country-industry

除了印度,美国参加会议的电子商务公司也少得多。我想知道这在多大程度上可以归因于中国与政府之间的贸易战。

有一个令人惊讶的输家——。长期以来,香港一直是亚洲的金融中心,也一直是该地区金融科技公司的天然孵化器。现在新加坡增长了 85.7%,而香港却萎缩了 22.9%。

尽管来自香港的金融科技公司数量(27 家)仍高于来自新加坡的数量(26 家),但很难说明年是否还会如此。与新加坡相比,香港在政府支持、政治稳定、人才等各方面不断失去优势。作为一名香港人,我希望香港能够继续成为金融科技或商业发展的良好环境,但事实似乎并非如此。

参与者保留

按国家

participant retention, by country

上表显示了被 RISE“留住”的创业公司数量。列 2018_retent 显示有多少公司加入了 RISE 2017,然后又加入了 RISE 2018。同样适用于列 2019_retent。我们可以看到,RISE 在留住香港的初创公司方面做得越来越好,今年有超过 20%的公司再次加入。

按行业

participant retention, by industry

企业软件解决方案金融科技是今年再次参加会议的公司最多的。值得注意的是差旅&招待费的留存率增幅最大(从 2.3%增至 12.1%)。RISE 是一个特别有效的旅游平台吗?

关闭

该数据集包含一些其他有趣的属性,如“电梯推销”和参与创业公司的社交媒体档案的可用性,我去年写了一篇文章,名为《创业公司的文化差异》。而且有了 2 年的数据集,做一些生存分析或者研究参与 RISE 的效果可能会很有意思。我会去看看我那位自愿参加会议的朋友,看看是否有一些我们可以进一步研究的有趣的角度。

附录

Jupyter 笔记本+数据:https://www.kaggle.com/mr5iff/rise-2019-vs-rise-2018

集群风险管理

原文:https://towardsdatascience.com/risk-management-with-clustering-fd594e064806?source=collection_archive---------17-----------------------

如何揭开表面下的结构

更新:我开了一家科技公司。你可以在这里找到更多

E 对每个投资组合经理的夏普比率进行评估,夏普比率衡量其投资回报的相关风险,由以下公式给出:

其中:

  • Rp 是投资组合的回报
  • Rf 是无风险收益(如国债)
  • 适马 p 是投资组合超额收益的标准差,代表投资组合的风险

夏普比率经常受到批评,因为它假设波动性不好,而且因为它的无量纲比率,有时很难解释。

在这篇文章中,我们将看到投资于“好的”夏普比率的风险可能比预期的要大得多。为此,我们将使用 K-Means 聚类来揭示隐藏的结构。

数据

我们将分析大约 50 家机构投资者的季度美国持股情况,这些机构投资者管理的总资产超过 1 亿美元。这些数据是公开的,因为他们需要每季度向 SEC 提交详细说明其持股情况的 13F 表格。我用 Sentieo 的平台下载数据。

Microsoft’s institutional investors and an example of a 13F form

表格详细说明了他们投资的性质和价值,以及他们各自在投资组合中所占的比例。为了简单起见,我们只考虑他们管理的总资产和他们投资的百分比。我们还将提取以下特征来代表他们的投资风格:

  • 他们最大持股的%
  • %的第二、第三、第四和第五次
  • 投资组合剩余部分的%
  • 管理资产总额

我们选择了这些特征来观察基金的规模和他们的配置策略之间是否有关系。分配策略也可以用来代表他们的侵略性。

如果一个经理把所有鸡蛋放在一个篮子里,他们将比使用多个篮子的人承担更多的风险。然而,如果所有的鸡蛋质量都很好,夏普比率就不会增加分散风险。

数据可视化

下载准备好 2018 年 3 季度的数据后,上传到了 AuDaS。 AuDaS 由 Mind Foundry 开发,允许任何人在几分钟内轻松学习机器学习和构建模型。

数据上传后,AuDaS 会扫描数据以发现异常,并向用户发出建议。在这种情况下,它识别出 Name 列没有预测值,我们可以删除它。

数据集中的基金经理是养老基金、自营基金、基础基金和量化基金的组合。直方图视图还允许我们查看资金如何跨功能分布。

使聚集

我们现在将要求 AuDaS 识别我们的基金经理篮子中的集群,结果它自动排除了 name 列。

下面给出了相关的模型和性能结果,我们可以看到 AuDaS 已经识别了 4 个相当清晰的集群。

要了解这些聚类的属性,我们可以返回直方图视图,查看这些类在其他要素中的分布情况。

解释集群

0 类:相当分散的中小型基金

这些基金的前五大持股占其总资产的 10%至 20%,因此被认为相当分散。这类基金的一个例子是 Polar Capital ,它提供基本面驱动的投资产品,在长期内提供差异化的风险调整回报。

第一类:保守的中大型基金

这些基金的前五大持股占其总资产的比例不到 10%,这意味着它们非常分散。这也突显出,规模较大的基金似乎更厌恶风险。直觉上,这可以解释为他们会失去更多,因此需要把鸡蛋放在更多的篮子里。这一类的例子包括 AQR 资本管理、保诚和千禧管理。

第二类:小型激进基金

这些基金的前五大持股占据了其投资组合的至少 20%,在某些情况下甚至高达 50%。由于它们的规模,这些基金必须更有策略才能从投资中获得回报。这一类的例子有兰斯多恩合伙公司、奥迪资产管理公司和埃格顿资本公司,他们以下大赌注而闻名。兰斯多恩的嘉能可赌注在 2017 年事与愿违,让他们损失了 1 亿美元。Odey 在 2018 年 6 月押注英国政府债务相当于该基金资产净值的 147.4%。

第三类:非常激进的小型基金

这些基金甚至比前一类更激进,因为大多数基金的前 5 大持股占据了投资组合的至少 40%。这一类的例子有 Wolverine Trading 和 Jump Trading ,它们都是自营基金。这意味着他们交易的是自己的资本(而不是投资者的资本),这给了他们更多的自由和对投资方式的控制。因此,他们可以随心所欲地咄咄逼人。

结论和延伸

在这个简短的研究中,我们能够从我们的一篮子投资经理中提取出一些清晰的结构,这些投资经理可能隐藏在类似的夏普比率后面。这种结构突出了取决于其规模、类型和性质的基金的进取性。

此外,我们只考虑了一些基本特征,这项研究还有许多潜在的扩展:

  • 基金的流动性考虑的是它们是否能够在需要的时候卖出(也就是说,它们卖出的资产是否会有买家)。将流动性作为一个特征包括在内,可能会揭示哪些基金被困在了龙虾池投资中。
  • 永久资本损失:这可能发生在股票暴跌至 0,或者你借钱亏损的时候。使用杠杆作为一个功能可以突出一些额外的结构。
  • 投资的类型/类别:在本研究中,我们只考虑了前五大投资的规模,但我们也可以考虑它们的类别(科技、工业等)。某些基金可能持有相同的投资组合,尽管比例不同,因此投资者应避免同时投资所有基金。
  • 其他管理特征,如费用、员工数量、在公司的平均工作年限、奖金池等。可能有助于发现对我们的风险分析有益的其他结构层。

如果你有兴趣了解我们的 Quant 和基本面对冲基金客户如何使用澳元进行风险分析和投资管理,请不要犹豫,通过电子邮件或 LinkedIn 联系我。您还可以阅读以下更多案例研究:

[## 机器学习的价值投资

你最喜欢的持有期不一定是永远…

towardsdatascience.com](/value-investing-with-machine-learning-e41867156108) [## 用数据科学充实投资分析师

基本面投资如何受益于机器学习

towardsdatascience.com](/augmenting-investment-analysts-with-data-science-98297cb1ccb0)

团队和资源

Mind Foundry 是牛津大学的一个分支机构,由斯蒂芬·罗伯茨(Stephen Roberts)和迈克尔·奥斯本(Michael Osborne)教授创立,他们在数据分析领域已经工作了 35 年。Mind Foundry 团队由 30 多名世界级的机器学习研究人员和精英软件工程师组成,其中许多人曾是牛津大学的博士后。此外,Mind Foundry 通过其分拆地位,拥有超过 30 名牛津大学机器学习博士的特权。Mind Foundry 是牛津大学的投资组合公司,其投资者包括牛津科学创新、牛津技术与创新基金、、牛津大学创新基金和 Parkwalk Advisors 。

风险建模:随机游走零和博弈中资本优势的力量

原文:https://towardsdatascience.com/risk-modeling-the-power-of-capital-advantage-in-random-walk-zero-sum-games-part-1-619314798d2?source=collection_archive---------36-----------------------

在这篇文章中,我将展示一个至关重要的数学概念,它对于在机会游戏中构建风险管理策略是必不可少的。通过在 R 中使用随机数发生器的实验,我们将探索在模型投资游戏中拥有相对于对手的固定资本优势将如何产生显著的概率优势,从而最终获胜。

我们将把我们的模拟结果与已被证明的数学定理预测的结果进行比较。之后,我们将探索这个概念对赌博、投资和商业的战略意义。

破产风险简介:

破产风险是金融界常用的一个概念。它试图量化投资组合价值归零的可能性。破产风险的原则如下:

  • 在一个无限的样本空间中,在任何事件上赌一个人总启动资金的固定部分,最终都会导致破产,不管每次下注的期望值是正的。
  • 遵循上述标准的每一次连续下注都会增加破产的风险,并产生破产的随机确定性。

有一种可能,你对上述说法持怀疑态度。如果你有一定的概率赢得一个赌注,因此有一个正的期望值,那么反复下注怎么可能会导致你输光所有的钱呢?这正是我们在本系列中将通过对各种玩具游戏的模拟和数据分析来探讨的问题。说到数学,眼见为实。

定义游戏:

  • 假设有两个玩家:玩家 1 和玩家 2
  • 假设 a 是玩家 1 开始时的金额
  • 假设 b 是一个乘数,其中 2 号玩家从(b * a)美元开始

这两个玩家将连续掷硬币。

  • 正面的话,玩家 1 将获得其初始投资的 2%[.02 * a],反面的话,他将损失[. 02 * a]。
  • 在正面,玩家 2 将获得玩家 1 失去的[.02 * a],在反面,他将失去玩家 1 获得的[.02 * a]
  • 如果一个玩家破产了,(失去了所有的钱),那么另一个玩家就赢得了游戏。

我们会让每个玩家投掷无限数量的硬币,直到其中一个坏掉。然后,我们将运行这个游戏数千次,以确定每个玩家赢得游戏的频率。

开始的时候,两个玩家会有相同数量的钱。慢慢地,我们将玩家 2 的资金增加其初始投资的 1%,并观察玩家 2 赢得游戏的概率如何增加,尽管他在每次投掷中缺乏固有优势。

用代码建模问题:

所有代码都可以在这里找到。

如果您不熟悉编程,请跳过这一部分,直接查看结果。

我们将在 r 中定义三个函数。第一个函数将简单地运行一个游戏。函数参数如下:玩家 1 的启动资金、玩家 2 的乘数和样本大小。它将输出一个 3 位向量,代表三种情况:玩家 1 赢,玩家 2 赢,平局(根据惠根的赌徒毁灭定理,不应该有任何平局)。注意:R 从 1 开始索引数组(原因完全超出我的理解)。不要认为我对数组 1:n 的计数很疯狂

###Runs a coin flip simulation and outputs a winner or tie.
# a [double] amount of money in player 1 bankroll
# b [double] multiplier for amount of money in player 2 bankroll
#S [int] Sample size
#w [double] the fraction of a gained when a player wins
#l [double] the fraction of a lost when a player loses
#Outputs: a length 3 vector where a 1 represents a positive result #for a P1 win, P2 win, or Tie respectivelyrunSim <- function(a,b,s,w,l) {
  player1 <- a
  player2 <- a * b
  output <- c(0,0,0)
  for (i in 1:s) {
    coin = sample(0:1,1)
    if (coin == 0) {
      player1 <- player1 - (l * a)
      player2 <- player2 + (w * a)
    } else {
      player1 <- player1 + (w * a)
      player2 <- player2 - (l * a)
    }
    if (player1 <= 0) {
      output[2] <- 1
      output
      break
    } else if (player2 <= 0) {
      output[1] <- 1
      output
      break
    }
  }
  if (player1 != 0 & player2 != 0) {
    output[3] = 1
    output
  }
  output
}

值得注意的是,在每个玩家的获胜条件中包含“中断”声明是至关重要的,因为一旦有人破产,游戏就应该结束。

我们的下一个函数将运行多个游戏,以确定每个玩家在给定的玩家-2 的资金优势下获胜的频率。

##Runs n amount of simulations to determine P1 win $, P2 win$, Tie%, P2% advantage
##n: amount of sims to run
#a: starting money
#s: sample size required for a single game
#swing: how much a player will win or lose based on outcome
#Player2 bankroll edgerunMetaSim <- function(n, a, s, swing, p2Multiplier) {
  results <- c(0,0,0)
  for (i in 1:n) {
    r <- runSim(a,p2Multiplier,s,swing,swing)
    if (r[1] == 1) {
      results[1] <- results[1] + 1
    } else if (r[2] == 1) {
      results[2] <- results[2] + 1
    } else {
      results[3] <- results[3] + 1
    }
  }
  output <- c(results[1]/sum(results),results[2]/sum(results),
              results[3]/sum(results),-1 *(1 - p2Multiplier))
  output
}

我们的最后一个函数将输出每个玩家获胜的频率,记录玩家 2 的资金优势,将玩家 2 的资金增加预定的数量,并运行下一次模拟。该函数将输出一个 4 列数据框,记录聚合模拟的全部结果。

##Runs x amount of Meta-"Simulations"  gradually increasing the bankroll edge of one player by a given amount
#x[int]: amount of simulations to run
#start[double]: starting edge that player 2 has
#increment: a percentage increase for the succesive simulation
#Outputs: A two dimensional Data Frame: Cols[P1 win %, P2 win %, Tie #%, P2$ Advantage]runAggregateSims <- function(x, start, increment, swing,rounds) {
  cols <- c("P1 Win %","P2 Win %", "Tie %","P2 Bankroll Advantage")
  out <- data.frame(matrix(ncol = 4, nrow = 0))

  for (i in 1:x) {
    start <- start + increment
    row <- runMetaSim(rounds,1000,1000000,swing,start)

    out <- rbind(out,row)
    print(paste("Sim ", toString(i), "/", toString(x), " Complete"))
  }
  colnames(out) <- cols
  out

}

下面的代码只是运行模拟并绘制结果

sims <- runAggregateSims(300,1,.01,.02,1000)simsWithPercent <- sims
simsWithPercent$`P2 Bankroll Advantage` <- simsWithPercent$`P2 Bankroll Advantage` * 100
simsWithPercent$`P2 Win %` <- simsWithPercent$`P2 Win %` * 100
simsWithPercent$`P1 Win %` <- simsWithPercent$`P1 Win %` * 100qplot(simsWithPercent$`P2 Bankroll Advantage`,simsWithPercent$`P2 Win %`,xlab = "Player 2 Bankroll Advantage %",ylab = "Player 2 Win Likelihood %",
      main = "Probability Player 2 Wins")qplot(simsWithPercent$`P2 Bankroll Advantage`,simsWithPercent$`P1 Win %`,xlab = "Player 2 Bankroll Advantage %",ylab = "Player 1 Win Likelihood %",
      main = "Probability Player 1 Wins")

结果:

  • 一场掷硬币游戏的样本空间被限制在一百万次
  • 在玩家 2 的每个资金优势级别运行 1000 场游戏,以确定他获胜的可能性
  • 玩家 2 的胜率是在 1%到 300%的资金优势范围内确定的。

图 1 显示了玩家 2 在不同资金优势水平下获胜的概率分布,占玩家 1 启动资金的百分比。我们可以观察到图表遵循对数增长率。玩家 2 的优势在开始时增长得非常快,并且随着他的资金在每次迭代中增加 1%而逐渐减少。

当参与人 2 的资本比参与人 1 多 300%时,他有超过 80%的机会比对手活得久。

Figure 1

Figure 2

上面的图 2 简单地显示了参与人 1 的反向分布。随着玩家 2 的资金优势增加,玩家 1 赢得掷硬币游戏的可能性逐渐减少,他破产的风险也随之增加。

形式化:

研究我们自己的数据是公平的,但是让我们看看这个分布是否遵循克里斯蒂安·惠更斯‘赌徒的毁灭’定理提出的公式。

我们将从 Huygen 最初的抛硬币问题中推导出他的公式,以适合我们自己的游戏版本。回想一下文章开头我们定义变量的地方。

Figure 3: Probability of Player 1 going broke

Figure 4: Probability of Player 2 going broke

上面的公式分别代表了参与人 1 和 2 的破产风险。利用这些信息,我们可以得出任何一个玩家获胜的概率,也就是另一个玩家破产的可能性除以玩家 1 或玩家 2 破产的可能性。

Figure 5: Probability of Player 1 winning

Figure 6: Probability of Player 2 winning

我们现在将重写我们的 runAggregateSims() 函数,以便根据我们的原始参数简单地绘制上述函数及其值的数据框。

##Runs the aggregate sims using the Huygen's TheoromrunAggregateSims2 <- function(x,increment,swing,a,b) {
  cols <- c("P1 Win %","P2 Win %", "Tie %","P2 Bankroll Advantage")
  out <- data.frame(matrix(ncol = 4, nrow = 0))

  for (i in 1:x) {
    b <-  b + increment
    p1 <- (a/.02*a)/(((b*a)/.02*a) + (a/(0.2*a)))
    p2 <- ((b*a)/.02*a)/(((b*a)/.02*a) + (a/(0.2*a)))

    p1winrate <- p1/(p1 + p2)
    p2winrate <- p2/(p1 + p2)

    row <- c(p1winrate,p2winrate,0,-1 * (1 - b))
    out <- rbind(out,row)
    print(paste("Sim ", toString(i), "/", toString(x), " Complete"))
  }
  colnames(out) <- cols
  out
}##Running Huygen's Formula
huygensFormula <- runAggregateSims2(300,1,.01,.02,1000,1)
huygensFormulaPercent <- huygensFormula * 100###Stacking Huygen's Formula onto The Simulation Graph
###Sorry, R is the ugliest language in the world when it comes
#To using third party librariesa <- ggplot() + geom_point(data = simsWithPercent,aes(x= simsWithPercent$`P2 Bankroll Advantage`, y = simsWithPercent$`P2 Win %`),color = "yellow") + xlab("P2 % Bankroll Advantage") + ylab("Player 2 % Win Likelihood") +
geom_line(data = huygensFormulaPercent, aes(x = huygensFormulaPercent$`P2 Bankroll Advantage`,y=huygensFormulaPercent$`P2 Win %`),color = "blue") + ggtitle("Player 2 Winning Distribution: Huygen's Formula vs Simulation")a 

下图 7 显示了从惠更斯公式推导出的概率密度函数得出的曲线。

Figure 7: Plot of Huygen’s Formula

将概率密度函数绘制在与我们的模拟结果相同的图表上,我们可以看到来自模拟的数据几乎完全符合从定理导出的公式。

Figure 8: Huygen’s Formula over Simulation

结论:

如果两个人反复玩公平机会赌博游戏,我们可以假设如下:

  • 根据破产风险理论,有人肯定会破产
  • 尽管在单个回合中没有任何特别的优势,但拥有更多钱的人在赢得整个游戏方面具有统计优势。
  • 在一个公平的赌博游戏中,拥有比对手更多的钱的统计优势可以被可靠而准确地量化。
  • 如果你想赢一场和你朋友的反复掷硬币游戏,只需下注更多的钱。

业务应用:

  • 在亏损时期,避免破产的唯一方法是降低风险,将其作为你全部资金的一部分,同时在盈利时期增加风险。这样,从长远来看,你的收益将足以抵消可变成本和损失。
  • 留出大量资金(自由流动的流动现金)的唯一目的是减少经济和金融变化,这提供了直接可量化的竞争优势,并增加了生存的机会。
  • 简单地说,有很多钱会让你更容易…获得更多的钱。事实上,你甚至不需要做出特别明智的选择来决定如何拿这笔钱去冒险。只要你确定你是在与资金较少的竞争对手进行零和游戏中冒险。
  • 如果你在资金上处于劣势,你需要一个巨大的概率优势来弥补不能去方差。这个概念将在以后的文章中探讨。

未完待续:

在下一篇文章中,我将探讨不公平游戏中同样的现象。我们将会看到概率优势是否能克服资金劣势,或者在零和游戏中,仅仅比对手拥有更多的钱就能胜出。

对监督学习问题应用主成分分析的风险和注意事项

原文:https://towardsdatascience.com/risks-and-caution-on-applying-pca-for-supervised-learning-problems-d7fac7820ec3?source=collection_archive---------14-----------------------

合著者:阿姆兰·乔蒂·达斯,赛·亚斯旺思

Reference

高维空间及其诅咒

在处理通常为高维数据的真实数据集时,维数灾难是一个非常关键的问题。随着特征空间维度的增加,配置的数量可以指数增长,因此观察覆盖的配置的数量减少。

在这种情况下,主成分分析在有效地减少数据的维度,同时尽可能多地保留数据集中存在的变化方面起着主要作用。

在深入实际问题之前,我们先对主成分分析做一个非常简单的介绍。

主成分分析-定义

P 主成分分析(PCA) 的中心思想是降低由大量相关变量组成的数据集的维度,同时保留数据集中存在的最大可能变化。

让我们定义一个对称矩阵 A,

其中 X 是独立变量的 m×n 矩阵,m 是列数,n 是数据点数。矩阵 A 可以分解成以下形式

其中 D 是对角矩阵,E 是按列排列的 A 的特征向量矩阵。

x 的主成分(PCs)是 XX 的特征向量,这表明特征向量/主成分的方向取决于独立变量(x)的变化。

为什么盲目应用 PCA 是监督问题中的魔咒????

在回归中使用主成分分析在文献中受到了很多关注,并且作为处理多重共线性的方法被广泛使用。

但是随着主成分回归的使用,关于主成分和它们各自的重要性顺序对反应变量的解释能力有许多误解。

在各种论文和书籍中多次出现的常见谬误是,在受监督的主成分回归框架中,具有低特征值的独立变量的主成分在解释响应变量时不起任何作用,这将我们带到本博客的目的,即在解释响应变量时,证明具有低特征值的成分可能与具有较大特征值的主成分一样重要,甚至重要得多。

下面列出了中指出的一些例子

[1]. Mansfield 等人(1977 年,第 38 页)提出,如果仅删除方差较小的成分,则回归中的预测性损失非常小。

[2].在 Gunst 和 Mason (1980) 的书中,12 页致力于主成分回归,并且大多数讨论假设删除主成分仅仅基于它们的方差。(第 327-328 页)。

[3]. Mosteller 和 Tukey(1977 年,第 397-398 页)类似地认为,方差小的成分在回归中不太可能是重要的,显然是基于自然是“狡猾的”而不是“完全平均的”。

[4]. Hocking(1976 年,第 31 页)更坚定地定义了在基于方差的回归中保留主成分的规则。

理论解释和理解

首先,让我们给你一个上述假设的适当的数学证明,然后我们可以用几何可视化和模拟来解释直觉。

比方说

Y —响应变量

X —设计矩阵—特征空间矩阵

z——X 的标准化版本

让𝜆₁≥𝜆₂>….≥ 𝜆p 是 Z Z(相关矩阵)的特征值,v 是相应的特征向量,那么在 W = ZV 中,w 中的列将代表 z 的主分量。在主分量回归中执行的标准方法是回归 y 上的前 m 个 PC,该问题可以通过下面的定理及其解释[2]看出。

定理:

设 W= (W₁,…,Wp)是 x 的 PCs。现在考虑回归模型

如果回归系数的真实向量 𝛽 是在 z 的 j ᵗʰ 特征向量 Z 的方向上,那么当 y 在 w 上回归时,j ᵗʰ PC Wⱼ将独自对拟合贡献一切,而其余 PC 将什么都不贡献。

证明: 设 V=(V₁,…,Vp)是包含 z 的特征向量的矩阵 Z .那么

如果 𝛽 在 j ᵗʰ 特征向量 Vⱼ的方向,那么 Vⱼ = a𝛽 ,其中 a 是非零标量。因此 𝜃j = Vⱼᵀ𝛽 = a𝛽ᵀ𝛽,𝜃ᴋ = Vᴋᵀ𝛽 = 0 ,每当 k≠j 。因此, 𝜃ᴋ 对应 Wᴋ 的回归系数等于零,对于 k≠j,因此

因为,变量 Wᴋ 不产生平方和的任何减少当且仅当它的回归系数为零时,那么 Wj 将独自贡献所有来拟合,而剩余的 PC 将不贡献任何东西。

几何意义和模拟

让我们现在做模拟,并有数学直觉的几何理解。已经使用二维特征空间(X)和单个响应变量的模拟说明了该解释,使得直观地理解假设变得容易。

Figure 1 : Univariate and Bivariate plots for simulated variable X1 and X2

在模拟的第一步中,设计特征空间已经从变量之间具有非常高相关性的多元正态分布中模拟出来,并且实现了 PCA。

Figure 2 : Correlation heat-map for PC1 and PC2

从图中可以清楚地看出,电脑之间绝对没有关联。第二步是模拟响应变量 Y 的值,使得 PCs 上 Y 系数的方向是第二主分量的方向。

一旦响应变量被模拟,相关矩阵看起来就像这样。

Figure 3 : Correlation heat-map for simulated variable Y and PC1 and PC2

从图中可以清楚地看出,y 和 PC2 而不是 PC1 之间有很高的相关性,这证明了我们的假设。

Figure 4 : Variance in Feature Space explained by PC1 and PC2

如图所示,PC1 解释了 X 中 95%的方差,因此,如果按照上面的逻辑,我们应该在进行回归时完全忽略 PC2。

让我们跟随它,看看会发生什么!!!

Figure 5: Regression Summary with Y and PC1

因此,R 为 0 表明,即使 PC1 解释了 X 中 95%的变化,仍然无法解释响应变量。

现在让我们用 PC2 做同样的事情,它只能解释 X 的 5%的变化,看看会发生什么!!!!

Figure 6: Regression Summary with Y and PC2

呼呼!!!!你一定在想刚刚发生了什么,主成分解释了 X 中大约 5%的变化,解释了 Y 中 72%的变化。

也有一些真实生活场景来验证中指出的假设

【1】Smith 和 Campbell (1980) 举了一个化学工程的例子,其中有九个回归变量,当第八个主成分的可变性占总变差的 0.06%时,根据低变差标准,该总变差将被去除。

【2】。Kung 和 Sharif(1980 年)提供了第二个例子。在用十个气象变量预测季风爆发日期的研究中,显著主成分依次为第八、第二和第十。它表明,即使是具有最低特征值的主成分在解释响应变量的可变性方面也是第三重要的。

结论:上述例子表明,去除低特征值的主成分是不可取的,因为它们只表明特征空间中的可解释性,而不表明响应变量中的可解释性。因此,我们应该保留所有组件并进行监督学习,否则我们应该采用监督降维方法,如偏最小二乘回归、最小角度回归,我们将在即将到来的博客中解释这些方法。

参考资料:

[1]伊恩·t·乔利弗,“关于主成分在回归分析中的应用的说明”皇家统计学会杂志。C 系列(应用统计学),第 31 卷,第 3 号,1982 年,第 300-303 页。www.jstor.org/stable/2348005.·JSTOR

[2]哈迪、阿里·s 和罗伯特·f·林。"关于使用主成分回归的一些注意事项."《美国统计学家》,第 52 卷,第 1 期,1998 年,第 15-19 页。www.jstor.org/stable/2685559.·JSTOR

[3]霍金斯博士(1973 年)。主成分分析在替代回归研究中的应用。应用统计学家。, 22, 275–286

[4]曼斯菲尔德、韦伯斯特、J. T .和冈斯特,R. F. (1977 年)。主成分回归的分析变量选择技术。应用统计学家。, 26, 34–40.

[5]f . MOSTELLER 和 j . w . TUKEY(1977 年)。数据分析和回归:统计学第二教程。读书,弥撒。:艾迪森-韦斯利

6 GUNST,R. F .和 MASON,R. L. (1980)。回归分析及其应用:一种面向数据的方法。纽约:马塞尔·德克尔。

7 杰弗斯,J. N. R. (1967 年)。主成分分析应用中的两个案例。应用统计学家。, 16, 225- 236.(1981).替代回归调查:一些实例。统计学家,30,79-88 岁。

[8]肯德尔博士(1957 年)。多元分析教程。伦敦:格里芬。

如果您有任何想法、意见或问题,请在下面留下评论或在 LinkedIn 上联系我们

[## Souradip Chakraborty -数据科学家-沃尔玛印度实验室| LinkedIn

查看 Souradip Chakraborty 在全球最大的职业社区 LinkedIn 上的个人资料。

www.linkedin.com](https://www.linkedin.com/in/souradip-chakraborty/) [## Amlan Jyoti Das -沃尔玛实验室高级数据科学家| LinkedIn

经验丰富的数据科学家,有在零售行业解决业务问题和…

www.linkedin.com](https://www.linkedin.com/in/amlanjd/) [## Sai Yaswanth -沃尔玛印度实验室高级数据科学家| LinkedIn

查看世界上最大的职业社区 LinkedIn 上 Sai Yaswanth 的个人资料。

www.linkedin.com](https://www.linkedin.com/in/sai-yaswanth-86893959/)

敬请关注。快乐阅读!!!😃

[RL]训练机械臂去够球—第 1 部分

原文:https://towardsdatascience.com/rl-train-the-robotic-arm-to-reach-a-ball-part-01-1cecd2e1cfb8?source=collection_archive---------18-----------------------

Photo by James Pond on Unsplash

比较 DDPG、D4PG 和 A2C 的学习效率

1.摘要

1.1 激励机制

看到我们如何利用强化学习的力量,训练机器人通过自我试验和错误来学习如何与环境互动,总是令人着迷。在这个任务中,我将实验和比较强化学习中不同流行算法的效率。这不仅有助于我们对这些算法有一个总体的了解,而且也让我们进一步相信强化学习在不久的将来会有多大的潜力。

为了恰当地处理这个话题,整个讨论将分为两个系列。本文是第一部分,主要介绍训练环境和一种学习算法——DDPG,这是最古老的方法。

1.2 培训环境

在强化学习领域,组件由一个环境、一个或多个代理两者之间交换的信息组成。首先,环境将当前情况的信息发送给代理,然后代理以其最好的可能方式作出响应,再次,环境将奖励和下一个情况的信息发送给代理,以此类推。

在这里,为了给代理创建一个游乐场,我将使用 Unity 开发并由 Udacity 修改的环境[ Reacher ]进行实验。省去了我们搭建环境和配置奖励机制的麻烦。当我们刚刚开始熟悉这个领域时,这使我们能够专注于实现、调整和比较 RL 算法。

Reacher 任务中,机械臂需要学习如何控制和移动一个球。它粘球控制球的时间越长,积累的奖励就越多。环境的观测状态由 33 个变量组成,并且都在连续空间中。

关于机械臂,有两种情况,一种是单个机器人代理,另一种是多个机器人代理,总共有 20 个代理,每个代理都有自己的环境副本。因为我们现在有了单个和多个代理的场景,所以我们可以探索和比较两者之间的学习效率。

每个代理有 4 个动作变量,都在-1 和 1 之间的连续空间内。此外,单代理和多代理环境都可以在[uda city Github]中下载。

1.3 实验的模型/算法

在单代理情况下,使用[【DDPG】]和[ 分布式确定性策略梯度(D4PG) ]的算法。当在单个代理上训练时,最大的问题之一是过渡状态/经历的顺序将是相关的,因此像 DDPG/D4PG 这样的非策略将更适合这种情况。在这些模型中,对重放存储器进行采样的做法打破了转换之间的相关性。

在多个代理的情况下,使用[ 【同步优势演员评论家(A2C) 】。A2C 是[ A3C 的同步版。A2C 更容易实现,在一些研究中,它的性能甚至优于 A3C。在对多个智能体进行训练的情况下,由于每个智能体都有其独特的过渡经验,集体的过渡经验自然会解决顺序关联的问题。此外,我们甚至可以享受基于策略的学习算法带来的训练稳定性。

1.4 快速总结

那么,这个任务的目标是什么呢?在任务中,如果代理人的手臂在目标位置,那么给予+0.1 的奖励。代理能够将手臂保持在目标位置的时间越长,累积的奖励就越多。为了完成任务,代理人需要平均每集获得 30 英镑以上的奖励。

从后面显示的结果中,我们可以清楚地看出 A2C 在训练速度方面明显优于其他两种算法,这并不奇怪,尽管如此,这种改进确实令人印象深刻。具体来说,在这个案例中,A2C 成功地训练代理人在不到 5 00 的训练集内积累超过 30 的奖励(目标奖励)。而 D4PG 需要大约 5000 集,DDPG 甚至无论花多少时间训练经纪人都无法完成任务。

下面是这篇文章结构的快速指南。

1.5 报告的结构

  • 1 . 5 . 1智能体如何与环境交互
    在本节中,我将显示如何使智能体与环境交互的代码(假设在单智能体场景中),向环境发送其动作值,并从环境接收奖励和下一次观察状态的反馈。
  • 1 . 5 . 2在单个智能体场景上训练— DDPG
    在单个智能体的情况下,我将对两个算法进行实验— DDPG 和 D4PG。这一部分将详细演示 DDPG 模型是如何逐步建立起来的,包括演员和评论家的网络结构、重放记忆的设置、动作探索和损失函数等。最后,对训练结果进行了讨论。

2.代理如何与环境交互

︽ 在这里,我将简单介绍一下 Unity 环境的样子,以及代理如何用代码与环境交互。

2.1 环境背景

注意到环境包含多个大脑。大脑根据接收到的动作输入来控制环境的反应。用不同的大脑指定环境,会产生不同的反馈。在这个任务中,使用默认的大脑(第一个)。

**env:**包含每个大脑的环境对象。它包括,

  • brain_name = env.brain_names[0]:默认使用 env brain。
  • env.brains[brain_name].vector_action_space_size:行动的维度。
  • env[brain_name].agents:内部代理数量信息。
  • env[brain_name].vector_observations:维数(代理数,观察状态数)。

Code — Activate the Environment

Preview of the Environment (Single Agent)

2.2 代理与环境交互

对于每个新的情节,环境需要是reset() 并因此给出初始观察状态。然后,代理通过act()对其从环境接收的状态做出响应。环境使用step()接收来自代理的当前动作,并用新状态奖励完成(一集结束的标记)更新自身。

既然我们已经了解了所有必需的背景知识,我们就可以开始建模了。

Code — Agent Interact with Environment

3.在单个代理场景下训练——DDPG

3.1 DDPG

︽ 首先,我在训练开始前导入一些自定义模块来配置整个设置。模块包括:

  1. ddpg_model:包含 DDPG 演员和评论家神经网络结构类的模块文件。
  2. noise:奥恩斯坦-乌伦贝克噪声过程用于 DDPG 代理的勘探目的。
  3. replay_memory:在训练中收集和取样进行过渡的经验。
  4. ddpg_agent:定义 DDPG 代理如何与环境交互并实施培训的模块文件。

下面是一系列代码片段,突出了每个自定义模块中最重要的部分。它帮助我们快速了解每个模块的核心。

3.2 模型结构

网络的大部分结构遵循了最初[[DDGP 论文 T10 中实现的内容,脚本的主要部分参考了uda city 的 DDPG 模板 T12。

值得注意的一点是,critic 网络在计算 Q 值时采用了最后一个隐含层的动作。

但是,为了提高计算效率,在这种情况下需要调整一些超参数。例如,演员和评论家网络都包含两个隐藏层(每个具有 12864 单位的大小)。下面显示的代码是 Critic Network 的初始化。

演员网络共享相似的结构。

Code — Initialize DDPG Critic Network (excerpted)

3.3 重量初始化

在初始化时,评论家和演员网络的权重都采用x 服务器初始化

Function — Xavier Weights Initialization

3.3 重放记忆

这里,为了减轻计算压力,重放存储器的大小仅设置为 100,000 。回放内存在均匀随机采样中采样,并发送给【cuda 或 cpu 训练模型。

Code — Create Replay Memory Object

3.4 行动探索

奥恩斯坦-乌伦贝克噪声被添加到动作探索的动作值中。

Code — Action Exploration of DDPG Agent

3.5 损失函数

确定性政策梯度不同于随机政策梯度,因为它不包括行动的对数概率。

也就是说,策略(参与者)梯度是批评家网络相对于动作的梯度,乘以参与者网络相对于网络参数的梯度。在这篇[ 帖子中阅读更多详情。

另一方面,批评值的损失只是常规的时间差异(TD)误差。因此,保单损失和批评价值损失定义为:

Code — Compute Loss for Critic and Actor for DDPG Agent

3.6 重量更新

在训练过程中,模型中的权重被软更新

Code — Implement Soft-Updated for Network Parameters

3.7 简而言之,超参数

以下是超参数设置的概述。

  • 学习率(演员/评论家):1e-4
  • 重量衰减:1e-2 # L2 重量衰减
  • 批量:64
  • 缓冲区大小:100000
  • Gamma: 0.99 #奖励折扣系数
  • Tau: 1e-3 #目标网络中参数的软更新
  • 每次重复学习:10
  • 每时间步发生的学习:20
  • 评论家剪辑的最大渐变:1
  • 隐藏层 1 尺寸:128
  • 隐藏层 2 尺寸:64

3.8 构建培训功能

在本节中,我定义了一个训练函数train_ddpg()来监控进度,并在训练完成后保存模型。

Function — Control and Monitor the Training Progress

3.9 培训结果—失败

在实验中,我设置了在每个 20 时间点触发的训练。在每次训练期间,权重更新将迭代 10 次。

另外,临界梯度被削波,最大值为 1,以增强训练的稳定性。正如你将在下面看到的,在第一个 1000 集(如下图所示)中,情节奖励徘徊在 0.040.05 左右,这很大程度上意味着代理根本没有从这些经历中学到任何东西。

除了这里展示的演示实验,我还尝试了不同的训练长度,跨度从 1000 到 5000 集,但没有一次成功。

Average Episodic Score for DDPG Agent (task not solved)

待续

现在我们已经看到 DDPG 不能理解任务的复杂性。所以在下一部分,我将转向其他算法——D4PG 和 A2C,看看这些新发布的方法是否更强大,是否能够解决手头的任务。

文章中的完整代码可以在这个链接中找到。此外,如果你喜欢这个帖子,欢迎指出我犯的任何错误或在评论框中留下反馈。

参考

[1] Unity Technologies, ml-agents (2018),Github

[2] Udacity,深度强化学习 (2018),Github

[3] P. Emami,tensor flow 中的深度确定性策略梯度 (2016),Github

[RL]训练机械臂去够球—第 2 部分

原文:https://towardsdatascience.com/rl-train-the-robotic-arm-to-reach-a-ball-part-02-fc8822ace1d8?source=collection_archive---------24-----------------------

Photo by James Pond on Unsplash

比较 DDPG、D4PG 和 A2C 的学习效率

概述

根据我在第 1 部分提到的,我们知道无论代理花多少时间学习,DDPG 都不能成功地解决任务。平均的阶段性回报徘徊在 0.04 到 0.05 之间,与 30 的目标回报相差甚远。因此,下面,我将开始试验另外两种算法,单代理场景中的 D4PG 和多代理场景中的 A2C。

同样,下面是本文结构的快速指南。

1.报告的结构

  • 1.1 列车上单个代理场景—D4PG这次,我将改为在 D4PG 代理上进行实验。这是最新发布的算法,据称在应对复杂环境时比 DDPG 更有效。本节将介绍模型结构、回放记忆、行动探索和学习过程的步骤。它将突出与 DDPG 的区别,相似的部分将被快速浏览。
  • 1.2多智能体场景——A2CA2C 模型在多智能体环境下实现。这一部分将涵盖它是如何建立的,在这个过程中收集经验和学习。A2C 的代码与 DDPG 和 D4PG 的代码相当不同,因为它应该反映 A2C 如何使用多代理来收集经验和更新网络参数。还是那句话,训练结果是包含在最后的。
  • 1.3所有算法的比较及结论最后,我们准备比较三种不同算法的执行情况。每个模型的滚动情景奖励将绘制在同一个图表上,这样我们可以更好地了解每个模型的学习趋势和效率。

2.针对单个代理场景的培训— D4PG

︽ 正如我们在第 01 部分中所知,DDPG 模型并没有成功解决该任务,所以我转向另一种算法— [ D4PG ],这是 2018 年最新的 RL 算法。代码脚本主要参考了这本书——【深度强化——学习——动手】。

首先我会在训练前导入一些自定义模块来配置整个设置。这些模块包括:

  1. d4pg_model:包含 D4PG 的演员和评论家神经网络结构类的模块文件。
  2. replay_memory:为培训收集过渡经验并取样。
  3. d4pg_agent:定义 D4PG 代理如何与环境交互并实施培训流程的模块文件。

2.1 模型结构

我跟进 DDPG 指定的相同模型结构,除了评论家网络,输出需要改成 N_ATOMS 。至于其他,评论家和演员都有两个隐藏层,每个层的尺寸为 128 和 64,与 DDPG 相同。

Code — Critic Network for D4PG (excerpted)

2.2 重放记忆

为了符合 D4PG 代理中所需的数据类型(从[ 深度强化学习实践 ]中引用),通过重放存储器对象中定义的函数sample2()进行采样。重播内存大小设置为 100,000。详细的代码片段在这个[ 链接 ]里。

2.3 行动探索

D4PG 和 DDPG 的一个小区别是动作探索。在 D4PG 中,它使用来自正态分布的简单随机噪声作为鼓励动作探索的方式,而不是 OU 噪声。修改后的代码片段在这个[ 链接 ]中。

2.4 损失函数

D4PG 可以在多个过渡轨迹(N 步)上训练,但为了简单起见,我选择在一个时间步上训练。不过根据其他评论,一步到位的训练是最不稳定的,不推荐,但我还是去争取了。因此,下面的损失和代理学习代码是基于一步转换轨迹的。

Code — Loss Computation and Learning Process in D4PG Agent (excerpted)

2.5 重量更新

权重由soft_updated()软更新,与 DDPG 相同。

2.6 简而言之,超参数

以下是超参数设置的概述。

  • 学习率(演员/评论家):1e-4
  • 批量:64
  • 缓冲区大小:100000
  • 伽玛:0.99
  • 陶:1e-3
  • 每次重复学习:10
  • 每时间步发生的学习:150
  • 评论家剪辑的最大渐变:1
  • n 步:1 #过渡轨迹
  • n 原子:51 #用于评论家网络输出
  • Vmax:评论家网络的 10 #参数
  • Vmin: -评论家网络的 10 #参数
  • 隐藏层 1 尺寸:128
  • 隐藏层 2 尺寸:64

2.7 构建培训功能

为了监控训练进度,我再次定义了一个训练函数train_d4pg(),它与train_ddpg()非常相似,参见这个链接中的完整代码片段。

2.8 培训结果——效率低下

由于之前在 DDPG 的失败,这一次,我稍微降低了学习频率。每 150 时间步触发一次训练过程,每次训练重复10 次权重更新。

我希望这将进一步稳定培训,尽管代理可能需要更长的时间来学习。以下结果显示,D4PG 代理成功达到了 30 的目标剧集分数,尽管如此,在达到目标之前,它需要占用多达 5000 集。我们可以看出学习进度相当缓慢。

下图是 D4PG 剧集的滚动平均得分。观察结果图,我们可以看出片段分数彼此之间有很大的差异。显然,训练进度并不稳定,这准确地反映了非策略算法的性质。

Rolling Episodic Score over Episodes (D4PG)

现在,让我们来看看它在动画中的表现。

A Single D4PG Agent Controls a Ball (final training result)

3.多代理场景培训— A2C

︽ 用于建立 A2C 模型的模块/功能如下:

  1. A2CModel:神经网络的 A2C 强化学习算法。
  2. collect_trajectories():收集 n 步经验转场。
  3. learn():根据收集的轨迹计算训练损失,并更新网络的权重。

3.1 环境的简要背景

这一次,我使用另一个环境,它将同时激活 20 个代理,每个代理都有自己的环境副本。这 20 名代理人的经验将被收集起来并相互分享。

Preview of the Environment (Multi-Agents)

3.2 模型结构

该模型是简单的两个全连接层,每层有 128 个单元, 64 个单元。

然后它分离出演员评论家 (而不是像以前的模式那样的演员和评论家网络)。演员和评论家层都使用全连接层,它遵循[ 原始 A3C 算法论文 ]中实现的方式。

Code — Initialize A2C Model (excerpted)

3.3 收集现场过渡轨迹

A2C 是一个 on-policy RL 算法,没有重放记忆这种东西。相反,它使用当前收集的转换经验来更新其网络。

在接下来的代码片段中,我定义了collect_trajectories()函数。接受 A2C 模型整体环境采集的时间步数的输入。当模型与环境交互时,所有的动作和反馈都存储在batch_sbatch_abatch_r等对象中,分别代表状态、动作、奖励。一旦收集到的经验达到要求的时步数,或者当一集结束时,该函数就会对每步的奖励进行奖励归一化和折扣处理,得出每个时步的最终目标值/处理后的奖励并存储在batch_v_t对象中。

Function — Used to Collect Trajectories for A2C Model Training

3.4 行动探索

动作是从正态分布中采样的,其中 μ 取决于每个状态,而 σ 由自变量给出。此外,动作输出通过tanh() 激活,以便根据环境要求将其值压缩在-1 和 1 之间。

此外,为了检索以后行动的对数概率,我使用了一个技巧。我定义函数get_action()来返回 actions_tanh原始动作值。原始动作值存储在batch_a中。然后,在学习阶段,它们将与状态一起被传递到get_action_prob(batch_s, batch_a),以获得动作的相应对数概率。

关于批判状态值,它只是传递给批判层的状态输出。

Code — Action Output and Critic State Value for A2C Model (excerpted)

3.5 损失函数

损失函数在 A2C 也被称为目标函数

注意,原始损失函数包括熵项。熵在许多算法中用于鼓励动作探索,包括 A2C 模型。然而,我在策略损失中放弃了熵,这与大多数其他实现相反。原因是我现在处理的是一个多维度的行动空间。我不知道如何指定多维作用空间的熵。

相反,我参考了[ 尚同章的作品 ],其中他假设(鼓励行动探索的方差)是常数,因此熵在所有情况下也是常数。这样,我可以忽略掉政策损失的熵。

关于价值损失函数,它也是保单损失的一部分。这导致我的保单损失和价值损失如下:

现在,我在自定义函数learn()中总结了损耗的计算和网络参数的更新。你可能会注意到,我在这里为学习过程构建代码的方式与以前的模型中的方式有很大不同。它是一个独立的函数,而不是属于代理的子类对象。

Function — Compute Loss and Trigger Learning for A2C Model

3.6 重量更新

在 A2C 模型中,所有权重由当前轨迹批次的梯度直接更新,这意味着这里没有应用软更新。

3.7 简而言之,超参数

以下是超参数设置的概述。

  • 学习集数:1000
  • N 步数:10 # n 步过渡轨迹
  • 学习率:0.00015
  • 伽玛:0.99

3.8 构建培训流程

在这一节中,我不会特别将培训过程总结成一个函数。在这里链接的代码中,会直接监控学习进度,训练结束后保存模型。

3.9 培训结果——高效率

在培训期间,一旦代理收集到新的一批 N 步过渡经验,该批经验将用于计算损失并立即更新演员和评论家层的参数。请注意,如果代理的情节都没有完成,则每批的最后一个状态将是下一批的初始状态。相反,如果任何一集结束,那么所有代理将停止并从当前集离开,并继续重新开始新的一集。

从下面显示的结果,你可以告诉 A2C 模型是非常有效的。代理人学习接任务,并在不到 1000 集的中达到 30 分的目标情节分数。另外,无论是在学习过程中还是在从头开始重新训练的情况下,训练进度都相当一致和稳定。每当你再次重新训练代理人时,你可以得到几乎相同的结果。****

Average Episodic Score for A2C Agents

从滚动分数图中观察,我们进一步确信学习进展相当顺利。偏差或波动远远小于 D4PG 模型中的偏差或波动,最后,最后一张图片是训练结果的动画。

Rolling Episodic Score over Episodes (A2C)

Multiple A2C Agents Control a Ball (final training result)

4.所有算法的比较和结论

︽ 在这些试验中,A2C 模型达到了最好的性能和效率,即使在此之上,再训练结果仍然非常一致,但鉴于这是多代理场景并使用 10 步过渡轨迹的事实,结果应该不会太令人惊讶。

另一方面,D4PG 是单代理场景,我只使用了 1 步过渡轨迹。虽然它没有 A2C 那么有效,但它仍然给出了一个令人满意的结果。然而,重新训练的结果并不一致,你可能会发现你的代理在某些试验中陷入局部最优。以我为例,需要 5000 集才能达到目标分数。尽管如此,我的触发参数更新的设置是每 150 个时间戳,也许我可以增加更新频率以提高其效率。然而,这种方式我会冒着牺牲已经不稳定的稳定性的风险。从根本上说,这是一个效率和稳定性之间的权衡问题。

最后一个是 DDPG。好吧,在这个任务中是行不通的。前一篇文章中演示的训练结果使用了 1000 集,但是我在其他训练长度上进行了实验,达到了 5000 集。他们中没有一个人成功地解决了这个问题。也许任务真的很复杂,其中观察状态包含 33 个变量,而代理有 4 个动作变量。看起来 DDPG 在处理如此复杂的问题上效率不够高。

Learning Progress Compared on all Algorithms — DDPG, D4PG and A2C

在我关于如何进一步改进整个实验的最后思考中,我可能会尝试使用 Python 的多处理模块重写代码,这将使算法能够应用于并行环境。这是强化学习的一个趋势,值得一试。此外,我可能会尝试看看我是否可以重新编码 D4PG,以便在未来进行多步轨迹训练。这样可以提高 D4PG 模型的稳定性。

如果你喜欢这个帖子,欢迎指出我犯的任何错误,或者在评论框中留下任何反馈。代码和 jupyter notebook 的完整实现可以在这个[ 链接中找到。

参考

[1] M. Lapan,动手深度强化学习 (2018),Github

[2] S. Zhang,py torch 中深度 RL 算法的模块化实现 (2018),Github

[3] M .周,利用 PyTorch 简单实现强化学习(A3C)(2018),Github

[4] Hungryof, 模型中 buffer 的使用 (2018), CSDN

RLCard:用 3 个步骤构建你自己的扑克人工智能

原文:https://towardsdatascience.com/rlcard-building-your-own-poker-ai-in-3-steps-398aa864a0db?source=collection_archive---------10-----------------------

介绍纸牌游戏中强化学习的工具包

https://github.com/datamllab/rlcard

由于强化学习的进步,人工智能(AI)在游戏中取得了令人鼓舞的进展。举几个例子,AlphaGo 在围棋比赛中击败了人类职业选手。alpha zero【2】在国际象棋、shogi、围棋等游戏中从零开始自学,成为艺术大师。近年来,研究人员的努力在扑克游戏中取得了成果,如Libra tus【3】和deep stack【4】,在德州扑克中取得了专家级的表现。扑克是人工智能中最具挑战性的游戏之一。作为一名玩家,我们不仅需要考虑自己的手牌,还需要考虑其他玩家隐藏在我们视线之外的手牌。这导致了可能性的爆炸。

在本文中,我将介绍一个用于纸牌游戏中强化学习的开源项目,该项目最近由德克萨斯州 A & M 大学的数据实验室开发。本文将首先概述该项目,然后提供一个如何从头开始训练代理人玩 Leduc Hold'em poker(德州扑克的简化版本)的运行示例。该项目的目标是让每个人都能接触到扑克游戏中的人工智能。

概观

[5] An overview of RLCard. Each game is wrapped by an Env (Environment) class with easy-to-use interfaces.

RLCard 提供了各种纸牌环境,包括 21 点、Leduc Hold'em、德克萨斯扑克、UNO、斗(中国扑克游戏)和麻将,以及几个标准的强化学习算法,如深度 Q 学习【6】、神经虚构自玩(NFSP)【7】和反事实后悔最小化【8】。它支持简单的安装和丰富的文档示例。它还支持多个过程的并行训练。采用了以下设计原则:

可再现: 来自环境的结果可以被再现和比较。用相同的随机种子在不同的运行中应该获得相同的结果。 易上手: 每次游戏结束后都收集整理好经验,界面直白。状态表示、动作编码、奖励设计,甚至游戏规则,都可以方便地配置。 可扩展: 按照上述设计原则,可以方便地将新的卡片环境添加到工具包中。工具包中的依赖性被最小化,这样代码可以很容易地维护。

Leduc 德州扑克

Leduc 德州扑克是德州扑克的简化版。该游戏使用 6 张牌(黑桃杰克、王后和国王,以及红桃杰克、王后和国王)。每个玩家会有一张手牌,还有一张社区牌。与德州扑克类似,高等级牌胜过低等级牌,例如黑桃皇后比黑桃杰克大。一对胜过一张牌,例如,一对 j 比皇后和国王大。游戏的目标是从其他玩家那里赢得尽可能多的筹码。Leduc Hold'em 的更多细节可以在 Bayes 的虚张声势:扑克中的对手建模 [9]中找到。

第一个例子:NFSP 在 Leduc 德州扑克上

现在,让我们用 RLCard 对一名 NFSP 特工进行 Leduc 德州扑克培训!完整的示例代码如下所示:

在本例中,为 Leduc Hold'em 构建 AI 需要 3 个步骤。

第一步: 制造环境。首先,告诉“rlcard”我们需要一个 Leduc 德州扑克环境。

env = rlcard.make('leduc-holdem')

第二步 : 初始化 NFSP 代理。其次,我们创建两个内置的 NFSP 代理,并告诉代理一些基本信息,例如,动作的数量、状态形状、神经网络结构等。注意,NFSP 还有一些其他的超参数,比如内存大小。这里我们使用默认值。

with tf.Session() as sess:
    agents = []
    for i in range(env.player_num):
        agent = NFSPAgent(sess,
                          scope='nfsp' + str(i),
                          action_num=env.action_num,
                          state_shape=env.state_shape,
                          hidden_layers_sizes=[128,128],
                          q_mlp_layers=[128,128])
        agents.append(agent) # Setup agents
    env.set_agents(agents)

第三步 : 生成游戏数据,训练代理。第三,可以用“run”功能生成游戏数据。然后,我们将这些转换传送到 NFSP 并培训代理。

episode_num = 10000000for episode in range(episode_num): # Generate game data
    trajectories, _ = env.run(is_training=True) # Train the agents
    for i in range(env.player_num):
        for ts in trajectories[i]:
            agents[i].feed(ts)
            rl_loss = agents[i].train_rl()
            sl_loss = agents[i].train_sl()

然后,NFSP 代理将通过自我游戏学习玩 Leduc Hold'em。性能可以通过 NFSP 代理和随机代理的比赛来衡量。你也可以在这里找到代码和学习曲线。示例学习曲线如下所示:

Learning curves in terms of performance against random strategy. The reward is the winning big blinds.

NFSP 代理在对抗随机代理的性能方面逐渐提高自己。如果您想探索更多的例子,请查看资源库。玩得开心!

玩预先训练好的模型

RLCard 还与 NFSP 一起提供了一个预先训练好的 Leduc Hold'em 模型。我们可以通过运行这个脚本来对抗预先训练好的代理。

>> Leduc Hold'em pre-trained model>> Start a new game!
>> Agent 1 chooses raise=============== Community Card ===============
┌─────────┐
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
└─────────┘
===============   Your Hand    ===============
┌─────────┐
│J        │
│         │
│         │
│    ♥    │
│         │
│         │
│        J│
└─────────┘
===============     Chips      ===============
Yours:   +
Agent 1: +++
=========== Actions You Can Choose ===========
0: call, 1: raise, 2: fold>> You choose action (integer):

摘要

要了解这个项目的更多信息,请点击这里查看。该团队正在积极开发项目的更多功能,包括可视化工具和锦标赛排行榜。这个项目的最终目标是让社区中的每个人都有机会在卡牌游戏中接受训练、比较和分享他们的人工智能。我希望你喜欢阅读。在我的下一篇帖子中,我将介绍 21 点深度 Q 学习的机制,我们将看看该算法是如何实现的及其在纸牌游戏中的应用。

参考资料:
【1】白银。用深度神经网络和树搜索掌握围棋游戏(2016)。
【2】白银。掌握没有人类知识的围棋游戏(2017)。
【3】布朗和桑德霍尔姆。用于单挑无限注扑克的超人 AI:Libra tus 击败顶级专业人士(2018)。
【4】Moravík DeepStack:单挑无限注扑克中的专家级人工智能(2017)。
【5】查。RLCard:卡牌游戏强化学习工具包(2019)。
【6】Minh通过深度强化学习实现人级控制(2015)。
【7】海因里希和西尔弗。不完全信息博弈中自我博弈的深度强化学习(2016)。
【8】Zinkevich不完全信息博弈中的后悔最小化(2008)。
【9】sou they Bayes 的虚张声势:扑克中的对手建模(2012)。

RLSD:用于多标签图像分类的端到端 CNN+LSTM 模型

原文:https://towardsdatascience.com/rlsd-an-end-to-end-cnn-lstm-model-for-multi-label-image-classification-47dfdf8e4bd9?source=collection_archive---------11-----------------------

RLSD localizes regions of interest that contain objects with semantic relationships.

阅读小组

我们公司有一个机器学习工程师的奖学金项目。奖学金项目的一部分是每周一次的研究论文回顾。每周都会有一名研究员发表一篇最新的机器学习研究论文。

我喜欢这些每周一次的小组,因为它让我们了解最新的研究。大多数数据科学家花时间阅读研究论文,但我个人不会保持每周一篇论文的节奏,如果我的日程表上没有这些阅读小组。

我相信每周、每两个月或至少每月一次的研究阅读小组应该是任何专注于应用机器学习的公司的一部分。这一领域的创新步伐势不可挡。

作为前研究员和该组织的成员,我偶尔有机会提交自己的研究论文。我想在 Medium 上与我的读者分享我从这篇论文中学到的东西会很不错。

多标签图像分类

ImageNet 中的分类任务是将一幅图像作为一组像素 X 作为输入,并返回该图像的标签 Y 的预测,标签 Y 应该描述图像的主题。

ImageNet prediction outputs from AlexNet. “Vanilla” ImageNet carries just one label per image.

这是对计算机视觉问题的过度简化。图像自然包含许多主题。我们可以用多标签分类来表示这种更常见的情况。与其将我们的图像标签限制为每张图像一个,为什么不使用多个标签来表示图像中存在的多个对象呢?

Most photographs contain many objects; a seabird, many humans, skateboards, hats, and even boats in the background are present in this example.

传统神经网络架构的简单改编,如 AlexNet、VGG 等。,可以让你多标签输出。在模型的最后一层使用 sigmoid 激活函数,代替 softmax,是一种选择。

但是这种方法并不总是那么有效。对于这个问题,有许多可供选择的方法。

今天我将谈谈其中的一种方法。

区域潜在语义依赖(RLSD)模型

RLSD 是张等人于 2016 年首次提出的一种方法。这个想法的许多扩展最近已经被探索。

研究人员的动机是试图对图像中的潜在语义依赖进行建模。之所以使用“潜在”这个词,是因为虽然有标签可用,但描述这些关系的标签却不可用。

图像中的对象通常以某种方式相互关联,尽管并不总是如此:一个女孩用棒球棒击球。一只小猫坐在电脑上。

这种关系并不总是存在的。例如,一张照片可能包含一栋建筑、一辆汽车和一棵树,尽管这三个对象不会以任何有意义的方式进行交互。

这篇论文的想法是创建一个模型,它足够具有表达能力来学习这些潜在的语义依赖,同时也足够灵活来检测独立的同现对象

了解 RLSD

这篇论文对我来说特别难理解,部分原因是它很复杂,部分原因是它的语法。

说真的,如果有任何 ML 研究者需要英文编辑, 请在发表前 联系我。

幸运的是,我有一些时间来纠正和消化它。

TL;博士

该模型使用来自 Faster-RCNN 的区域提议网络(RPN) 来生成感兴趣区域(RoI)提议。当 RoI 具有高置信度得分时,使用双线性插值将与其相关的卷积特征转换为固定大小的特征向量。这些向量通过密集层进行进一步压缩。压缩的特征向量然后被输入到 LSTM 模型,该模型将在可变数量的时间步长上处理信息。最后,记录 LSTM 的输出,并使用最大池操作将其转换到标签空间。

这有用吗?

这似乎太复杂了,无法工作。(一旦你阅读了训练前的步骤,它开始变得更加可信。)

区域提案网络

在fast-RCNN 论文中介绍了区域提议网络,或 RPN,。网络学习从图像空间到一组固定的边界框的映射,称为。锚预测带有置信度得分和四个边界框回归值,它们转换固定锚框以对固定锚位置进行微小调整。

Diagram from the faster-RCNN paper explaining RPN. The inputs to the RPN are convolutional features, extracted from (for example) a pretrained VGG network.

使用预训练的 VGG 网络从输入图像中提取 512 维的特定于位置的特征向量。每个 512-d 矢量可以直接映射回输入图像上的一个区域。这些位置中每一个都与多个锚(比如 9 个锚)相关联。这个数字在上图中被称为 k

每个 k 锚点与一个以输入图像的相应区域为中心的边界框相关联。每个都有不同的大小和长宽比(例如,正方形、高矩形、宽矩形)。RPN 能够使用该输出来预测边界框输出。

RLSD 的作者在视觉基因组图像数据集上对 RPN 进行了预训练,该数据集为这个预训练步骤提供了边界框。

感兴趣区域特征提取

一旦 RPN 检测到感兴趣区域(RoI ),一组 512 维特征向量就被传递到模型的下一部分。

这是与 RoI 相关的一组特征向量;由于 RoI 有不同的大小,这通常是向前传递的可变数量的特征向量。

为了固定这些特征的大小,作者使用双线性插值将这些特征映射到一组固定的特征。这是 fast-RCNN 的一个变化,它使用了一个池层来实现这一点。输出特征被固定为 512 维特征的 7×7 网格(针对每个 RoI)。

然后,这个张量被展平,并通过两个完全连接的层(每个层有 4096 个单位)发送。输出是该区域的提取特征的 4096 维编码。

LSTM 加工

给定 RoI 的 4096-d 特征编码作为输入给定 LSTM 模型。

Diagram of an LSTM model.

在每个时间步长,LSTM 模型将前一步的内部输出(上图中的 hx )作为输入,这是一组与当前时间步长 t 相关的新特征。在 t =0 时,x 是 4096-d 区域特征编码,h 是零向量。时间步长 t 的输出是一个 N 维向量,其中 N 是我们拥有的标签数量。由于我们没有输入序列,时间步长 t +1 的 x 输入就是时间步长 t 的预测输出。

LSTM 想停就停。标签上有一个特殊的“结束”标签。一旦 LSTM 输出“结束”编码,它就停止预测。

该模型针对每个 RoI 运行。

获得预测

LSTM 模型的输出是一个三阶张量。如果有 M 个 ROI、T 个时间步长和 N 个标签,则总输出为 M×T×N 个张量。

为了将其映射到 N 维标签空间,任何给定标签的最大概率(跨所有时间步长和区域)被作为最终输出。根据定义,这是一个最大池操作。

(source) Global max-pooling is used to get the final predictions. Instead of features, we have predictions; H and W correspond to timesteps and regions.

这里的输出是一个 N 维的预测向量。我们现在可以通过整个模型计算多标签交叉熵损失和反向传播,因为梯度可以通过每个操作反向传递(包括双线性插值操作,如 Karpathy 等人所指出的)

慷慨的前期培训

作者使用许多预训练步骤来获得收敛的模型。RPN 在带有边界框的数据集上进行了预训练,LSTM 在目标数据集上进行了预训练(跳过 RoI 步骤并向前传递所有要素)。原始卷积特征是从 ImageNet 预训练的 VGG 模型中提取的。

作者“发现这个初始化过程对模型快速收敛很重要[原文如此]。”

由于梯度不能通知来自图像级标签的 RPN 输出,我认为这一步不仅仅是“重要的”,而是模型工作所必需的。

结果

From the paper. mAP on the PASCAL VOC 2007 dataset, without using bounding boxes in training, got an 87.3 mAP, an apparent 2.1 improvement over the previous SOTA. (RLSD + ft-RPN row should be ignored, as it uses the provided bounding boxes in training).

这项工作的结果是对以前 SOTA 关于 PASCAL VOC 的结果的明显改进。他们的模型的另一个版本,称为 RLSD + ft-RPN,在训练期间使用数据集中提供的边界框来训练 RPN,所以它不应该与该表上的其他结果进行比较。(看看 RLSD 街吧。)

这样实用吗?

值得一问的是,这种模式对于部署是否足够实用。经过大量的预训练后,由于 LSTM 步骤,推理时间可能比大多数网络更长(尽管这可以在所有 RoI 输出中很好地并行化。)

作者没有报道推断过程中的计算时间。

此外,由于对预培训的依赖,我预计 RPN 在非常不同的领域不会很好地工作;这可能会对性能造成另一个限制,需要来自与目标数据集相似的域的数据集,并且具有可用的边界框注释来完成预训练步骤。这样的数据通常很难获得。

如果作者提供一些代码(或者一些预先训练好的网络),我会对这个项目更加乐观。既然得不到,我就持怀疑态度。

优势

如果一切顺利,并且你能够预训练一个在你的领域中有效的 RPN,那么从端到端训练 RLSD 模型提供了一些优势。例如,特定的边界框可以与预测标签相关联。

在多标签分类问题上使用该模型也可能获得最佳结果。只要确保你能完成所有要求的训练前步骤。

RNN 简体版-初学者指南

原文:https://towardsdatascience.com/rnn-simplified-a-beginners-guide-cf3ae1a8895b?source=collection_archive---------8-----------------------

递归神经网络的直观解释,LSTM 和 GRU

image credit — Gerd Altmann from Pixabay

递归神经网络(RNN)是一种流行神经网络体系结构,广泛用于由顺序或上下文数据组成的用例。

在我们从 RNN 本身开始之前,让我们先看看为什么我们首先需要它。让我们试着记住这一幕。

花了点时间,对吧?(或者你根本无法理解)

现在想象你正在看电影,你在这个特定的场景中,你将能够很容易地把这些点联系起来。我们所有的想法都是流动的,基于之前的框架,我们可以很容易地连接到当前的框架。我们的思想具有持久性。

我们传统的神经网络架构无法做到这一点,给定一个特定的帧序列,它们无法预测电影中每一点发生了什么。

为了解决这种问题,我们使用一个自环网络。

fig1 : Recurrent Neural Network ( Network with self loop)

简单来说,我们将网络中前一个时间帧的输出反馈到下一个时间帧。假设网络在 t=1 时的输出是 h0,而在 t=2 时训练网络,我们也将考虑 h0,从先前时刻接收的输出。如果我们展开网络,我们会得到下面的结构。

fig2 : RNN at various instance of time , Image Credit— colah’s blog

这里需要记住的重要一点是 您显示的连续单元是不同时间点的相同单元,而不是级联单元

现在,RNN 的简单实现也存在问题。随着时间的推移,它们通过反向传播来学习。如果我们要求他们从长期依赖中学习,这可能会导致梯度消失或梯度爆炸的问题。简而言之,他们记不住重要的信息,而这些信息可能在以后的时间标记中需要。

为了克服这些问题,我们使用 LSTM(长短期记忆),一种非常特殊的循环网络和 GRU(门控循环单元),它是 LSTM 的一个稍微修改的版本。

LSTM 故障:

让我们来分析一下 LSTM 的内部结构。一个 LSTM 单元主要

fig3 :LSTM and GRU .image credit — Michael Nguyen

由一个单元状态(单元的当前信息流)和三个门(读取网络层的特殊形式)-忘记门、输入门和输出门组成。迷惑对吗?别担心,我们会一步一步地分解它。

细胞状态:我们可以把细胞状态想象成不同时刻的连续信息流。在每个时刻,我们都必须决定保留或修改多少信息。还记得我们最初为什么需要 LSTM 吗?我们无法保留来自遥远的特定时刻的信息的重要性。 在这里,我们可以灵活地决定在每个阶段给予哪些信息更多的重视。

  1. 忘记大门:首先让我们仔细看看我们拥有的各种符号:

fig4 :Structure of LSTM ,image credit- wikipedia

C_(t-1) :旧单元状态, c_t: 当前单元状态, h_(t-1): 从前一状态输出, h_t =当前状态输出

遗忘门决定了我们将使用多少来自先前单元状态的信息,以及我们将“丢弃”多少信息。最后一个状态的输出( h_(t-1) )与 x_t 连接(未加),并通过一个 sigmoid 单元。Sigmoid 提供 0 到 1 之间的输出。直观上,0 表示'忘记一切,1 表示'保留一切

2。输入门:输入门决定我们将哪些新信息添加到单元状态中。串接的 x_t 和 h_(t-1)通过 sigmoid 单元发送,该单元决定我们将更新什么值。

级联值也通过一个双曲正切层,该层给出-1 到+1 之间的输出,并帮助调节网络。在所有这些操作之后,我们得到了单元状态的当前值。

3.输出门:输出门决定在下一个时刻我们将传递给网络什么信息。如果你沿着最后一条水平线,我们首先串接 x_t 和 h_(t-1)是通过一个 sigmoid 单元发送的。然后,我们通过一个双曲正切函数传递当前单元状态的值(注意,这是一个逐点双曲正切运算,而不是双曲正切激活层)。最后,我们将两个输出相乘,并在下一个时间发送出去。你可能会想到 为什么这里有两个 h _ t?。答案是,在我们的整个解释中,我们考虑的是 LSTM 的一个单元。实际上,我们也可以使用级联多层 LSTMs。因此,一个输出到网络的下一层,另一个输出到网络的下一个实例(随时间前馈)。

GRU 的分解:

GGateRe currentUnit 是由推出的 LSTM 网络的流行变种

fig5 : Structure of GRU

Cho 等(2014) 。LSTM 和 GRU 的主要区别是,GRU 只有两个门(更新和重置门)。

  1. 更新门:更新门只不过是单个单元中输入门和遗忘门的组合。它决定保留什么信息和需要添加什么新信息。
  2. 重置门:它决定在下一个时刻需要向网络传递什么信息。它还合并了当前单元格状态和隐藏状态,并进行一些其他更改。

与 LSTM 相比,GRU 减少了门的数量,因此减少了张量运算的数量。这使得它在计算上比 LSTMs 更便宜和更快。但是我们不能马上说哪种实现是最好的。这取决于手头的问题。在实践中,我们将这两个模型应用到我们的用例中,并比较哪一个性能更好。

结束备注:

在本文中,我们讨论了关于Re currentNeuralN网络的基础知识以及 LSTM 和 GRU 的构建模块。本文的主要目的是让您熟悉神经网络的基础知识,并建立一个直观的基础。希望这将有助于你的旅程。快乐学习!

引文:

你可以通过这些链接更深入地研究

  1. http://colah.github.io/posts/2015-08-Understanding-LSTMs/
  2. https://www.youtube.com/watch?v=WCUNPb-5EYI
  3. https://skymind.ai/wiki/lstm

瑞士的道路交通事故预测——脸书预言家和 LSTM 神经网络的简单比较。

原文:https://towardsdatascience.com/road-accidents-in-switzerland-forecasting-a-brief-comparison-between-facebook-prophet-and-lstm-6514f585681?source=collection_archive---------19-----------------------

多年来,预测未来的能力只保留给少数人,他们的工具仅限于水晶球、手掌和塔罗牌。但是在过去的 50 年里,新的工具已经出现,现在更多的人可以进行预测,这很棒!

在本文中,我将通过一个简单的例子向您展示如何执行基本的时间序列预测。我们将使用开源库脸书先知和使用 Keras / Tensorflow 的 LSTM 神经网络来分析、可视化和预测瑞士的道路事故。

我在这篇文章中使用的 jupyter 笔记本可以在我的 github 上找到。

[2011–2018] Accidents location in Switzerland

数据集:

对于这篇博客文章,我们将使用“Strassenverkehrsunfallorte”数据集,可从以下地址获得:https://open data . Swiss/en/dataset/strassenverkehrsunfalle-MIT-personenschaden

数据集描述:2011 年至 2018 年道路交通伤害事故的匿名可视化和定位。为道路交通事故提供关于年、月、工作日、事故时间、道路类型、事故类型、严重程度类别和位置的信息。

可视化:事故地点

如果可能的话,我总是试图用一个漂亮的可视化来开始一个新的数据科学项目,幸运的是这个项目适合这个目的。

实际上,在考虑预测之前,我对这个数据集感兴趣的原因是它有可能被用来使用 数据阴影 生成一个“漂亮的”可视化。对于那些熟悉这个库的人来说,你可能已经看到了它在纽约出租车数据集或 OpenSky 网络数据集上的使用,它能够处理数十亿个数据点。

[2011–2018] Accidents location in Switzerland with colors depending on severity

事故预测

虽然原始数据集是一个时间序列,其中每行代表一次事故,但我对它进行了处理,这样我们现在就有了一个时间序列,它可以计算每小时的事故数量,这就是我们将尝试预测的情况。

时间序列预测:

说到预测时间序列,我想到了一些流行的方法:

  • 简单基线:平均、平滑…
  • 自回归:SARIMA 模型(季节性自回归综合移动平均模型)
  • 神经网络/深度学习:CNN,LSTM

几乎所有这些方法都需要一点努力来调整它们并找到最佳参数。最酷的事情是,脸书的工程师(可能厌倦了从头开始使用新模型)推出了一个开源库,名为Prophet:“Prophet 是一个基于加法模型预测时间序列数据的程序,其中非线性趋势符合每年、每周和每天的季节性,加上假日效应。它最适用于具有强烈季节效应的时间序列和几个季节的历史数据。Prophet 对缺失数据和趋势变化具有稳健性,通常能很好地处理异常值。

数据集操作:

这里的目标不是展示先知或 LSTM 神经网络的所有能力,而是操纵一个简单的数据集,并向您展示如何塑造它来预测未来😮

我们的原始数据集包含每个已登记事故的一行,我们将对其进行操作,以计算在您选择的时间增量(dt)内发生的事故数量。我们将获得一个数据集,它仍然是一个时间序列,但现在每个“时间戳”在一个选定的频率上只有一行,还有一列“n_accident ”,包含在选定的时间跨度内登记的事故数量。

脸书先知:

先知事故的季节性:

一旦获得新的数据集,使用 Prophet 很容易获得预测和季节性分析。

以下是您可以获得的季节性曲线图类型:

Seasonality of number of accidents per hours

y 轴表示每个时间戳的事故数量(1H 的分辨率)。

正如我们所见,事故数量在 2011 年至 2013 年间有所下降,但自 2016 年以来又有所上升。

我们可以从该图中提取的其他信息是,就事故以及一天中 16-18 小时的时间跨度而言,6 月似乎是最关键的一个月。

使用 Prophet 进行事故预测:

由于我们有 2011 年至 2018 年的数据,我们将只使用 2011 年至 2017 年期间来预测 2018 年,然后能够评估预测的准确性。我们不再试图预测每小时的事故数量,而是转换我们的数据集来预测每天的事故数量。

Daily accidents number forecast for 2018

仅通过查看图表很难评估准确性,因此我们需要在本文的下一部分查看一些指标。

长短期记忆神经网络

使用深度学习和 LSTM 神经网络的事故预测;

LSTM 代表长期短期记忆。这是一种递归神经网络,LSTM 的强大之处在于它有一种记忆,能够记住/忘记模式。

我们将用过去的 1000 天来预测接下来的 365 天。为此,我们根据 2011 年到 2017 年底的数据训练模型,然后我们试图预测 2018 年瑞士的事故。

我们使用步行前进模式。假设我们想要使用最后 3 个元素[1,2,3,4,5,6]来预测下面序列的下一个元素。我可以设计多行的训练数据集,例如:

[1, 2, 3] -> 4
[2, 3, 4] -> 5
[3, 4, 5] -> 6

为此,我使用了这篇非常有用的文章:https://machine learning mastery . com/convert-time-series-supervised-learning-problem-python/

神经网络结构;

我使用 keras 来建模神经网络,我们有一个由 50 个 LSTM 细胞组成的层(我使用了 CuDNNLSTM 层,这是一个充分利用 GPU 的 LSTM 的快速实现)和一个密集层,其中神经元的数量等于我们想要做的预测的数量。

Neural network architecture using keras

培训和结果:

我们使用 33%的数据作为验证和 val_loss 上的模型检查点回调,以避免网络对训练数据的过度拟合。

2018 daily accidents forecast using LSTM

正如我们在上面的图中看到的,它抓住了趋势,但仅此而已,我们看到的振荡并没有真正抓住数据中任何有趣的部分。我确信我们可以通过微调 LSTM 超参数得到更好的结果,但这不是本文的目的。

脸书预言家 vs. LSTM 预测准确性

为了判断我们预测的准确性,我们将检查两个模型在不同指标下的表现。我选择了 3 个不同的指标:均方根误差[RMSE]、平均绝对误差[MAE]和平均百分比误差[MPE]。

2018 forecasting metrics

正如我们所见,prophet 在 3 个指标中的每一个指标上都表现得更好。这展示了这个工具的威力。以三分之一的努力,我们获得了比用 LSTM 神经网络更好的预测。下次你想预测一些时间序列时,你可能想先试试 Prophet。

但是不要误解我的意思,当你想使用多种特征或更复杂的数据进行预测时,LSTM 是非常强大的,当然,根据你的应用,它可能是你要考虑的“工具”。

基于 Keras 的分割模型和白蛋白库的道路检测

原文:https://towardsdatascience.com/road-detection-using-segmentation-models-and-albumentations-libraries-on-keras-d5434eaf73a8?source=collection_archive---------5-----------------------

在这篇文章中,我将展示如何编写自己的数据生成器以及如何使用 albumentations 作为增强库。以及 segmentation_models 库,它为 unet 和其他类似 Unet 的体系结构提供了几十个预训练的头。完整代码请访问 Github 。链接到数据集。

查看我的机器和深度学习博客【https://diyago.github.io/

理论

语义图像分割的任务是将图像的每个像素标记为所表示内容的相应。对于这样一项任务,经过各种改进的 Unet 架构表现出了最佳效果。它背后的核心思想只是几个卷积块,提取深度和不同类型的图像特征,随后是所谓的去卷积或上采样块,恢复输入图像的初始形状。此外,在每个卷积层之后,我们有一些跳跃连接,这有助于网络记住关于初始图像的,并有助于防止渐变。有关更多详细信息,您可以阅读 arxiv 文章或另一篇文章或。

Vanilla U-Net https://arxiv.org/abs/1505.04597

我们是来练习的,让我们开始吧。

数据集-卫星图像

对于分割,我们不需要太多的数据来获得一个像样的结果,甚至 100 张带注释的照片就足够了。目前,我们将使用来自https://www.cs.toronto.edu/~vmnih/data/的马萨诸塞州道路数据集,大约有 1100 多张带注释的列车图像,它们甚至提供验证和测试数据集。不幸的是,没有下载按钮,所以我们必须使用脚本。这个脚本将完成这项工作(可能需要一些时间来完成)。

让我们来看看图片示例:

Massachusetts Roads Dataset image and ground truth mask ex.

注释和图像质量似乎不错,网络应该可以检测道路。

库安装

首先你需要安装带有 TensorFlow 的 Keras。对于 Unet 构建,我们将使用 Pavel Yakubovskiy 的名为 segmentation_models 的库,用于数据扩充albumination库。稍后我会写更多关于他们的细节。这两个库的更新都非常频繁,所以我更喜欢直接从 git 更新它们。

定义数据生成器

作为数据生成器,我们将使用我们的自定义生成器。它应该继承 keras.utils.Sequence 并且应该定义这样的方法:

  • init (类初始化)
  • len (数据集的返回长度)
  • on_epoch_end (时段结束时的行为)
  • getitem (生成的批次馈入网络)

使用自定义生成器的一个主要优点是,您可以处理您拥有的每种格式数据,并且可以做任何您想做的事情——只是不要忘记为 keras 生成所需的输出(批处理)。

这里我们定义 init 方法。它的主要部分是为图像( self.image_filenames )和遮罩名称( self.mask_names )设置路径。不要忘记对它们进行排序,因为对于self . image _ filenames[I]对应的掩码应该是 self.mask_names[i]。

接下来重要的事情_ _ getitem _ _通常情况下,我们无法将所有图像存储在 RAM 中,因此每次生成新的一批数据时,我们都需要读取相应的图像。下面我们定义训练的方法。为此,我们创建一个空的 numpy 数组(np.empty ),它将存储图像和遮罩。然后我们通过 read_image_mask 方法读取图像,对每一对图像和掩膜进行增强。最后,我们返回 batch (X,y ),它已经准备好被放入网络中。

接下来,我们定义发电机,它将被馈入网络:

数据扩充— 相册

数据扩充是一种策略,能够显著增加可用于训练模型的数据的多样性,而无需实际收集新数据。这有助于防止过拟合,并使模型更加健壮。

对于这样的任务,有大量的库:imaging、augmentor、solt、keras/pytorch 的内置方法,或者您可以使用 OpenCV 库编写您的自定义增强。但是我强烈推荐 相册 图书馆。用起来超级快捷方便。有关用法示例,请访问官方知识库或查看示例笔记本。

在我们的任务中,我们将使用基本的增强,如翻转和非平凡的弹性变换的对比。你可以在上图中找到它们的例子。

在定义了所需的增强后,您可以很容易地得到如下输出:

复试

我们将使用常见的回调:

  • 模型检查点-允许您在训练时保存模型的权重
  • ReduceLROnPlateau —如果验证指标停止增加,则减少训练
  • EarlyStopping —一旦验证指标停止,就停止训练,以增加几个时期
  • tensor board——监控训练进度的绝佳方式。链接到官方文档

培养

作为模型,我们将使用 Unet。使用它最简单的方法就是从 segmentation_models 库中获取。

  • backbone_name:用作编码器的分类模型的名称。EfficientNet 目前在分类模型中是最先进的,所以让我们来尝试一下。虽然它应该给出更快的推理并且具有更少的训练参数,但是它比众所周知的 resnet 模型消耗更多的 GPU 内存。还有许多其他选择可以尝试
  • encoder_weights —使用 imagenet weights 加速训练
  • encoder_freeze:如果为真则将编码器(骨干模型)的所有层设置为不可训练。首先冻结和训练模型,然后解冻可能是有用的
  • decoder_filters —您可以指定解码器块的数量。在某些情况下,带有简化解码器的较重编码器可能会有用。

在初始化 Unet 模型之后,你应该编译它。此外,我们将IOU(union 上的交集)设置为我们将监控的度量,并将 bce_jaccard_loss ( 二进制交叉熵加上 jaccard loss )设置为我们将优化的损失。我给了链接,所以不会去这里为他们进一步的细节。

开始训练后,你可以观看 tensorboard 日志。正如我们可以很好地看到模型训练,即使在 50 个纪元后,我们也没有达到全局/局部最优。

Tensorboard logs

Loss and IOU metric history

推理

因此,我们有 0.558 IOU 进行验证,但每个高于 0 的像素预测都被视为屏蔽。通过选择合适的阈值,我们可以将结果进一步提高 0.039 (7%)。

Validation threshold adjusting

度量当然很有趣,但是更有洞察力的模型预测。从下面的图片中,我们看到我们的网络很好地完成了任务,这很好。对于推理代码和计算指标,您可以阅读完整的代码。

参考

@phdthesis{MnihThesis,
    author = {Volodymyr Mnih},
    title = {Machine Learning for Aerial Image Labeling},
    school = {University of Toronto},
    year = {2013}
}

航空图像中道路的分割。

原文:https://towardsdatascience.com/road-segmentation-727fb41c51af?source=collection_archive---------7-----------------------

这篇全面的文章将帮助您创建一个道路分割模型,它可以检测和分割航空图像中的道路。

卷积神经网络(C.N.N.s)的出现是计算机视觉领域的一项突破,因为它们从根本上改变了计算机“看”图像的方式。机器视觉已经从它开始的地方走了很长的路,但它今天仍然处于研究的前沿。语义分割是将图像中的每个像素归属于某一类的过程。这个类可以是一只狗,一辆车,或者在我们的例子中是道路。

You can view the interactive output here.

地球上所有道路的总长度约为 3350 万公里。让我换一种说法——如果我们能把所有的路都排成一条直线,那么我们将走过地球和太阳之间距离的四分之一。手动标注道路的每一部分是一项艰巨的任务,如果不是不可能的话。这就是深度学习发挥作用的地方,这也是我们将通过这个项目完成的事情。简单来说,我们将训练一个深度学习模型来识别航拍图像中的道路。

您可以在本文末尾找到源代码的链接。如果你想了解这篇文章的范围,请参考目录。项目中使用的所有资源都是公开可用的,因此建议您遵守。本文涵盖了该项目的实践和理论两个方面,我希望这对您来说是一次愉快的学习经历。

目录

  1. 数据
    一、我们需要的数据类型。
    二。数据集
    iii。正在下载数据集。
  2. 预处理
  3. 神经建模
    一、关于 F.C.N
    二。网络架构
  4. 训练模型
    一、损失函数和优化器
    二。回调
    三。训练模型
  5. 测试模型
  6. 改进范围
  7. 结论
  8. 链接和引用

让我们开始吧。

1.数据

不同类型的机器学习模型需要不同类型的数据,数据越多越好。更多的数据训练意味着我们的模型将能够学习更多的潜在模式,并且能够更好地区分异常值。

我们需要的数据类型。

通常,对于分割挑战,我们需要图像以及它们各自的(最好是手绘的)地图。对于这个项目,我们需要航空图像,以及它们的分段地图,其中只显示了道路。这个想法是,我们的模型将专注于表示道路的白色像素,它将学习输入图像和输出地图之间的相关性。

二。数据集

对于这个项目,我们将使用马萨诸塞州道路数据集。该数据集包含 1171 幅航空影像,以及它们各自的地图。它们的尺寸是 1500 x 1500 英寸。tiff 格式。请看看下面的样品。

Just look at how elaborately the image was annotated.

三。正在下载数据集。

您可以从克隆我的 GitHub repo 开始,然后使用 Src 文件夹中的 download_images.py 脚本下载数据集。如果你有一个不可靠的持续波动的互联网连接,那么请使用学术洪流来获取数据集。你可以在这里找到数据集。

2.预处理

数据的质量极大地影响了我们模型的性能,因此预处理是确保我们的模型以正确的形式接收数据的重要一步。我尝试了多种预处理技术,以下方法产生了最好的结果:

一、手选:数据集中有少数( ~50 )图像缺失了一大块航拍图像。大部分图像包含白色像素,但它们有完整的分割图。因为这样会影响模型,所以我手动删除了它们。

二。裁剪而不是调整尺寸:在大图像上训练我们的模型不仅是资源密集型的,而且一定会花费很多时间。将图像调整到较低的尺寸可能是一个解决办法,但是调整尺寸是有代价的。无论我们在调整大小时选择什么样的插值方法,我们最终都会丢失信息。

因此,我们将从大图像中裁剪出较小的 256 x 256 的图像。这样做给我们留下了大约 22,000 幅有用的图像和地图。

三。对图进行阈值处理和二值化:灰度图像是包含不同灰度的单通道图像。每个像素可以取 256 个可能的灰度值,0 代表黑色像素,255 代表白色像素。在语义分割中,我们本质上预测每个像素的这个值。我们将只提供两个选项,而不是提供 256 个离散选项供模型选择。你可能已经注意到了,我们的地图只有两种颜色:黑色和白色。白色像素代表道路,黑色像素代表除道路以外的一切。

仔细观察我们的双色分割图,会发现当我们想要的是黑白时,有许多灰色像素。我们将从阈值像素值为 100 开始。使得所有具有高于某个阈值的值的像素被分配最大值 255,而所有其他像素被分配零。这样做确保了在分段掩码中只有两个唯一的像素值。现在,0 和 255 是一个很大的范围。通过将所有地图除以 255,我们将地图归一化,现在我们最终只有两个值— 0 和 1。

四。打包(可选):我在 Google Colab 上训练了我的模型。衷心感谢谷歌为成千上万的数据科学家和机器学习工程师提供资源。

我注意到在训练期间从 Gdrive 向模型提供图像(使用 ImageDataGenerator)最终会消耗额外的时间。但是,如果您在系统上训练模型,这就不正确了,因为在这种情况下加载文件要快得多。我将整个图像和地图数组打包成两个独立的 .h5py 文件,并将它们加载到内存中。这样做加快了训练过程。

3.神经建模

既然我们已经处理了数据,是时候开始模拟我们的神经网络了。为了完成我们的分段任务,我们将使用全卷积网络。这类网络大多由卷积层组成,与更传统的神经网络不同,没有完全连接的层。

一、关于 F.C.N

德国弗赖堡大学计算机科学系开发了用于生物医学图像分割的全卷积网络[1]。后来人们意识到,这些网络的范围远远超出了医学领域。这些网络可以对任何类型的对象进行多类分割——无论是分割人、汽车还是建筑物。

二。网络体系结构

这个项目使用 U-net,这是一个完全卷积的神经网络,它的名字很直观。该网络采用 256x256 多通道图像,并输出相同尺寸的单通道图。

U-net 有两部分——编码器或下采样部分,解码器或上采样部分。看看下面的图片就知道了。

Dissecting a U-net

编码器:下采样部分。此部分使用卷积层来学习图像中的时间特征,并使用汇集层对其进行下采样。这部分负责学习图像中的物体。在这种情况下,这部分学习道路看起来如何,并可以检测它。我添加了 dropout 层,它将随机忽略神经元以防止过度拟合,我添加了 BatchNormalization 以确保每一层都可以独立于前一层进行学习。

解码器:又叫上采样段。连续的池操作会导致图像空间信息的丢失。模型确实知道图像的内容,但是不知道它在哪里。解码器网络背后的整个想法是使用我们在上一步中提取的特征图来重建空间数据。我们使用转置卷积对图像进行上采样。与普通插值不同,Conv2DTranspose 具有可学习的参数。

跳过连接:编码器段中的层与解码器段中的层之间的直接连接称为跳过连接。它们被称为跳过连接,因为它们桥接两层,而忽略所有中间层。跳过连接为上采样层提供空间信息,并帮助它们重建图像和“将东西放入适当的位置”(字面意思)。

请使用以下代码复制 U-net。

我们的 U-net 闪耀着光辉。

4.训练模型

一.损失函数和超参数

在像素级别,这种分割挑战可以被认为是二元分类问题,其中模型对每个像素是白色(道路)还是黑色(非道路)进行分类。但是,我们需要一个平衡的数据集来促进正确的分割,因为这些图像中黑色像素的数量远远超过白色像素,所以我们有一个不平衡的数据集。

有几种不同的方法来处理不平衡的数据问题。在这个挑战中,我们将使用软骰子损失,因为它是基于骰子系数。Dice 系数是预测样本和基础真实样本之间重叠的度量,该值的范围在 0 和 1 之间。其中 0 表示没有重叠,1 表示完全重叠。

The formula for the Dice Coefficient. Deja Vu?

平滑骰子损失就是 1 —骰子系数,这样做是为了创建一个最小化损失函数【2】。请看下面骰子丢失的代码。

def dice_coef(y_true, y_pred, smooth = 1):
   y_true_f = K.flatten(y_true)
   y_pred_f = K.flatten(y_pred)

   intersection = K.sum(y_true_f * y_pred_f)
   dice = (2\. * intersection + smooth) / (K.sum(y_true_f)    K.sum(y_pred_f) + smooth)

   return dicedef soft_dice_loss(y_true, y_pred):
   return 1-dice_coef(y_true, y_pred)

可以看到,我们使用了一个名为 smooth 的参数,默认值为 1。通过将分子和分母都加 1,我们可以确保永远不会被零除。

Source:pyimagesearch.com

准确性度量:准确性度量告诉我们生成的分割图的正确性。我们将使用 Jaccard 索引,也就是 Union 上的交集,来告诉我们生成的地图有多精确。顾名思义,交集超过并集是分割图正确性的度量。分子是预测图和基本事实标注之间的交集,而分母是基本事实标注和分割图的总面积(使用联合运算计算)。下面的代码片段用于计算 Jaccard 索引。

def IoU(y_pred, y_true):
   I = tf.reduce_sum(y_pred * y_true, axis=(1, 2))
   U = tf.reduce_sum(y_pred + y_true, axis=(1, 2)) - I
   return tf.reduce_mean(I / U)

我们使用 Adam 作为优化器来编译模型。我们将以 0.00001 的学习率开始,我们将它设置为运行 100 个时期。我们使用软骰子损失作为损失函数,使用 Jaccard 指数作为精度指标。

二。复试

在训练过程中可以调用的一组函数称为回调函数。在这个项目中,我们将使用四次回调:

  1. 模型检查点:监控验证损失,保存验证损失最低的模型的权重。
  2. 提前停止:监控确认损失,如果确认损失在一定次数后没有增加,则终止训练过程。
  3. ReduceLROnPlateau :监控验证损失,如果验证损失在一定次数后没有降低,则降低学习率。
  4. TensorBoardColab :是 Tensorboard 的一个特殊版本,专门用于 Google Colab。我们可以在培训过程中监控准确性和其他指标。

三。训练模型

我们已经做了所有的功课,现在是时候拟合模型了。但在此之前,我们将使用trainttestsplit()将数据拆分为分别包含 17,780 和 4446 幅图像的训练集和测试集。一旦模型开始对训练数据进行训练,你也许可以去跑步,因为这需要一些时间。好的一面是,我们不必照看模型,你可以回到一个训练有素的模型和输出的重量。

该模型运行了 57 个时期,然后早期停止开始并停止了训练过程。最小验证损失为 0.2352。您可以在下图中观察验证和培训指标的趋势。

Tensorgrab

5.测试模型

我们的测试集包含 4446 幅图像,我们的模型几乎可以立即预测它们的分割图。我们的模型在测试集上的性能可以使用 Dice 系数来衡量,该系数达到 0.59(该值介于 0 和 1 之间)。当然还有改进的余地。您可以在下图中观察到一些预测的输出。

Few Samples

再看一下,您会注意到我们的模型可以分割注释者遗漏的部分道路。在下图中,注释者跳过了右下角的方块,而我们的模型能够捕捉到它。我们的模型成功地分割了车道、停车场和死胡同。

Our model was able to pick up the square region

6.改进的范围

在某些地图上,道路并不完全可见,请看下面的例子。我们的模型无法检测左侧的道路。尽管没有一个模型能产生 100%准确的结果,但总有改进的空间。

Missing predictions

我们可以通过采取某些措施来提高模型的性能,这些措施如下:

  1. 图像数据增强:它是通过应用各种操作,如颜色偏移、旋转等,使图像轻微失真的方法。来产生更多的数据。
  2. 使用损失乘数处理职业不平衡:如前所述,我们有一个职业不平衡的问题,为了解决它,我们使用了软骰子损失。我们希望最大化我们的 dice 系数,但是当与二元交叉熵相比时,后者具有更好的梯度,因此将是我们定制损失函数的良好代理,并且可以容易地最大化。唯一的问题是,与软骰子损失不同,二进制交叉熵不是为了处理类别不平衡而构建的,这导致了乌黑的分割图。然而,如果我们应用类乘数,使得模型被激励来忽略频繁出现的类,那么我们可以使用二进制交叉熵来代替骰子损失。这将带来流畅的训练体验。
  3. 使用预训练模型:预训练模型可以针对这个问题进行微调,它们将充当最佳特征提取器。使用迁移学习导致更快的训练时间,并且通常产生更好的分割图。

7.结论

在这个项目中,我们创建了一个深度学习模型,可以从航拍图像中分割道路。我们获取了图像,并对其进行处理以满足我们的需求。我们创建了一个 U-net 并了解了它的工作原理。我们使用软骰子损失作为我们的成本函数,并训练了 57 个时期的模型。然后,我们在测试集上测试我们的模型,并观察一些样本。

本项目的几点收获:

  1. 裁剪图像而不是调整它们的大小可以保留空间信息。
  2. 将分割图二值化将图中不同值的数量减少到两个。
  3. 使用 ModelCheckpoint 回调来保存模型权重是一个好主意。为了以防万一,如果程序在训练过程中崩溃,你可以随时重新加载重量并恢复训练。
  4. 最后,如果你曾经走进了死胡同,那么 Slav Ivanov 已经写了一篇全面的文章,它将帮助你克服任何与深度学习相关的障碍。

8.链接和参考

这个挑战的确很有趣,感谢您通读这篇文章。如果您有任何反馈或问题,请随时在下面的评论部分输入。

如果你期待更多有趣的教程,那么请关注我的 Twitter 和 Medium。

链接

  1. 源代码。
  2. CS231n:用于视觉识别的卷积神经网络

参考

[1] 优信网—维基百科

[2] 评估图像分割模型—杰瑞米·乔登

想了解更多?查看我的其他几篇文章:

  1. 创建自定义人脸识别模型,并在您的系统上运行。
  2. 构建活体情感识别模型。

公路旅行热

原文:https://towardsdatascience.com/road-trip-fever-460a2627f0c4?source=collection_archive---------21-----------------------

Ep。4:求解 TSP 以获得目的地的有效路线

Our output today; All our efficient road-trip destinations on globe; connected linearly

想象一下你自己,走在蜿蜒的山路上,每个角落都会出现新的田园风光。或者感受海风吹过你的头发,驾驶着你的敞篷车,在那风景如画的海洋车道上感受无尽的夏日海浪。或者把你的露营车停在一个似乎从来没有人见过的地方。公路旅行有多种形式,通常会立即激发我们许多人的兴趣。

对于我们在第三集中看到的更大的集群,为了充分利用我们的假期,公路旅行是不可避免的。这就是为什么在今天的帖子中,我们将尝试回答如何在我们所有的度假目的地旅行:需要自驾游吗?如果是,如何最有效地穿过集群?

对于后者,我们将尝试为每个需要公路旅行的度假目的地解决一个微型版的 TSP !

旅行推销员问题 ( TSP )提出以下问题:“给定一列城市和每对城市之间的距离,访问每个城市并返回出发城市的最短可能路线是什么?” —维基百科

我们的方法

  1. 在我们的度假目的地建立更小的住宿集群;这些将定义求解 TSP 的位置。
  2. 将需要 TSP 分析的目的地与仅包含一个或两个子聚类的目的地分开
  3. 探索哪种 TSP 解决算法最适合我们的问题并在我们的公路旅行度假目的地应用
  4. 想象我们新创造的全球公路旅行

数据

我们今天需要的数据是每项活动的经度和纬度方面的地理数据。因为我们已经在第一集中使用谷歌地图的地理编码 API 得出了这些。

然而,为了计算我们的公路旅行目的地之间的最佳路线,我们将从以下各项中提取驾驶距离(时间)数据:

  • 谷歌 : 为了检索我们目的地内夜间位置之间的距离,我们将利用 谷歌的距离矩阵 API

定义夜间位置

在第三章中,我们将我们的旅游活动集中到了度假目的地。但与此同时,我们也注意到,这些度假目的地中的一些仍然包含相距很远的活动(例如,一个美国集群包含从芝加哥到新奥尔良的所有活动)。这意味着我们不能把自己的基地设在集群中的一个单独的位置,并且能够通过一日游参观所有的活动。我们必须在我们的活动和目的地之间创建一个新的层级:过夜地点。

我们要寻找的是一个单一的位置,从这个位置我们可以在一天内合理的距离内(因此距离是一个约束)从集群中获得尽可能多的活动。听起来很熟悉?那是因为这是一个和我们在上一集中提到的非常相似的问题!因此,让我们不要重新发明轮子,使用我们在那里使用的相同集群过程(DBSCAN 集群)来创建子集群,这些子集群将充当我们的夜间位置。

由于我们希望能够开车前往活动地点并返回我们的过夜地点,同时还能够享受活动,我们将根据最大直线距离200km选择ε参数。因为我们想要访问集群中的所有活动,所以我们将选择 1 个的最小人口。确保没有异常值(即,如果子群中有一个活动,我们将访问该活动,并在继续下一个子群之前在那里停留 1 个晚上)。**

因此,在应用这种方法后,我们现在已经在我们的剧集中创建了三个旅游层级:

  • 活动-要参观的地方
  • 子集群-睡眠的位置
  • 集群-度假目的地

视觉上,回到美国的例子,这些层看起来像这样:

Fig. 1, 2, 3: Mapped activities, sub-clusters and clusters respectively, grouped by the 7 clusters in the US

由此可以立即看出,并非所有集群都有多个子集群。一些度假目的地有一个单一的过夜地点,从那里我们可以参观所有的活动。非常适合不太喜欢公路旅行的旅行者。

让我们来看一下我们的聚类分布,包括过夜地点的数量,以及公路旅行和非公路旅行聚类:

Fig. 4 distributions of the holiday destinations (clusters) by the number of overnight locations (sub-clusters)

大多数度假目的地只有一个过夜的地方。我们可以看到,大多数其他集群都有 2 到 10 个子集群,大多数都是较小的数量。然后有三个目的地有超过 10 个子集群,但这些似乎是相当例外。

谈到非公路旅行与公路旅行(> 2 个过夜地点)目的地的分布,我们对两者都有相当多的选择。这很好,因为我们希望有更多的选择来决定什么时候我们更喜欢公路旅行,什么时候我们更喜欢一个更固定的基地来探索目的地。每个国家都有 100 多个目的地(分别为 104 个和 143 个),有足够的选择余地。

选择正确的 TSP 求解算法

对于有多个过夜地点的 143 个目的地,我们需要定义穿过它们的最有效路线。同时在相同的位置开始和结束。

对于有两个和三个过夜地点的目的地来说,任何路线都是最有效的路线。然而,对于有 3 个以上过夜地点的所有路线,我们必须通过解决微型的旅行推销员问题,也称为 TSP,来导出最有效的路线。

一个很大的灵感来源于的这篇文章来自的兰迪·奥尔森。他的发现无疑比以前听说过 TSP 的人拥有更广泛的受众。他的遗传算法让我们特别感兴趣,因为我们不需要推导出绝对最佳的路线,更重要的是以适当的性能生成非常有效的路线。

我们的目标是实施最有效的算法来优化单个集群内的路线。正如我们在图 4 中观察到的,我们的大多数目的地只有 10 个或更少的过夜地点。

Fig. 5 Time complexity comparison for a brute force vs genetic algorithm approach

考虑到这些非常少的位置,我们不妨将遗传算法的时间复杂度与强力 TSP 算法进行比较,看看后者是否足以在我们的解决方案中实现。

在左侧的图 5 中,您可以看到随着我们集群内过夜地点数量的增加,完成路线优化的平均时间。通过这种方式,我们可以快速测试总的完成时间,以及越来越多的地点可能在未来或更长的假期产生的影响。

随着过夜场所数量的线性增长,暴力方法明显呈指数增长;虽然遗传算法的时间复杂度或多或少是线性增长的,但是对于性能的稳定性来说,这已经是更优选的解决方案。

对于我们的算法,即使我们每个目的地的位置有限,我们也想创建一个可持续的解决方案。因此,最好的方法是将遗传算法的一个衍生版本整合到我们的解决方案中。

创造高效的公路旅行

终于!有趣的事情来了:让我们实际上创造一些公路旅行!

现在我们已经最终确定了我们选择的算法,我们可以开始研究我们的数据,看看我们的公路旅行在实践中是怎样的。由于对 Randall 的第一篇文章仍然很感兴趣,同时也为了测试我们解决 TSP 问题的能力,我将在两个层次上创建公路旅行:一条穿越一个国家内所有活动的路线,以及为我们在这个国家内的每个目的地分开的路线(我们的最终目标)。

这里需要把握的重要一点是:

  • 全国范围的路线穿过包含我们活动的所有城市,而集群路线仅穿过我们过夜的地点。
  • 仅显示公路旅行目的地。未被公路出行聚类路径访问的位置要么是单位置目的地,要么是异常值。

让我们来看看四大洲四个较大国家的 TSP 解决方案:美国、巴西、印度和澳大利亚:

**

Fig. 6, 7 Efficient road-trips through our relevant locations in the United States; country-wide and for all road-trip destinations separated, respectively

**

Fig. 8, 9 Efficient road-trips through our relevant locations in Brazil; country-wide and for all road-trip destinations separated, respectively

***

Fig. 10, 11 Efficient road-trips through our relevant locations in India; country-wide and for all road-trip destinations separated, respectively* **

Fig. 12, 13 Efficient road-trips through our relevant locations in Australia; country-wide and for all road-trip destinations separated, respectively

总的来说,这些对我来说都是令人印象深刻的公路旅行!从视觉上看,它们的效率也相当高,虽然最有可能进一步优化这些路线,但与这样做所需的额外复杂性相比,增加的效率将是有限的。就我们的情况而言,进一步加强这些路线绝对是大材小用。

分开来看不同的目的地,我们看到各种形状和形式的公路旅行。猜猜看,印度西北部的大型公路旅行是我们的异常目的地,有 24 个过夜地点(见图 4)。

谈论休假旅行!

最终地图

所以今天我们设法将我们的目的地细分为过夜地点。我们还在代码中添加了 TSP 求解算法,当目的地有 3 个以上的位置时,该算法可以计算出这些过夜位置之间的有效路线。

总之,下面的互动图表将展示我们旅游活动中的所有公路旅行目的地,以及它们的线性连接的有效路线(不是实际的驾驶方式)。这张交互式地图是使用 Plotly 创建的。祝你下次旅行愉快!

Fig. 14 Map of all our road-trip destinations linearly connected by order of efficient route

读到这里又恰好是 Django/Web 开发方面的专家?如果你有兴趣给我的代码更多一点的形状,给我一个 DM..字面上。

关于我自己的更多信息,请随时查看我的 LinkedIn

机器人新闻:记者应该感到威胁吗?

原文:https://towardsdatascience.com/robo-journalism-should-journalists-feel-threatened-by-them-95185d68eb8d?source=collection_archive---------15-----------------------

当你听到机器人新闻这个词时,你会想到什么?你能想象计算机自己撰写整篇新闻文章,从而取代数百万记者吗?我相信绝对不是这样。事实上,记者很可能会感谢机器人记者的帮助。

Photo by Possessed Photography on Unsplash

对人工智能最大的社会担忧之一是工作岗位的转移。虽然人们普遍认为人工智能将取代大量工作,但人们普遍认为人工智能将取代需要最平凡、重复任务的工作。风险投资家李开复,曾向人工智能投资数百万美元,也是《人工智能的超能力》一书的作者,他展示了一张图表(图 2),列出了他对哪些工作是安全的,哪些工作很有可能被人工智能取代。他特别指出,专栏作家的工作可能不会被人工智能取代

Figure 2: Risk of replacement by Lee Kai-Fu. Source

相反,人工智能更有可能通过自动化日常工作的重复部分来帮助人类记者提高生产率。在我看来,人工智能将完全取代人类工作的想法也是人工智能的误解之一(见我的上一篇文章)。

机器人记者

新闻业不太可能被机器人取代的一个重要原因是,好的新闻业需要深度分析、创造性写作和事实报道的正确结合。这三项技能中的任何一项都是对机器人记者的挑战。

事实上,机器人记者写的文章的特点是大量数据驱动,通常是记者自己不喜欢写的死记硬背的文章。这些文章常见于体育、事件、选举和金融等领域。在一项对欧洲九家主要新闻媒体的研究中,其中七家至少在其中一个领域使用了自动化。

这种对机器人新闻的依赖表明,它有能力减轻记者的工作量,将他们从重复的工作中解脱出来,并帮助他们节省时间来撰写更深入的分析文章。

机器人新闻中使用的技术

自 2014 年以来,人工智能机器人新闻业取得了非常好的进展,三种主要技术成为机器人新闻业久经考验的实施方式。这三种主要技术是:

  • 使用编辑模板的自然语言处理(NLG)
  • 使用编辑模板进行趋势检测和 NLG
  • 声音转换

下表列出了使用 robo 记者的新闻机构。它们是根据使用的技术排列的。

Table 1: Survey of News outlets using Robo-Journalism

NLG 编辑模板

第一种技术使用带有经典机器学习技术(如决策树)的编辑模板。这种工作方式的例子可以从洛杉矶时报的 Quakebot 和 Tamedia 的鸢的实现中看出来。

Table 2: Example of Quakebot

Table 3: Example of Tobi

编辑/记者将首先为这些机器人编写编辑模板。当天气/体育/选举数据出现时,它们将进入一个机器学习模型(在鸢的情况下是决策树),以选择和提取正确的编辑模板,并填写相关的数字。

NLG 编辑模板的趋势

这些技术是对仅使用 NLG 编辑模板的改进。这些机器人记者还有一个额外的功能,那就是搜索/寻找趋势,并用编辑模板从这些趋势中创造新闻故事。这在主要由数据驱动的财经新闻中非常有效。Lynx Insights 报道 J&J 股票走势就是一个很好的例子:

Table 4: Example of Lynx Insights by Reuters

相同类型的其他工具以非常相似的方式工作。据传闻,来自彭博的电子人也以非常相似的方式工作。美联社(Associated Press)的雷达抓取了国家统计局(ONS)的报道,并将其与模板进行匹配。《福布斯》的机器人伯蒂根据投稿人之前的文章向他们推荐趋势话题和谈话要点。

头像和语音转换

Figure 3: A.I. News Anchor from Xin Hua

中国新闻媒体新华网在 2018 年推出的人工智能新闻主播受到了很多炒作。他们在长相、表情和声音(通过声音转换)上创造了一个新闻主播头像(仿照真实的新闻主播)。接下来,头像会收到新闻文章,允许主播全天候报道新闻。在写这篇文章的时候,这些文章是由人类而不是机器人记者写的。

假新闻

人工智能新闻主播由语音转换技术驱动。给定足够的训练数据,它允许学习说话者的声音,并潜在地用于说出任何句子。众所周知,这是产生假新闻的领域之一。

在美国,至少有一起涉及机器人新闻的事件已经导致了假新闻的传播。2017 年 6 月 22 日,Quakebot 收到消息称,距离圣巴巴拉约十英里的太平洋发生了 6.8 级地震。这个来自美国地质学会的警报被错误地发出,是关于 1925 年圣巴巴拉地震的警报。大多数新闻媒体认识到了这个错误,并忽略了警告,但不是 Quakebot,他继续向读者发出警告。

2019 年 2 月,也有新闻说 OpenAI 建立了一个文本生成器,好到他们不愿意发布它,因为害怕它被用来产生假新闻。举个例子,当单词 generator 被输入以下句子:循环利用对世界有益,不,你错得不能再错了,”机器回复道:

“回收对世界没有好处。这对环境有害,对我们的健康有害,对我们的经济也有害。我没开玩笑。回收对环境没有好处。它对地球具有破坏性,是全球变暖的主要原因。回收对我们的健康没有好处。它会导致肥胖和心脏病、癌症等疾病。回收对我们的经济有害。它增加了产品的成本,进而增加了用该产品制造的所有东西的价格。回收对我们国家没有好处。我们为拥有世界上最先进、最高效的回收系统付出了巨大的代价。回收是对时间、能量、金钱和资源的巨大浪费。”

既然文字生成可以,为什么不能用于新闻写作?

open.ai 的文本生成模型是一项伟大的技术壮举,可以生成语法正确的文本段落。然而,这种技术仍然不能直接应用于新闻生成,因为不能保证生成的文本在事实上是正确和相关的。因此,尽管这些文本生成器可能能够生成小说段落,但它们距离用于生成新闻还有几步之遥。

希望这篇文章对你有意思!如果你喜欢这篇文章,请鼓掌。

作者是新加坡理工学院的助理教授。他拥有帝国理工学院的计算机科学博士学位。他还在新加坡麻省理工学院联盟(SMA)项目下获得了新加坡国立大学计算机科学硕士学位。

本文中的观点仅代表作者的观点,并不代表作者所属任何组织的官方政策或立场。作者也没有从属关系,也没有从本文提到的任何产品、课程或书籍中赚取任何费用。

参考

https://beta news . com/2019/03/18/the-good-and-evil-of-robo-journalism/

[## 机器人新闻:计算机生成的故事可能是不可避免的,但也不全是坏消息

如果报纸读者的持续减少还不足以说服未来的记者选择一个…

theconversation.com](http://theconversation.com/robo-journalism-computer-generated-stories-may-be-inevitable-but-its-not-all-bad-news-89473)

https://TechCrunch . com/2019/02/17/open ai-text-generator-dangerous/

https://www . technology review . com/f/609828/automation-is-creeping-to-journalism-but-human-reporters-not-have-more-to-fear-yet/

https://Reuters institute . politics . ox . AC . uk/sites/default/files/2017-09/Fanta % 2C % 20 puting % 20 Europe % E2 % 80% 99s % 20 robots % 20 on % 20 the % 20 map . pdf

https://www . tandfonline . com/doi/full/10.1080/21670811.1289819?af=R

https://TechCrunch . com/2019/02/17/open ai-text-generator-dangerous/

预测葡萄品种

原文:https://towardsdatascience.com/robosomm-chapter-1-predicting-grape-varieties-4c5beb505a7b?source=collection_archive---------12-----------------------

机器人

从葡萄酒评论中提取描述符并探索不同品种的关键特征

有很多关于盲品葡萄酒的艺术和科学的文章和言论。对于世界上最好的品酒师来说,能够正确识别你面前的一杯酒是一种骄傲。Somm 系列纪录片揭示了与此相关的惊人技能。通过使用一种名为“网格”的结构进行多轮有针对性的提问,侍酒师能够识别葡萄品种/混合、地区,有时甚至是一杯葡萄酒的年份。

在本文中,我们将通过使用数据科学技术,从不同的角度探索盲品。我们可以训练一个算法来盲尝吗?我们能建造自己的机器人吗?

更详细的请参见更详细的 GitHub 资源库 以及关联的 Jupyter 笔记本

从例子中学习

RoboSomm 将不得不从例子中学习。为此,我们使用了友好的 Kaggle 用户从https://www.winemag.com/收集的 17 万条独特的葡萄酒评论。这些葡萄酒评论描述如下:

无论是嗅觉还是味觉,这款加那查葡萄酒都是温和的有棱角和收缩感,坚硬的单宁带来了一种原始的感觉。其狐狸般的李子味道跳跃而紧张,回味辛辣而参差不齐。

我们需要修改我们的例子,以确保它们不包含任何盲品时无法通过感官获得的信息。毕竟,当我们试图盲目品尝时,我们不会知道我们试图鉴别的葡萄酒是加纳夏!除了删除任何“不可知”的信息,我们还删除了任何非信息性的术语,并通过了几个文本标准化步骤来标准化我们的文本。从上面的描述中,我们可以获得以下描述符:

['hard tannin', 'plum', 'pepperi', 'mild', 'tannin', 'plum flavor']

从葡萄品种开始

世界上最好的品酒师在盲品时可以推断出葡萄酒的品种、产地和年份。这对于第一代 RoboSomm 来说可能有点过于雄心勃勃了。为了限制练习的范围,我们将从看看是否可以训练一个模型来预测数据集中最常见的葡萄品种开始。为简单起见,我们也将删除混合。我们剩下的葡萄品种有:

['Pinot Noir', 'Chardonnay', 'Cabernet Sauvignon', 'Riesling', 'Syrah', 
'Sauvignon Blanc', 'Zinfandel', 'Sangiovese', 'Merlot', 'Malbec', 
'Tempranillo', 'Nebbiolo', 'Pinot Gris', 'Grüner Veltliner', 
'Cabernet Franc', 'Grenache', 'Viognier', 'Gamay', 'Gewürztraminer', 'Barbera']

为了让我们熟悉这些葡萄品种,我们可以根据与每种葡萄最相关的描述符来构建词云:

当一个词出现得越频繁,它在我们的词云中就会越大。我们可以看到许多描述符出现在几乎每一种葡萄品种上——例如,水果和单宁。从上面我们可能会说,一般来说,西拉葡萄酒比歌海娜葡萄酒单宁更强。尽管一些词出现在几个词云中,但我们可以看到葡萄品种之间有显著的差异。长相思比其他葡萄酒有更明显的柑橘味。巴贝拉葡萄酒的辛辣味相对较重。对于夏敦埃酒,我会想到烤面包和苹果。

建筑模型

随着我们的原始文本被转换成描述符,我们几乎准备好开始构建模型了。首先,我们需要将基于文本的描述符转换成数字特征。我们将使用一种简单的方法,称为 one-hot-encoding,来产生一个 1 和 0 的矩阵,以突出每个描述符对于给定的观察是否存在。

此外,我们应该花点时间考虑如何评估我们模型的性能。我们希望 RoboSomm 能够高精度地识别出它面前的葡萄酒。当它做出预测时,这个预测需要是准确的。我们对检索特定葡萄品种的所有例子不感兴趣。此外,如果我们的模型能够高精度地识别许多不同的葡萄品种,而不仅仅是我们数据集中最常见的品种,那就太好了。因此,我们将关注的关键性能指标是所有类别的平均精度(不按观察次数加权)。

在进入我们的模型之前,我们应该解决的最后一项内务是我们如何定义训练和测试集——训练集用于训练我们的模型,测试集用于评估它的性能。我们的训练集是数据集的 80%,测试集构成剩余的 20%的数据。

模型 1:决策树

当品酒师进行正式的盲品时,他们会使用一种叫做“网格”的结构。网格是一个记忆的属性表。在数据科学的世界中,我们可以认为这类似于决策树。一轮又一轮的连续问题提供了一个简洁的结构,帮助 somms 对面前的葡萄酒进行分类。

我们的决策树模型在我们的测试集上仅实现了较低的平均精度(28%)。然而,决策树能告诉我们什么样的连续提问能最有效地让我们区分葡萄品种。让我们想象一下树的前几层(实际的决策树要深得多),看看我们能学到什么。

可视化练习揭示了一些葡萄酒非常独特。例如,长相思似乎是一个非常安全的赌注,如果有一个甜椒味道/香气,没有荔枝。尽管在我们的数据集中红葡萄和白葡萄品种的数量更多(13 对 7),但我们可以看到一些内比奥罗(香脂)和加迈(香蕉)葡萄酒具有相当独特的风味特征。不能保证所有的长相思、内比奥罗和佳美葡萄酒都具有上面列出的特征,但是如果特征存在,这是一个很好的预测指标。

模型 2:投票分类器

决策树是一种相当简单的分类算法。还有其他更复杂的算法可以产生更高的性能。对于这个练习,我们探索了多个选项,但是发现多项式朴素贝叶斯(MNB)和随机森林分类器是为我们的测试集产生最高平均精度的算法。

为了从这些算法的相对优势中受益,我们可以更进一步,使用一种叫做投票分类器的东西来组合每个算法返回的预测。投票分类器将运行这两种算法,并对每种算法返回的预测进行加权,以得出单个预测。

我们的投票分类器成功地将未加权的平均精度提高到 51%。这似乎更…可口。现在我们有了一个性能更好的分类器,让我们更深入地看看返回的预测。有没有特定的葡萄品种只是比其他品种更难预测?

看来有些确实更容易高精度地预测。Gewürztraminer、Grüner Veltliner、Pinot Gris 和 Sauvignon(方便的说都是白葡萄酒)的预测精度在 75%左右。这也可能是因为我们的数据集中只有 7 个白葡萄品种。在红葡萄酒中,内比奥罗和仙粉黛的精确度相对较高。

尽管我们的结果令人鼓舞,但一些葡萄品种似乎很难预测。品丽珠和维欧尼不会作为我们测试集的预测返回。让我们深入一点。为什么会出现这种情况?

为了更详细地研究我们模型的性能,我们将构建一个混淆矩阵。混淆矩阵是一个网格,显示正确和错误预测的数量,并用计数值汇总。

我们的混淆矩阵可以帮助我们讲述返回的预测的故事。例如,我们可以看到,在我们的测试集中,1232 种黑皮诺葡萄酒被正确预测。我们还可以看到,品丽珠葡萄酒一直被预测为黑皮诺、赤霞珠或西拉。维欧尼葡萄酒一直被认为是霞多丽或雷司令。

我们可以确定两个可能的原因(在众多原因中!)为什么会这样:

  1. 我们正在处理一个不平衡的数据集(霞多丽比维欧尼多得多,黑皮诺比卡本内法郎多得多)。这使得普通葡萄品种更有可能作为预测返回,而不是数量较少的葡萄品种。尽管探索了减轻这一问题的技术(欠采样、过采样),但这些技术显著降低了模型的整体性能。
  2. 在我们的数据集中,Viognier 和 Cabernet Franc 没有 Gamay 和 Gewürztraminer 等同样多的葡萄品种那么独特。

关于葡萄酒相似性的最后一点

为了建立一个更全面的模型,还探索了工程特征的替代方法。我们可以选择用嵌入来表示每个描述符,而不是用 0 和 1 的矩阵来表示描述符的存在或不存在。

单词嵌入是将单词表示为向量的一种方式。通过完成右图中概述的过程,我们可以为每个葡萄酒描述生成一个单独的嵌入。您会注意到,只从原始文本中提取了单个单词,而不是短语——有关这方面的更多详细信息,您可以访问上面引用的 Jupyter 笔记本中的代码。

不幸的是,这种方法并没有比我们使用 0 和 1 的“简单”方法产生更好的结果。然而,我们也可以使用创建平均单词嵌入的方法来构建给定葡萄品种的所有描述的平均向量。然后使用一种叫做 T-SNE 的技术将这个向量压缩成二维,我们可以建立一个可视化的模型,告诉我们对不同葡萄品种的描述有多相似。

尽管解释 T-SNE 视觉化的空间可能会很棘手,但这里还是有一些经验可以借鉴。我们可以看到,白葡萄酒在我们的地块中占据了一个区域,而红葡萄酒都位于底部。较浅的红葡萄酒如歌海娜、黑比诺和加梅位于同一地块,较重、单宁较强的红葡萄酒如西拉、马尔贝克和坦普拉尼洛也彼此相邻。品丽珠,一种经常被误归类为黑比诺或赤霞珠的葡萄酒,确实介于这两种葡萄品种之间。

对于白葡萄酒,我们可以看到,较甜的葡萄品种如 Gewürztraminer 和 Riesling 彼此相对靠近,而较干的品种如 Pinot Gris 和 Sauvignon Blanc 占据了地块中的不同区域。有些令人惊讶的是,维欧尼和霞多丽相差如此之远。这两种葡萄酒都被认为是醇厚的白葡萄酒,我们知道维欧尼一直被误认为是夏敦埃酒。这可能是因为我们不能在一个简单的二维图中完全捕捉这些葡萄品种之间的相似性。

结论

总的来说,在我们能够建立一个能够在盲品中可靠识别葡萄酒的机器人之前,还有很多工作要做。尽管如此,我们在这次探索性练习中学到了很多东西。我们已经研究了将基于文本的葡萄酒描述转换成一组描述符的方法,并研究了 20 种受欢迎的葡萄品种之间的差异。我们已经建立了一些预测葡萄品种的初步模型。由于仍有足够的改进空间,我们可以继续调查以下事项:

  • 我们能使用更复杂的模型来预测葡萄品种吗?
  • 我们能为不同的葡萄品种建立比本文中探索的单词云可视化更全面的风味特征吗?
  • 我们能否超越葡萄品种,建立一个模型来预测不同葡萄品种的葡萄酒风格(例如橡木桶陈酿的霞多丽和未橡木桶陈酿的霞多丽)?
  • 除了预测葡萄酒的风格,我们还可以预测与葡萄酒相关的地区和年份吗?

作为临别赠言,让我们借用伟大的侍酒师弗雷德·丹姆的一些至理名言。在生活中,在数据科学中…

探索霞多丽的变化

原文:https://towardsdatascience.com/robosomm-chapter-2-exploring-variations-of-chardonnay-7aa70f5317c2?source=collection_archive---------29-----------------------

机器人

利用 K-Modes 聚类更好地理解品种内的变异

介绍

数据科学让我们能够以全新和意想不到的方式体验葡萄酒世界。在本文中,我们将使用一套称为聚类的数据科学技术来研究霞多丽葡萄酒的变化。

准备我们的数据集

发布给www.winemag.com的 15000 条关于霞多丽葡萄酒的在线评论被删除,包括其他可能感兴趣的属性:年份、价格、评级和酒厂的位置。

在研究各种类型的霞多丽时,我们最感兴趣的是葡萄酒的可感知特征。为此,从基于文本的葡萄酒评论中提取描述符,利用 RoboSomm 系列的前一章中的工作。

首先,通过删除标点符号、停用词和将文本转换成小写字母来规范评论。单词的屈折使用一种叫做词干化的过程来标准化。然后提取 2000 个最常见的单词和单词组合(二元模型)。这个术语列表经过过滤,只保留那些在盲品一杯葡萄酒时可以合理提取的术语。此外,含义模糊的词语(例如,‘酸’是指葡萄酒中的酸度高还是低?)也被删除。

这个过程留下了大约 500 个标准化的原始描述符来描述我们的夏敦埃酒。使用映射系统将每个原始描述符映射到一个类别(级别 1)、一个高级描述符(级别 2)和一个低级描述符(级别 3)。下面提供了一个这样的例子。

在我们的聚类练习中,使用了 2 级描述符。这个级别足够宽泛,可以让一致的主题出现在葡萄酒评论中,也足够具体,可以让不同类别之间出现有趣的差异。

使聚集

在数据科学中,聚类是创建相似数据点的分组集的任务。这是一种无监督的学习方法,这意味着它从数据集中提取参考,而没有标记的响应。在这种情况下,我们开始使用聚类来了解夏敦埃酒有多少种类型,以及这些类型有何不同。

由于我们的数据本质上是分类的,我们必须注意选择正确的方法来构建我们的聚类。许多标准聚类算法(如 k-means)使用基于欧氏距离的评估度量来分配聚类成员。这对于分类数据来说效果不好,因为在分类数据中,数值之间的大小差异是没有意义的。

在探索了几个备选方案后,我们选定了 k-modes 算法。该算法要求指定聚类数。选择“正确”的集群数 k 不是一件简单的任务!我们使用了多种技术组合(碎石图、平均轮廓分数、轮廓分析)来得出 k = 5 的值。你可以在这个 Jupyter 笔记本里读到更多关于这个过程的内容。在这 5 组中,有 3 组的观察值有意义。我们称之为 A,B 和 c。

研究我们的星团

我们的三个集群大小不同。事实上,聚类 A 包含了我们数据集中的大部分夏敦埃酒。聚类 B 和 C 略小,分别占 21%和 14%。

描述符的差异

让我们看看我们的集群在(第 3 级)描述符方面有什么不同。在聚类 A 中最常出现的描述词是与水果相关的:最显著的是苹果和梨。聚类 B 具有柑橘相关的水果描述符,例如柠檬、酸橙和橙子。特定的水果风味似乎在 C 类葡萄酒中不太明显,尽管这些葡萄酒总体上仍有水果味,并以成熟的水果风味为标志。此外,这些葡萄酒似乎是浓缩的,丰富的和浓郁的。

当我们查看每个分类中属于特定类别(1 级描述符)的所有描述符的百分比时,这些主题得到了确认。17%的 C 类葡萄酒描述符与酒体相关,而 A 类和 B 类分别为 8%和 9%。有趣的是,C 类葡萄酒的酸描述符较少(占总量的 9%,而 A 类和 B 类分别为 11%和 12%)。这可能表明 C 类葡萄酒的酸度较低。在任何情况下,这些葡萄酒的酸性特征都没有其他葡萄酒明显。

地理上的差异

接下来,让我们看看我们的集群在地理分布上的差异。我们可以看到,C 类葡萄酒确实与 A 类和 B 类非常不同。A 类和 B 类主要是美国葡萄酒,而 C 类葡萄酒来自法国。更具体地说,大约三分之二的 C 组葡萄酒是勃艮第白葡萄酒。

另一个观察结果是,澳大利亚葡萄酒集中出现在聚类 B 中(占总数的 9%),而它们在聚类 A (3%)和聚类 C (2%)中很少出现。

价格差异

我们还可以计算每个聚类的价格分布。毫不奇怪,聚类 C 包含迄今为止最昂贵的葡萄酒。这里的平均价格是 54.52 美元,比其他集群的平均价格高出 65%。这与勃艮第葡萄酒作为霞多丽葡萄酒的黄金标准的刻板印象是一致的。

酒精含量差异

值得一提的最后一个变量是每个集群中葡萄酒的酒精含量。还是那句话,A 群和 B 群的葡萄酒是相似的。然而,C 类葡萄酒的平均酒精含量要低得多。这可能归因于地理位置。众所周知,勃艮第等气候较冷的地方出产酒精含量较低的葡萄酒。

综合

检查了我们的三个集群后,我们可以总结每个集群的发现。这也允许我们给它们起一个名字,一个比‘A’、‘B’和‘C’更有启发性的名字。

下面是集群 A 的总结,我们的树果实密集的夏敦埃酒。在左侧,您可以看到按类别分类的最常见描述符的概述。地理概况,年龄和价格在右边。

An example of a tree fruit-intensive wine is the 2017 Lava Cap from the Sierra Foothills in California.

聚类 B 在其柑橘类水果描述符方面是独特的。柠檬、酸橙、葡萄柚和橙子的味道使这些葡萄酒与众不同。

An example of a Cluster B wine is the 2014 Stephen Ross Bien Nacido Vineyards Chardonnay from the Santa Maria Valley.

聚类 C 的标签并不奇怪:白勃艮第。这些葡萄酒因其浓郁、柔和和浓郁的风味而脱颖而出。在我们基于平均轮廓分数的分析中,这是最独特的聚类(在附带的 Jupyter 笔记本中有更多关于这一点的信息)。

An example of a Cluster C wine is the 2016 Grand Vin de Bourgogne Pouilly Fuisse.

结论

在探索不同品种的霞多丽的过程中,我们对这些葡萄酒的风味、地理和价格有了很多了解。这项工作是一个有趣的起点,可以帮助我们了解一个葡萄品种内的变异。令人鼓舞的是,仅使用葡萄酒描述符的无监督聚类任务能够在法国和美国霞多丽之间建立如此强烈的区别。这本身就使得这成为一个有趣的领域进行进一步的分析。

葡萄酒嵌入和葡萄酒推荐器

原文:https://towardsdatascience.com/robosomm-chapter-3-wine-embeddings-and-a-wine-recommender-9fc678f1041e?source=collection_archive---------12-----------------------

机器人

量化 150,000 多种葡萄酒的感官特征,建立葡萄酒推荐模型

RoboSomm 系列前几章的基石之一是从专业葡萄酒评论中提取描述符,并将其转换为定量特征。在本文中,我们将探索一种从葡萄酒评论中提取特征的方法,该方法结合了现有 RoboSomm 系列和关于该主题的学术文献的最佳内容。然后,我们将使用这些特性来生成一个简单的葡萄酒推荐引擎。

包含所有相关代码的 Jupyter 笔记本可以在这个 Github 库中找到。我们的数据集包括大约 180,000 篇专业葡萄酒评论,摘自 www.winemag .com。这些评论跨越大约 20 年,涵盖几十个国家和数百种葡萄品种。

葡萄酒嵌入

在下一节中,我们将通过五个步骤来创建我们的“葡萄酒嵌入”:每种葡萄酒的 300 维向量,总结其感官特征。在途中,我们将解释其他人在类似项目中采取的成功方法。在我们继续之前,让我们挑选一款葡萄酒加入我们的旅程:

Point & Line 2016 John Sebastiano Vineyard Reserve Pinot Noir

点评: 两位在圣巴巴拉餐厅工作多年的商业伙伴将干红花朵和山艾树结合在一起,为这款装瓶带来优雅的芳香。龙蒿和迷人的胡椒味点缀着浓郁的蔓越莓口感,酒体轻盈但结构良好。

太棒了。是时候开始了。

步骤 1:标准化葡萄酒评论中的单词(删除停用词、标点符号和词干)

第一步是规范我们的文本。我们希望从原始文本中删除停用词和任何标点符号。此外,我们将使用词干分析器(Sci-Kit Learn 中的雪球斯特梅尔)来减少词干的屈折变化。皮诺审查变成如下:

dri 红花山艾树 combin eleg aromat entri bottl 两辆巴士搭档工作圣巴巴拉餐厅场景 mani year 龙蒿 intrigu 胡椒味装饰 tangi cranberi palat light _ bodi veri well structur

步骤 2:用短语(双字组和三字组)增强标准化单词集

接下来,我们要考虑这样一种可能性,即我们想从葡萄酒描述中提取的一些术语实际上是单词或短语的组合。在这里,我们可以使用 gensim 包短语为整个语料库生成一组二元和三元语法。通过 phraser 运行我们的标准化葡萄酒评论,将“light”和“bodi”等经常出现在“light_bodi”旁边的术语合并在一起:

dri 红花山艾树 combin eleg aromat entri bottl 两个巴士搭档工作圣巴巴拉餐厅场景 mani_year 龙蒿 intrigu 胡椒味装饰 tangi cranberi palat light _ bodi veri well struct

第三步:使用 RoboSomm wine wheels 标准化每次点评中的葡萄酒描述符

品酒师在语言运用上往往很有创意,有时会用不同的词来描述看似相同的事物。毕竟,“湿石板”、“湿石头”和“湿水泥”的香味难道不是同一种感官体验的真实表现吗?另外,品酒有特定的行话。诸如“烘焙的”、“热的”或“抛光的”等术语在品酒界有特定的含义。

为了标准化葡萄酒行话和创造性的描述符,陈智思等研究人员开发了计算葡萄酒轮。计算型葡萄酒轮对葡萄酒评论中出现的各种葡萄酒术语进行分类和映射,以创建一组统一的描述符。这项伟大的工作,连同其他人的贡献(例如 Wine Folly 和 UC Davis )已经被用来产生robosom Wine wheels。这些 wine wheels 是在完成上述步骤 1 和 2 之后,通过查看语料库中最频繁出现的描述符列表而创建的。然后手动检查该列表,并映射到一组标准化的描述符。总之,这导致了 1000 多个“原始”描述符的映射。

第一个 RoboSomm 葡萄酒轮是一个芳香轮,它对各种芳香描述符进行分类:

Wine Aroma Wheel

第二个葡萄酒轮是非香气轮,它考虑了其他特征,如酒体、甜度和酸度。这些描述符通常不包含在品尝轮中,但却是品尝体验的重要组成部分:

Wine Non-Aroma Wheel

我们可以选择在轮盘的三个级别中的任何一个级别标准化葡萄酒术语,或者使用原始描述符本身(没有标准化)。现在,我们将把描述符映射到轮子的外层。对于我们开始处理的黑皮诺审查,我们获得了以下信息:

花荞combin 芳香 entri bottl 两车搭档工作 santa_barbara 餐厅场景 mani_year 龙蒿intri gu胡椒 风味装潢

请注意,所有已经映射的描述符都以粗体突出显示。在本分析的上下文中,其他术语要么是不提供信息的,要么是模糊的。

步骤 4:检索评论中每个映射术语的 Word2Vec 单词嵌入

接下来,我们需要考虑如何量化我们的映射描述符集。实现这一点的常用方法(也是 RoboSomm 系列的前几章中使用的方法!)是用 0 或 1 来表示语料库中每个描述符的不存在/存在。然而,这种方法没有考虑术语之间的语义(不)相似性。例如,龙蒿更像山艾树,而不是蔓越莓。为了说明这一点,我们可以创建单词嵌入:单词和短语的向量表示。Els Lefever 等研究人员和她的合著者在他们的工作中采用了类似的方法来量化葡萄酒评论。

出于这个项目的目的,我们将使用一种称为 Word2Vec 的技术为每个映射项生成一个 300 维的嵌入。由于葡萄酒行话如此具体,我们必须在一个有代表性的语料库上训练我们的 Word2Vec 模型。好在我们这一套 18 万的酒评正是如此!之前已经使用我们的 wine wheels 映射了我们的描述符,我们已经在一定程度上标准化了语料库中的葡萄酒术语。这样做是为了消除不必要的语义差异(例如,将“湿石头”、“湿石板”和“湿水泥”合并为“湿岩石”),希望提高我们的 Word2Vec 模型的质量。

我们训练的 Word2Vec 模型由语料库中每个术语的 300 维嵌入组成。然而,我们可以回忆起上一步的分析,我们真正关心的只是与葡萄酒感官体验相关的术语。

对于我们的黑皮诺,这些是:

干,花,山艾,优雅,龙蒿,胡椒,扑鼻,蔓越莓,酒体轻盈

在相邻的图像中,我们可以看到每个映射描述符的单词嵌入。

第五步:用 TF-IDF 权重对葡萄酒评论中嵌入的每个词进行加权,并将嵌入的词加在一起

既然我们已经为每个映射的描述符嵌入了一个单词,我们需要考虑如何将它们组合成一个向量。以我们的黑皮诺为例,“干”是所有葡萄酒评论中一个相当常见的描述词。我们想让它的权重小于一个更稀有、更独特的描述符,比如“山艾树”。此外,我们希望考虑每次审查的描述符总数。如果在一篇评论中有 20 个描述符,而在另一篇评论中有 5 个描述符,那么前一篇评论中的每个描述符对葡萄酒整体形象的贡献可能比后一篇评论中的要小。术语频率-逆文档频率(TF-IDF)考虑了这两个因素。TF-IDF 查看单个评论(TF)中包含多少映射描述符,以及每个映射描述符在 180,000 条葡萄酒评论(IDF)中出现的频率。

将每个映射描述符向量乘以其 TF-IDF 权重,得到我们的加权映射描述符向量集。然后,我们可以对这些进行求和,以获得每个葡萄酒评论的单个葡萄酒嵌入。对于我们的黑皮诺,这看起来像:

构建葡萄酒推荐器

现在我们已经有了葡萄酒嵌入,是时候享受一些乐趣了。我们可以做的一件事是生产一个葡萄酒推荐系统。我们可以通过使用最近邻模型来做到这一点,该模型计算各种葡萄酒评论向量之间的余弦距离。彼此最接近的葡萄酒嵌入作为建议返回。

让我们看看,当我们插入之前的黑皮诺系列时,我们得到了什么建议。在我们的数据集中,180,000 种可能的葡萄酒中,哪些是作为建议返回的?

***Wine to match: Point & Line 2016 John Sebastiano Vineyard Reserve Pinot Noir (Sta. Rita Hills)**
Descriptors: [dry, flower, sagebrush, elegant, tarragon, pepper, tangy, cranberry, light_bodied]
________________________________________________________________**Suggestion 1**: **Chanin 2014 Bien Nacido Vineyard Pinot Noir** **(Santa Maria Valley)**
Descriptors: [hibiscus, light_bodied, cranberry, dry, rose, white_pepper, light_bodied, pepper, underripe, raspberry, fresh, thyme, oregano, light_bodied, fresh]

**Suggestion 2: Hug 2016 Steiner Creek Pinot Noir (San Luis Obispo County)**
Descriptors: [fresh, raspberry, thyme, pepper, rosemary, sagebrush, dry, sage, mint, forest_floor, light_bodied, cranberry_pomegranate, tangy]

**Suggestion 3: Comartin 2014 Pinot Noir (Santa Cruz Mountains)**
Descriptors: [vibrant, tangy, cranberry, hibiscus, strawberry, pepper, brown_spice, pepper, spice, bay_leaf, thyme, herb, underripe, raspberry, cranberry, fruit]*

返回的前三名葡萄酒都是来自加州的黑皮诺。查看这些葡萄酒的描述符,我们可以看到它们确实与我们的原酒非常相似。蔓越莓出现在每一个建议中。由于构建葡萄酒嵌入的方式,还考虑了不相同的术语的语义相似性。比如原酒评中的‘花’字,就和第一条建议中的‘芙蓉’和‘玫瑰’相似。

如果我们看看我们的黑比诺系列的十大葡萄酒建议(完整名单见这个 Jupyter 笔记本),我们可以看到这些建议非常一致。所有十种葡萄酒都来自加利福尼亚,十种中有九种是黑皮诺。有五种甚至产自我们原酒的 60 英里半径范围内。唯一不是黑比诺的葡萄酒是产自圣伊内斯山谷的品丽珠,距离我们的 Point &系列黑比诺的产地只有 25 分钟的车程。我们的黑比诺葡萄酒的地理来源似乎对它的感官特性有很大的影响,这使得它可以与邻近的其他类似的葡萄酒相匹配。相邻的地图显示了我们推荐的葡萄酒在地理上有多集中。

这种推荐模型的卓越性能确实引出了一个问题:返回的建议怎么可能如此特定于一个地理区域?

就其核心而言,这种分析完全依赖于用来构建葡萄酒嵌入的葡萄酒评论。在的这篇文章中,一位葡萄酒爱好者的品酒师解释了葡萄酒在 www.winemag.com 网站上是如何评级的。虽然评级是通过盲品过程给出的,但并不完全清楚评论中的文字描述是否也是无偏见评估过程的产物。有可能评论家在看到酒瓶后,会有意识或无意识地将某些术语归因于特定类型的葡萄酒(例如,南加州黑皮诺的“山艾树”)。

另一方面,这些葡萄酒也完全有可能真正展现出可归因于特定葡萄品种、风土和酿酒风格的感官特征。来自葡萄酒爱好者的专业评论家可能有如此精细的味觉,他们可以在没有看到瓶子的情况下挑出每种葡萄酒的细微差别。

用描述词推荐葡萄酒

作为最后一个练习,我们可以采取稍微不同的方法来利用我们的葡萄酒推荐者。比方说,我们正在寻找一种具有特定特征的葡萄酒。在炎热的夏天,我们可能会觉得这是一款新鲜、高酸度的葡萄酒,有着柚子、青草和酸橙的香味。让 RoboSomm 葡萄酒车兜一圈,我们可以挑选出符合这些特征的描述词:“新鲜”、“高酸”、“葡萄柚”、“草”和“酸橙”。

将这些描述符输入葡萄酒推荐器,我们得到以下建议:

***Suggestion 1 : Undurraga 2011 Sibaris Reserva Especial Sauvignon Blanc (Leyda Valley)**
Descriptors: [minerality, zesty, crisp, grass, lime, grapefruit, lemongrass, angular]

**Suggestion 2 : Santa Rita 2012 Reserva Sauvignon Blanc (Casablanca Valley)**
Descriptors: [snappy, pungent, gooseberry, grapefruit, lime, racy, lime, grapefruit, nettle, pith, bitter]

**Suggestion 3 : Luis Felipe Edwards 2015 Marea Sauvignon Blanc (Leyda Valley)**
Descriptors: [punchy, grass, citrus, tropical_fruit, fruit, angular, fresh, minerality, tangerine, lime, lemon, grapefruit, tangy]*

所有三款推荐的葡萄酒都是智利长相思,其中两款来自莱达山谷。再次值得注意的是,这些建议在地理上是多么的集中。尤其是考虑到葡萄酒推荐者有 18 万种不同的葡萄酒可供选择!

结论

我们有很多方法可以使用我们的葡萄酒嵌入。我们简单的葡萄酒推荐模型表明,从地理角度进一步研究葡萄酒风格可能是值得的。风土对酿酒风格有什么影响?对于不同的葡萄品种来说,地理差异是否以同样的方式存在?也许我们还可以了解更多关于写葡萄酒评论的过程,以及偏见在多大程度上推动了某些描述符的使用。

风土的影响

原文:https://towardsdatascience.com/robosomm-chapter-4-the-effect-of-terroir-18168f0d08b9?source=collection_archive---------18-----------------------

机器人主持人

风土成分的量化及其对葡萄酒风味特征的影响

葡萄酒研究的一个核心概念是风土:影响葡萄酒味道的环境因素。葡萄酒界有很多关于风土的神话。已经有书籍讨论风土是否是一个有效的概念,而的科学家试图解开风土的哪些成分影响风味、香味和口感。

在这篇文章中,我们将使用数据科学技术来了解土壤的哪些成分(如果有的话)对葡萄酒的感官特征有影响。点击这里查看 GitHub 库及所有相关代码。

Photo (Grape 1368): Reign of Terroir

量化风味特征

在 RoboSomm 系列的前一章中,我们使用专业葡萄酒评论中包含的信息来生成“葡萄酒嵌入”:超过 150,000 种独特葡萄酒的风味特征的矢量表示。我们现在将探索这些风味特征在多大程度上可以用风土属性来解释。

风土属性

我们的 150,000+葡萄酒数据集包含位置和年份信息。我们可以利用这些信息引入各种不同的与土壤相关的属性的外部数据:

Data on soil type was retrieved from the SoilGrids API, while precipitation and temperature data was pulled from Google BigQuery. Altitude information was pulled from the Google Elevation API.

并非我们数据集中所有的葡萄酒评论都有可用的风土数据。对于天气来说尤其如此。此外,对于我们数据集中的一些葡萄酒,最近的气象站在数百公里之外。由于这不太可能产生可靠的天气数据,任何距离超过 150 公里的此类实例都被删除。

在删除所有缺失土壤、天气或海拔值的观测值后,我们剩下大约 33,000 个可用的观测值。

为了完整起见,我们为每种葡萄酒增加了两个可能影响风味的已知属性:葡萄品种和年份。这使我们能够控制似乎与这些属性相关的风味变化,并更密切地研究风土的真实影响。

建模对风味特征的影响

现在我们准备建立一个模型!眼前的问题是一个多元回归问题:我们希望使用我们的风土、品种和年份数据来预测一个 300 维的葡萄酒嵌入向量。这些葡萄酒嵌入的高维度是一个挑战。我们可以使用主成分分析(PCA)将我们的 300 维输出向量压缩到更低维的空间中。似乎我们葡萄酒嵌入的 70%的变化可以用 41 个维度来解释。因此,这些 41 维的压缩葡萄酒嵌入将是我们多元回归问题中的因变量。这仍然是一个很高的维数,但比我们开始时的 300 维有所提高。

我们将基于数据集中 80%的观察值构建模型,保留 20%作为测试集。SciKit-Learn 中的随机森林回归器本身支持多输出回归,是我们的首选模型。

即使在超参数调整之后,我们的模型在我们的测试集上也只达到了 36 % 的 R 平方值。换句话说:在我们的模型中,风土、葡萄品种和年份可以解释葡萄酒风味差异的三分之一以上。这是否意味着葡萄酒口味的其他三分之二的变化是由其他变量如酿酒风格来解释的?

嗯,可能不会。由于收集当地天气、土壤和海拔数据的不完善,36%很可能是人为的低。这个百分比还基于这样一个假设,即我们能够在我们的葡萄酒嵌入中完全解释葡萄酒的风味特征;这又依赖于专业侍酒师的评估。

尽管有这些警告,似乎风土能够解释一些风味的变化。但是风土的哪些成分最有冲击力?

哪些风土属性最重要?

我们可以使用两种技术来评估特征的重要性:对预测葡萄酒嵌入有最大影响的土壤属性。

Feature importance, mean impurity method

首先,我们可以使用平均减少杂质方法来计算特征重要性。

从相邻的图表中,我们可以看到年龄似乎有着最大的影响。其次是一些精选的葡萄品种,海拔也有很大贡献。首先出现的土壤属性是 CEC sol _ 0(0cm 深度的阳离子交换容量)和 SLT PPT _ 30(30cm 深度的土壤质地部分粉砂)。看起来最重要的天气属性是秋季第三个月的降水(收获?)和第二个夏季月份的平均最高温度。

Feature importance, Shapley value method

作为现实检查,我们将使用第二种技术来评估特性的重要性:Shapley 值。Shapley 值是博弈论中的一个概念,它计算每个特征对整体预测的边际贡献。我们可以对训练数据集中的所有观察结果进行汇总,以评估哪些功能具有最大的影响。

再次,年龄似乎是风味的主要贡献者。CECSOL_0 和 SLTPPT_30 似乎又是起最大作用的土壤因素。突出了海拔的重要性,以及第二个夏季月份的平均最高温度。

了解了哪些土壤变量对风味特征有最大的影响后,让我们更仔细地检查那些有最大明显影响的变量。

海拔高度

在高海拔地区种植的葡萄受制于低海拔地区所没有的独特的条件。白天更多的阳光直射会使葡萄长出更厚的皮,据说这有助于提高浓度和单宁。此外,白天和夜晚之间更大的温度波动允许这些葡萄保留更多的天然酸度。

为了了解海拔如何建立风味特征,我们可以计算低海拔(底部四分位数)葡萄酒与高海拔(顶部四分位数)葡萄酒中描述符的相对频率。两个类别中相对频率差异最大的描述符可以总结为一个词云:

虽然我们没有控制葡萄品种,年龄或任何其他与风土相关的变量,但我们可以看到低海拔和高海拔葡萄酒之间的一些有趣的差异。高海拔的葡萄酒似乎比低海拔的葡萄酒表现出更丰富、成熟和浓厚的特征。这可能是他们接受阳光量的结果。“坚定”意味着高水平的单宁和/或酸度,这与高海拔葡萄酒的普遍看法一致。相反,低海拔的葡萄酒似乎透露出更多的红色水果和橡木的味道。有趣的是,这些葡萄酒似乎也更具草本和泥土气息。这可能是葡萄经受较高平均温度的产物。

秋季降水

众所周知,酿酒师担心收获季节的降雨量。如果葡萄吸收水分,这有可能稀释葡萄中的糖分和味道。水也可能粘在葡萄树的叶子和树枝上,无意中与收获的葡萄一起被加工。收获期间过多的降雨也会提高葡萄的 pH 值,降低葡萄酒的酸度。再一次,让我们通过查看我们的相对频率描述词来测试这些理论。

“低秋雨”这个词描绘了一幅生动的画面。这些葡萄酒与更多的浓度,丰富和成熟联系在一起。此外,左边单词 cloud 中出现“crisp”似乎表明酸度较高。这似乎与关于晚季降水影响的流行理论相一致。

夏季平均最高气温

夏季第二个月的日平均最高温度似乎对风味特征有显著影响。传统上,高温与较高的酒精含量和较低的酸度联系在一起。

在我们的数据中,夏季低温与黑莓和黑醋栗等浆果口味有关。甜味和草本特征似乎在夏季平均温度较低的葡萄酿造的葡萄酒中更为普遍。较高的最高平均温度更多地与樱桃味以及八角和丁香等香料气味联系在一起。

阳离子交换容量

阳离子交换容量(CECSOL)是对土壤保持正电荷阳离子能力的一种度量。具有更高 CECSOL 值的土壤通常具有更高的粘土含量和更大的保持养分的能力。关于 CECSOL 值对葡萄酒风味影响的理论很少。

词云中的描述词与葡萄酒颜色高度相关。在左边,我们看到几乎所有与白葡萄酒相关的描述符注释,而右边的词云主要包含红葡萄酒描述符注释。这使得很难挑出与 CECSOL 相关的感官品质。我们可以在未来的研究中重新审视这一点,同时控制葡萄品种。

含泥量

据说,生长在淤泥含量高的土壤中的葡萄能够产出酸度较低的顺滑葡萄酒。淤泥经常与“黄土联系在一起,这是一个更通用的术语,描述由风吹尘埃堆积形成的沉积物。黄土酿出的酒,可以酿造出具有矿物特色的酒。

在我们的数据中,低水平的淤泥似乎与更干、更结实和更成熟的葡萄酒相关联。“新鲜”是酸度较高的指标,也似乎与低含量的淤泥有关。这符合关于淤泥和酒的流行思维。高水平的淤泥与更美味的葡萄酒相关,可以被描述为草本或绿色。

结论

模拟风土对葡萄酒的影响是一项具有挑战性的工作。这篇文章的分析开始揭示似乎具有最大影响的风土因素。海拔、土壤类型、降水和温度都有影响。在这些因素中,海拔似乎影响最大。虽然我们表面上已经开始识别与这些风土相关的描述符,但我们才刚刚开始剥洋葱皮。根据年龄和葡萄品种等因素,风土表现可能完全不同。这种分析的下一个好的步骤是关注土壤的细微差别,同时更好地控制这些因素。关于葡萄酒和大自然母亲,还有很多需要学习的地方…

食物和葡萄酒搭配

原文:https://towardsdatascience.com/robosomm-chapter-5-food-and-wine-pairing-7a4a4bb08e9e?source=collection_archive---------20-----------------------

机器人主持人

使用自然语言处理来解包和匹配食物和酒的特征

葡萄酒和食物的搭配是一种黑暗的艺术。最终成就完美搭配的是葡萄酒和食物中酒体、非香气和香气特征之间的微妙平衡。在本文中,我们将使用数据科学技术和流行的葡萄酒/食物配对理论来构建一个葡萄酒配对引擎。你可以在这里和找到所有相关代码和的 Jupyter 笔记本。

Chicago-style hot dog

为了陪伴我们踏上这段旅程,我们将带上一位可靠而谦逊的朋友:芝加哥风味的热狗。这是大芝加哥地区每一个运动场所的主要美食,通常都配有一杯塑料杯的淡啤酒。RoboSomm 能不能帮我们选一款葡萄酒,让我们用它来享受呢?

提取食物特征

在我们考虑配对之前,我们需要仔细分析热狗的属性。我们如何量化菜肴的非香气和香气特征,以便我们可以根据这些相同的维度来搭配葡萄酒?

我们这里的第一步是训练一个 Word2Vec 模型,为各种不同的食品相关术语生成一个 300 维的单词嵌入。假设我们可以找到一个足够扩展和描述性的文本语料库来训练这个模型,我们将期望这些嵌入能够捕捉到我们食物特征的变化。幸运的是,亚马逊美食数据集正是如此:大约 50 万条关于过多食品的评论。

在训练这个模型之后,我们可以计算热狗的嵌入量。我们将把它分解成单独的成分:热狗、番茄、洋葱、泡菜、调味品、芹菜盐、胡椒和芥末。我们将假设满载的热狗是这些成分的单词嵌入的平均值。

Generating normalized non-aroma values for food (illustrated in two dimensions)

为了量化非香味属性,我们将使用经过训练的 Word2Vec 模型来定义非香味(香味、甜味、酸味、咸味、辣味、脂肪和苦味)的嵌入。然后,我们将计算无香味嵌入和一系列示例食品之间的余弦距离,如上面的咸味示例。该距离使用最小最大值定标器在 0 和 1 之间标准化,最小距离是离盐嵌入物最近的食物(培根),最大距离是离盐嵌入物最远的食物(覆盆子)。上图显示了此过程的简化版本。我们可以看到我们的热狗在咸度表上排名很高,数值为 0.9。

对每一种非香味物质进行这些步骤,我们就能得到热狗的大致风味。最显著的非香味是咸味。还有明显的酸味,可能是由于调味品、泡菜和胡椒的缘故。热狗也很辣,脂肪和浓郁,但苦味和甜味排名较低。

为我们的葡萄酒提取香味和非香味

为了创造我们的葡萄酒搭配,我们还需要为不同类型的葡萄酒绘制出有香味的和没有香味的。这一过程与 RoboSomm 系列的前一章中采用的方法非常相似,但有几个关键区别。我们从来自 www.winemag.com的大约 150,000 篇专业葡萄酒评论中提取信息,并根据语料库中与葡萄酒相关的术语训练一个 Word2Vec 模型。重要的是,我们区分不同类别的术语,标记每个术语是属于香气还是非香气。下面是一个例子。

对于每种葡萄酒,我们可以计算每个类别的平均嵌入量(TF-IDF 加权)。在葡萄酒评论不包含所有属性的信息的情况下,我们在我们的数据集中插入所有葡萄酒的非香气平均嵌入量。

接下来,我们根据葡萄品种和次区域对数据集中的所有葡萄酒进行分组(例如,来自美国华盛顿州瓦拉瓦拉谷的霞多丽)。少于 30 个观察值的任何类型的葡萄酒都被丢弃,因为它们不太可能包含足够的信息来准确地模拟所有属性。

为了减少非香气属性的维数,我们应用了具有一个成分的 PCA。由于非香气类别中的描述符是非常一维的(例如,低单宁与高单宁),我们能够在这一维中捕捉这些属性中的绝大多数变化。产生的标量使用最小最大标量在 0 和 1 之间归一化。

我们留下了一个包含 500 种不同类型葡萄酒的数据集,每种葡萄酒都有一个 300 维的香气向量,一个用于酒体的标量和六个用于其他非香气属性的标量。

葡萄酒和食物搭配

现在是有趣的部分。我们的芝加哥风味热狗可以配什么酒?我们需要具体规定如何搭配食物和酒。我们可以使用一个 5 步骤的过程,这个过程受到奇妙的书葡萄酒愚蠢:万能版:大师指南中列出的葡萄酒配对技巧的启发。

(一)酒的酒体应该大致与食物的酒体相匹配。

(II)排除任何非香气属性与食物中的非香气不协调(不和谐)的葡萄酒。不一致的匹配显示在下面的灰色线条中。

Wine Folly flavor pairing chart

(III)用一些经验法则排除搭配不好的酒(酒应该比食物更酸,酒应该比食物更甜,苦酒不要和苦食物搭配)。

(IV)识别哪些配对是全等的或对比的。一致的搭配具有强烈的非香味,这也可以在食物中找到。对比搭配有强烈的非香味,与食物中的非香味和谐搭配。这些匹配在上图中用蓝线表示。消除任何不一致或对比的配对。

(V)根据葡萄酒香气嵌入物与食物嵌入物的接近程度对剩余的葡萄酒进行排序。这确保了食物与具有相似微妙风味的葡萄酒相匹配。

结果

那么,我们的芝加哥风味热狗要喝点什么?RoboSomm 给了我们四点建议:

搭配建议非常多样,从新西兰的黑比诺到加州内陆山谷的霞多丽。所有的搭配都有很好的酸度来匹配调味品、泡菜和胡椒的酸味。夏敦埃酒的油腻反映了食物的油腻。搭配中等至浓郁,与热狗的主体相匹配。推动这种搭配的互补的葡萄酒香气是胡椒、烟和香料;热狗的香肠中体现的味道。

让我们带着机器人再转一圈。一种非常不同的食物怎么样,比如一道美味的开胃菜,有黄瓜、熏鲑鱼、酸奶油和莳萝?

Smoked Salmon Cucumber Bites

这与我们的热狗有所不同,鲑鱼和酸奶油的脂肪含量更高。由于鱼肉和黄瓜的影响,酒体变得稍淡,但由于酸奶油的存在,酒体仍然适中。

太棒了。我们有几种白葡萄酒可供选择。葡萄酒有大量的酸来补充食物的新鲜度,并且都表现出一些盐份来搭配熏鲑鱼。阿尔萨斯混合白葡萄酒和以色列霞多丽葡萄酒中的柠檬香味与黄瓜和鲑鱼非常相配,而长相思和新西兰比诺葡萄酒中的草药味突出了我们食物中的莳萝。

没有甜点,我们的饭就不完整。让我们看看什么酒可以配一片漂亮的桃子派。

Lattice-Top Peach Pie

到目前为止,桃子派与我们测试过的食物相比,具有非常不同的非香味特征,有大量的甜味和脂肪,还有一些来自水果的酸味。

葡萄酒建议是全等的搭配,反映了我们食物的甜味和桃子的酸味。爱达荷雷司令似乎是其浓郁的树果香味和活泼的酸度的绝佳搭配。其他建议也有强烈的甜味,伴随着桃子的香味来反映食物。

结论

RoboSomm 能够仅使用基于自然语言的技术产生相当合理的葡萄酒搭配建议。这种产生搭配的新方法很有前途,并为葡萄酒与食物搭配的更多开箱即用方式打开了大门。

现在,让我们为芝加哥风味的热狗举杯(黑皮诺、梅洛或霞多丽)。

(机器人)数据科学家即服务

原文:https://towardsdatascience.com/robot-data-scientists-as-a-service-80224f5e928a?source=collection_archive---------7-----------------------

用符号回归和概率规划自动化数据科学。

如何成为懒惰的(数据)科学家并从此快乐地生活

早起的人不会取得进步。它是由懒惰的人试图找到更简单的方法来做某事而制造的。”海因莱茵

答根据预测机器的福音,近年来的人工智能革命主要意味着一件事:预测的经济成本正在迅速降低,因为图书馆、云服务和大数据对从业者、初创公司和企业来说变得广泛可用。

虽然这个故事作为人工智能采用前景的“大图”当然很有吸引力,但从地面上看,几个行业中应用人工智能/机器学习/数据科学(选择你最喜欢的流行语)的现实是非常不同的。

虽然如今数字数据集确实比以前更容易获得,但现实生活中的用例仍然需要高技能的工作人员利用时间和知识以有意义的方式解释数据模式。以下图表显示了收入数据与云支出的关系:

Revenue data on the y-axis, as a function of cloud expenses on the x-axis (data points are machine generated, but they could easily come from any of our clients or many of our startup peers).

如果企业需要提前计划并最终确定预算,准确理解收入和费用之间的关系显然是一个非常重要的话题。怎么才能做到呢?

好吧,一个选择是让你的数据科学家看一看数据并建立一个解释模型;这通常是可行的,但显然这只是企业感兴趣的众多变量中的两个——那些在数据湖中徘徊的我们尚不了解的变量呢?换句话说,数据科学家是伟大的(一个真正无偏的估计!)但它们不一定成规模:在企业内部,即使是制作“探索性分析”也仍然是大量的工作。

第二个选择是去掉所有花哨的东西,只用一个模型来解决所有问题:对于线性回归的人来说,一切看起来都像一个斜坡。这非常方便,并且是市场上几种基于人工智能的解决方案中使用的一种值得尊敬的策略:

“Automated data science” often just means pre-defined models for widgets in your dashboard (excerpt from a real industry white paper).

然而,第二种方法的问题是显而易见的:并不是所有的东西都是直线,这意味着一些“见解”可能是噪音,一些模式将无法被发现;换句话说,一种模式并不也不适合所有人。

Revenues vs cloud expenditure again. Not everything is a straight line, as the best fit here is a 2nd degree polynomial — the ROI for our (imaginary) infrastructure scale very well!

我们不能做得更好吗?我们认为我们可以:如果我们可以写一个程序,然后其他程序来为我们分析这些变量,会怎么样?

虽然我们的客户使用的完整解决方案已经超出了这篇文章的范围,但是我们将展示如何结合概率编程和符号回归的思想来构建一个强大的元程序,它将为我们编写有用的代码(你可以在这里运行为这篇文章编写的代码)。

正如智者所说,任何足够先进的技术都无法从埃隆马斯克的推特中分辨出来。

符号回归入门

" 94.7%的统计数据都是由编造的."—匿名数据科学家

我们将用不超过三分钟的时间用一个简单的例子介绍符号回归之外的直觉(熟悉它的读者——或者只是对讨厌的细节不感兴趣——可以放心地跳到下一节)。

考虑下面的 X-Y 图:

The familiar image of a scatterplot: what is the relation between X and Y?

看着这些数据,我们可以拿出笔和纸,开始对 X 和 Y 之间的关系进行一些合理的猜测(甚至仅仅局限于简单的多项式选项):

Y = bX + a (linear)
Y = cX^2 + bX + a (quadratic)

我们衡量什么是最好的,并利用我们所学到的来产生更好的估计:

Comparing two hypotheses: R-squared is 0.65 and 0.74 respectively.

似乎我们可以尝试更高次的多项式来实现更好的拟合:

R-squared for a third-degree polynomial is 0.99 (it looks like overfitting but we swear it’s not).

这听起来是个合理的策略,不是吗?

简而言之,符号回归是我们手动做的事情的自动化版本,只有很少的函数和两个“代”。

那就是:

  1. 从一系列适合手头数据集的函数开始;
  2. 衡量他们做得有多好;
  3. 拿那些表现最好的去换,看看你能不能让它们变得更好;
  4. 重复 N 代,直到满意。

即使是这个玩具例子,很明显,通过智能地探索可能的数学函数空间来拟合数据模式具有有趣的优点:

  • 我们不必一开始就指定很多假设,因为过程会进化出越来越好的候选者;
  • 结果很容易解释(因为我们可以产生诸如“增加 a X 将导致增加 b Y”的见解),这意味着新知识可以在所有业务部门之间共享。

作为一个缺点,评估大量的数学表达式可能会很耗时——但这对我们来说不是问题:我们的机器人可以在晚上工作,并在第二天为我们提供预测(这就是机器人的作用,对吗?).

对于我们的目的来说,关键的观察是,在模型表达能力、智能探索和数据拟合之间存在一种基本的权衡:可能解释数据的数学关系空间是无限的——虽然复杂的模型更强大,但它们也容易过度拟合,因此,在简单的模型失败后,应该考虑这些模型。

既然关系是用数学的语言来表达的,为什么我们不利用形式语法的自然组合性和表达性来导航这种权衡呢(是的,在也是如此我们做爱语言)?

这就是我们将符号回归的直觉——自动进化模型以获得更好的解释——与 概率编程 的生成能力相结合的地方。由于模型可以表示为特定领域的语言,我们的回归任务可以被认为是"贝叶斯程序合成"的一个特殊实例:一个通用程序如何编写特定的"程序"(即数学表达式)来令人满意地分析看不见的数据集?

在下一节中,我们将构建一种表达函数的最小形式语言,并展示语言结构上的操作如何转化为有效探索数学假设的无限空间的模型(忠实的读者可能还记得,我们以类似的方式解决了在之前的帖子中介绍的“序列游戏”)。换句话说,现在是时候建立我们的机器人大军了。

加分技术点:符号回归通常以遗传编程为主要优化技术;一群函数被随机初始化,然后算法适应度决定群体向非常适合手头问题的表达式进化。我们为这篇文章选择了一种概率编程方法,因为它与最近关于概念学习的一些工作非常吻合,并且让我们直接在浏览器中分享一些工作代码(彻底的比较超出了这篇文章的范围;更多对比和彩色图,见文末附录;在校对文章时,我们还发现了这种非常新且非常有趣的“神经引导”方法。对遗传编程感兴趣的非懒惰和 Pythonic 读者会发现 gplearn 令人愉快:Jan Krepl 的 data science-y 教程是一个很好的起点。]

打造一个机器人科学家

“除了黑艺术,只有自动化和机械化。”洛尔卡

正如我们在上一节中看到的,符号回归的挑战是我们需要考虑的巨大可能性空间,以确保我们在拟合目标数据集方面做得很好。

构建我们的机器人科学家的关键直觉是,我们可以在这个无限的假设空间中强加一个熟悉的“语言”结构,并让这一先验知识指导候选模型的自动探索。

我们首先为我们的自动化回归任务创建一种小型语言,从我们可能支持的一些原子操作开始:

unary predicates = [log, round, sqrt]
binary predicates = [add, sub, mul, div]

假设我们可以选择变量(x 0 ,x 1, … x n )、整数和浮点数作为我们的“名词”, L 可以生成如下表达式:

add(1, mul(x0, 2.5))

完全等同于更熟悉的:

Y = X * 2.5 + 1

Plotting the familiar mathematical expression “Y = X * 2.5 + 1”

【我们跳过语言生成代码,因为我们在别处讨论了生成语言模型。从概率编程的角度来看科学问题的概观,从奇妙的 ProbMods 网站开始。]

由于我们不能直接将一个先验置于一组无限的假设之上,我们将利用语言结构来为我们做到这一点。因为生成线性表达式需要较少的(概率)选择:

add(1, mul(x0, 2.5))

与二次表达式相比:

add(add(1, mul(x0, 2.5)), mul(mul(x0, x0), 1.0)))

第一种是在观察之前的更可能的假设(即,我们在奥卡姆剃刀的精神中获得一个优先支持简单性的假设)。

A simple WebPPL snippet generating mathematical expressions probabilistically.

我们需要的最后一个细节是如何衡量我们的候选表达式的性能:当然,在数据点之前,线性表达式比二次更有可能,但是我们通过观察能学到什么呢?由于我们将我们的任务框定为贝叶斯推理,贝叶斯定理建议我们需要定义一个似然函数,如果潜在假设为真(后验* ~= 先验+似然),它将告诉我们获得数据点的概率。例如,考虑以下三个数据集:*

Three synthetic datasets to test likelihood without informative prior beliefs.

它们是通过向以下函数添加噪声而生成的:

f(x) = 4 + 0 * x (constant)
f(x) = x * 2.5 (linear)
f(x) = 2^x (exp)

我们可以利用 WebPPL 中的observe 模式来探索(没有信息先验)可能性如何影响推理,预先知道生成数据的数学表达式是什么。

A simple WebPPL snippet to test the likelihood of some generating functions against synthetic data.

从下面的图表中可以清楚地看出,在只有 25 个数据点的情况下,可能的数学表达式的概率分布非常集中在正确的值上(还要注意,常数参数在真实值 4 上分布很窄,对于指数的例子也是如此)。

Original data (N=25), probability distribution over expressions, parameter estimation for the CONSTANT and EXP example (original data from WebPPL exported and re-plotted with Python).

然后,结合(基于语言的)先验和可能性,我们最终的机器人科学家被组装起来(如果你对一个小而粗糙的程序感兴趣,不要忘记运行这里的片段)。

现在让我们看看我们的机器人能做什么。

让我们的机器人科学家投入工作

“人类让我兴奋。”—匿名机器人

现在我们可以创造机器人科学家,是时候看看他们能在一些有趣的数据模式上做些什么了。下面的图表显示了用数学表达式的简单语言构建的数据集(如上所述),显示了每种情况下的:

  • 具有目标数据点的散点图;
  • 生成数学表达式(即真理);
  • 被机器人科学家选为最有可能解释数据的的表达式(请注意,在运行代码时,您可能会得到不同但在外延上等价的表达式的几个条目,如x * 44 * x)。

Four synthetic datasets (left), the underlying generator function (center, in red), and the best candidate according to the robot scientist (right, in blue).

结果相当令人鼓舞,因为机器人科学家总是对测试数据集中与 X 和 Y 相关的潜在数学函数做出非常合理的猜测。

作为画龙点睛之笔,只需要多几行代码和一些标签,就可以用简单的英语添加一个很好的调查结果摘要,以便下面的数据分析:

From data analysis to an English summary: we report model predictions at different percentiles since the underlying function may be (as in this case) non-linear.

会自动总结为:

According to the model '(4 ** x)':

At perc. 0.25, an increase of 1 in cloud expenditure leads to an increase of 735.6 in revenuesAt perc. 0.5, an increase of 1 in cloud expenditure leads to an increase of 9984.8 in revenuesAt perc. 0.75, an increase of 1 in cloud expenditure leads to an increase of 79410.5 in revenues

Going from model selection to explanations in plain English is fairly straightforward (original here).

还不错吧。看起来我们的数据科学团队终于可以休息一下,在机器人为他们工作的同时,去享受他们应得的假期了!

当不懒惰的读者更多地摆弄代码片段并发现这些机器人 1.0 版可能出错的各种事情时,我们将回到我们的企业用例,并就如何在现实世界中利用这些工具做一些临别笔记。

下一步:跨企业数据扩展预测

“简单的事实是,当人类和机器作为盟友而不是对手一起工作,以利用彼此的互补优势时,公司可以实现最大的业绩提升。”多赫蒂

让我们回到我们的预测问题:我们有关于云服务如何影响我们公司收入的数据,我们希望从中学习一些有用的东西。

Our X-Y chart: what can we learn from it?

当然,我们可以尝试使用为这个问题设计的机器学习工具;如果我们相信深度学习的宣传,那么在整合,对未知数据集的推广和解释方面,这有明显的缺点。我们可以尝试部署内部资源,如数据科学家,但在投资回报时间和机会成本方面会有负面影响。最后,我们可以尝试优先考虑速度,运行一个简单的一刀切模型,牺牲准确性和预测能力。

在这篇文章中,我们概述了一条非常不同的路径来应对挑战:通过将统计工具与概率编程相结合,我们获得了一个足够通用的工具来在各种设置中产生可解释的精确的模型。我们从自动化人工智能中获得了最佳效果,同时保持了数据科学的良好部分——可解释的结果和建模灵活性。

从科学的角度来看,以上显然只是如何跳出框框思考的初步草图:当从 POC 转向成熟的产品时,一个自然的扩展是在特定于领域的语言中包含高斯过程(并且,一般来说,利用我们所知道的关于贝叶斯程序综合的所有好的东西,本着例如优秀的 萨阿德 的精神)。

就产品而言,我们为价值数十亿美元的公司部署这些解决方案的经验既具有挑战性,也是有益的(正如企业经常做的那样)。他们中的一些人起初持怀疑态度,因为他们被大型云提供商今天作为“自动化人工智能”大力营销的预制解决方案所困扰——事实证明,这些工具除了最简单的问题之外什么也不能解决,仍然需要时间/学习/部署等方面的重要资源..但最终,他们都接受了我们“程序合成”的过程和结果:从自动预测到数据重构,客户喜欢教学机器的“交互式”体验,并通过类似人类的概念与它们合作;结果很容易解释,通过无服务器微服务大规模实现了大规模自动化(关于我们的 WebPPL 无服务器模板,请参见我们的专用帖子,代码为)。

在 Tooso,我们确实相信近期的人工智能市场属于能够实现人类和机器之间协作的产品,这样各方都可以做自己最擅长的事情:机器可以在数据湖中做定量的跑腿工作,并为进一步分析提供最有希望的路径;人类可以对选定的问题进行高级推理,并向算法提供反馈,以良性循环的方式产生越来越多的见解和数据意识。

总而言之,尽管梦想邪恶的机器人军队很有趣(是的埃隆,又是你),但未来仍有很多肯定需要我们。

再见,太空牛仔

如果你有问题或反馈,请将你的人工智能故事分享给jacopo . taglia bue @ tooso . ai。

别忘了在领英、推特和 Instagram 上关注我们。

附录:比较回归模型

让我们考虑一个稍微复杂一点的数据集,其中我们的目标变量 Y 在某种程度上依赖于 X 和 Z:

Y depends on both X and Z: what is the exact relation between them (we plotted the “true surface” as a visual aid)?

为了以一种相当直接、非参数化的方式拟合数据,我们从一些经过战斗考验的决策树回归器开始:决策树可能不会让你谈 NIPS,但是它们非常健壮,并且在实践中被广泛采用,所以从那里开始是有意义的:

Fitting a decision tree to our dataset: good but not great.

定性的(结果表面的形状,有点“块状”)和定量的(R 平方= 0.84)结果都很好,但并不例外。

Fitting symbolic regression to our dataset: much better!

符号回归产生了更平滑的表面和更好的定量拟合,以及更好的样本外数据预测;此外,系统的输出很容易解释,因为它是一个标准表达式:

sub(add(-0.999, X1), mul(sub(X1, X0), add(X0, X1)))

那就是:

Y = (−0.999 + Z) − ((Z−X) * (X+Z))

(关于更长的讨论,请参见来自 gplearn 的精彩文档)。

基于图像分割的机器人行走路径

原文:https://towardsdatascience.com/robot-following-a-walkway-using-image-segmentation-272bebd93a83?source=collection_archive---------34-----------------------

在我之前的故事中,我正在教一只覆盆子驱动的机器人坦克自己在人行道上导航。瓶颈是道路识别——我通过 OpenCV 使用了一种简单的颜色过滤方法,结果并不可靠。

一般来说,这是一个图像分割的任务。有一篇的好文章描述了最流行的方法。它们很简单,通常不会在现实生活的照片上产生完美的效果。和我基于颜色的实现一样。

为了寻找改进的方法,我决定使用语义分割。神经网络只是在最近才被用于这项任务,但已经展示了令人印象深刻的结果。来自 PyImageSearch 的这篇很棒的文章给了我灵感,并将我从理论推向了实践。本文介绍了用 E-net 神经网络进行图像分割。

原来,E 网是比较年轻,不知名的网络。它是基于更著名的 U-net 架构的成功而开发的。

优信网

U-net 是第一个也是最著名的用于语义分割的神经网络。最初它是为德国的医疗需要而开发的。原始文档在这里可用。

人们很快发现这种方法可以用于比 x 光阅读更广泛的用途。有一些关于如何训练和使用 U-net 在城市图像上进行道路分割的文章:

  • 一个
  • 两个
  • 三个

有很多有趣的和新的信息,但我正在寻找一个现成的网络来使用我的坦克了。不幸的是,搜索没有很快产生结果。

所以转回到 E-net。

电子网络

E-net 是基于 U-net 产生的想法。根据来源,它最初是为城市图像分割而设计的。一些开放数据集用于在道路场景上进行训练:

剑桥街道数据集又名 CamVid

德国和瑞士街道数据集又名城市景观

有一篇关于 E-net 的介绍性文章。

如果有人想深入了解,这里有一份关于如何训练和使用 E-net 网络的详细文件。我认为这是一个强制性的步骤——根据自己的需要和要求定制网络。

但是我太兴奋了,不能马上得到结果,决定使用上面提到的来自 PyImageSearch 的现成网络。

运行电子网络

到目前为止,我的目标是只识别人行道,而不是网络训练检测的 20 类物体。为此,我用颜色编辑了文件,忽略了除道路以外的所有类。

然后从文件系统中读取模型:

def load_segment_model():
    try:
        classes = None
        with open(PiConf.SEGMENT_CLASSES) as f:
            classes = f.read().strip().split("\n")
        colors = None
        with open(PiConf.SEGMENT_COLORS) as f:
            colors= f.read().strip().split("\n")
        colors = [np.array(c.split(",")).astype("int") for c in colors]
        colors = np.array(colors, dtype="uint8")
        print("[INFO] loading model...")
        net = cv2.dnn.readNet(PiConf.SEGMENT_MODEL)
        return net, classes, colors
    except Exception as e:
        logging.exception("Cannot load segment model")
    return None, None, None

进行细分:

def segment_image(image_path, seg_net, seg_classes, seg_colors): image0 = cv2.imread(image_path)
    image = cv2.resize(image0, (1024, 512), interpolation=cv2.INTER_NEAREST)
    blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (1024, 512), 0, swapRB=True, crop=False) seg_net.setInput(blob)
    start = time.time()
    output = seg_net.forward()
    end = time.time() print("[INFO] inference took {:.4f} seconds".format(end - start)) (numClasses, height, width) = output.shape[1:4] classMap = np.argmax(output[0], axis=0) mask = seg_colors[classMap] mask = cv2.resize(mask, (image0.shape[1], image0.shape[0]), interpolation=cv2.INTER_NEAREST)
    classMap = cv2.resize(classMap, (image0.shape[1], image0.shape[0]), interpolation=cv2.INTER_NEAREST) gmask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
    gmask = cv2.resize(gmask, (128, 64), interpolation=cv2.INTER_NEAREST)
    gmask = gmask[0:64,32:96] output = ((0.6 * image0) + (0.4 * mask)).astype("uint8")       
    return output, gmask

第一个问题出现在代码中,它是输入图像的尺寸。该网络在相当大的 1024x512 图像上进行训练。为了节省处理资源,我的树莓相机设置为 320x240。

分段测试

代码移植后,是时候处理坦克已经在人行道上拍摄的照片了。

首次测试

只能认出走道的左边部分。

缩小图片并将其中心切割为 64x64(此遮罩由另一个神经网络决定方向)。

方向网络(它是一个 3 级分类器)命令向左行驶。不是最好的决定,但可以忍受。

第二次测试

类似的情况,右下角又不识别了。大概是湿漉漉的表面把网络搞糊涂了。但是道路的最大部分被正确识别。面具看起来很一致:

而方向网决定往前走。

第三次测试

这是一个失败的状态——机器人位于人行道中间,需要向右走。

这条路几乎完全被认出来了。

方向分类器命令向右。就是这样。

因此,道路识别的结果要比旧实现中简单的颜色过滤好得多。让我们在真正的坦克上运行它。

在覆盆子馅饼上奔跑

不幸的是,注意到的输入图像大小立刻引起了问题。覆盆子太慢了,无法处理这么大的图像。一次分割大约需要 6 秒钟,这对于实时车辆来说是不可接受的。神经网络工作得很好,但当它工作时,坦克偏离了道路。

所以唯一的解决方案是用更小的图片来训练我自己的电子网络。

此外,使用外部电源进行分割也可能是一个好主意,例如英特尔神经计算机棒或类似产品。

最后一幅图表明,即使是道路决策也是有效的,因为它们做得太晚了。

链接

  • 之前尝试在人行道上驾驶——基于颜色的分割
  • git hub 上带有 E-net 分段的坦克固件
  • PyImageSearch 促使我迈出这一步的文章
  • 如何训练自己的 E-net 实现指南
  • 您可以获取更多信息并购买坦克自制套件的坦克基地

基于 OpenCV 和 Tensorflow 的机器人行走

原文:https://towardsdatascience.com/robot-following-a-walkway-with-opencv-and-tensorflow-a631eb72cb8c?source=collection_archive---------13-----------------------

如何用树莓 Pi,计算机视觉,卷积神经网络制作自动驾驶机器人?

在我的机器人学会了如何跟随一条线之后,一个新的挑战出现了。我决定走到户外,让机器人沿着人行道移动。如果机器人像狗一样跟着主人穿过公园就好了。

行为克隆给出了实现思路。当人工智能学习提供的行为输入和输出,然后对新的输入做出决定时,这是自动驾驶汽车非常受欢迎的方法。有一篇来自 Nvidia 的文章介绍了这种方法。

许多好文章都在描述这种想法:

  • 一个
  • 两个
  • 三个

更令人兴奋的实现是在现实生活中。最好的例子就是 DonkeyCar 和它的神经网络。

不幸的是,一种天真的方法——在彩色照片上训练神经网络——没有成功。秋天的公园照片大多是灰色的,所以对调整大小和模糊的照片进行训练的神经网络没有提供可靠的结果。

为了简化人工智能的任务,我决定用计算机视觉技术对图像进行预处理。OpenCV 库有许多功能,当我需要检测地板上的白线时,它工作得很好。

这项任务结果并不容易。照片大部分是灰色的,主要问题是“哪种灰色是走道的颜色”。观察发现,人行道就像“完美的灰色”——其 RGB 值之间的差异极小。

亮度是另一个标准。很难自动确定走道的亮度,所以第一张图片用于调整颜色参数。然后根据参数进行颜色过滤,我们得到了一个带有人行道轮廓的蒙版。

轮廓的形状不精确,并且取决于颜色过滤参数。

下一步是根据走道遮罩做出决定(直走还是左转/右转)。分类的总体思路是查看人行道的右侧边缘:如果边缘更靠左,那么我们需要向左转向。如果没有边缘——向右转向。如果边缘从右下角以一个适中的角度向上——什么也不做,只是开车。

考虑到模糊的斑点形状,仅使用几何图形很难识别边缘特征。然后我依靠神经网络来寻找模式。所以我把走道面具放在三个不同的文件夹里,并在上面训练 NN。

左、右和直遮罩的示例:

从机器学习的角度来说,这是一个具有三类的图像分类任务。灰度图像是理想的输入数据,因此即使是最简单的卷积网络也能显示出出色的结果。我用 Keras over Tensorflow 来教网。

model = Sequential()activation = "relu"model.add(Conv2D(20, 5, padding="same", input_shape=input_shape))
    model.add(Activation(activation))
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))model.add(Conv2D(50, 5, padding="same"))
    model.add(Activation(activation))
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))model.add(Flatten())
    model.add(Dense(500))
    model.add(Activation(activation))model.add(Dense(cls_n))opt = SGD(lr=0.01)model.add(Activation("softmax"))model.compile(loss="categorical_crossentropy", optimizer=opt,       metrics=["accuracy"])

下一个挑战是在 Raspberry Pi 上运行一切。

我用的是旧 Tensorflow 的 Raspbian 8 Jessie,由 Sam Abrahams 和 OpenCV 3.4 构建(我必须自己构建)。该版本的 Tensorflow 相当旧,无法与 Keras 模型一起工作。

好在最近 Google 支持了 Tensorflow 的 Raspberry Pi,但是需要 Raspbian 9 Stretch 和 python 3。所以我不得不把所有的机器人固件都移植到新的平台上。OpenCV 也是在那一年开发的,我必须构建 OpenCV 4.0。

把一切放在一起——机器人正在公园里散步。

结论

最难的是认路。没有台词使这项任务变得困难。识别参数必须根据光线和当地条件进行调整。但是灰度掩模是完美的材料,即使是简单的 CNN 也能得到可预测的结果。

链接

GitHub repo 与 python 上的完整坦克固件

神经网络的数据和代码

为 Raspbian 预建 OpenCV deb 包

油箱装配说明

关于坦克的更多信息

机器人坦克与树莓派和英特尔神经计算机棒 2

原文:https://towardsdatascience.com/robot-tank-with-raspberry-pi-and-intel-neural-computer-stick-2-77263ca7a1c7?source=collection_archive---------18-----------------------

在我之前的文章中,我通过 OpenCV-DNN 和 Enet 做了一个道路图像分割。

这个实验因为性能而失败:分割过程对 Raspberry 来说太重了。

有两种方法可以解决这个问题:

  • 教 Enet 将更小的图片,希望它会更快
  • 在一些硬件上运行神经网络的分段

第二个想法似乎更有趣,在我得到英特尔神经计算机棒 2 的几天后。

它相当大,不容易将模块放入机器人布局中。

由于大小,它不适合树莓较低的 USB 插槽。考虑到左边的插槽在相机支架后面,因此不可用,唯一的方法是将 NCS 插入右上角的插槽。GPS 模块已经在那里,所以它用一根电缆延长,并移动到右下方的插槽。

英特尔 NCS

英特尔最近发布了他们的神经计算棒的第二个版本,新的 API 被证明与上一个版本不兼容。

新的 API 叫做 Open Vino,包括 OpenCV 和一些神经网络工具。

有一些关于 NCS2 和 Open Vino 框架的介绍性文章:

  • 英特尔
  • 走向数据科学 I
  • 走向数据科学 II
  • PyImageSearch

开始与 NCS 合作很容易。英特尔支持 Raspbian 开箱即用,所以安装没有问题。

结果是 NCS 只支持它自己的神经网络格式。Open Vino 包含一个工具模型优化器来转换一些格式。一些支持的选项有— Caffe、Tensorflow、PyTorch 等。

此外,英特尔还在一个专门的模型动物园中为不同的应用提供了一组预训练模型。

语义分割有两种模型:

  • 对于路边物体非常简单
  • 多级进阶

不幸的是,高级模型无法在 NCS 上运行。

网络控制系统中的神经网络

在 NCS 上运行神经网络推理有几个步骤。

初始化设备

设备名“MYRIAD”,单词“plugin”和加载库的路径——看起来像是旧时代的产物。

from openvino.inference_engine import IENetwork, IEPlugin ncs_plugin = IEPlugin(device="MYRIAD", plugin_dirs = "/opt/intel/openvino/inference_engine/lib/armv7l")

负载模型

然后我们需要将神经网络模型加载到设备中。

这是一项繁重的工作。我使用的小模型加载时间大约为 15 秒。

好消息是只需要做一次。

model = IENetwork(model=xml_path, weights=bin_path)         
net = ncs_plugin.load(network=model)

运行推理

然后我们可以进行推理,得到一个输出张量。

input_blob = next(iter(model.inputs))     
out_blob = next(iter(model.outputs))     
n, c, h, w = model.inputs[input_blob].shape     
images = np.ndarray(shape=(n, c, h, w))     
images[0] = image     
res = net.infer(inputs={input_blob: images})     
res = res[out_blob]

单一过程问题

突然间,使用来自两个不同过程的 NCS 变得不可能了。

模型加载会产生错误:

E: [ncAPI] [    684447] resetAll:348     Failed to connect to stalled device, rc: X_LINK_ERROR 
E: [ncAPI] [    691700] ncDeviceOpen:672        Failed to find suitable device, rc: X_LINK_DEVICE_NOT_FOUND 
Traceback (most recent call last):     
net = ncs_plugin.load(network=model)   
File "ie_api.pyx", line 395, in openvino.inference_engine.ie_api.IEPlugin.load   
File "ie_api.pyx", line 406, in openvino.inference_engine.ie_api.IEPlugin.load 
RuntimeError: Can not init USB device: NC_ERROR

在英特尔支持论坛搜索发现了类似的问题。该主题引用了文档,其中明确指出:

单个设备不能跨多个进程共享。

基于开放 Vino 的图像分割

Open Vino 已经包含了一个现成的语义分割和样本模型。

这个模型的效果不如 Enet 的好,但也不差。

反正 Enet 的这个实现是老 Torch 格式的,Open Vino Model Optimizer 不支持。

对了,开 Vino 模型不开——还有人问,不过建议用一个类似 PyTorch 的模型和调音。

性能比赛:NCS+open vino segmentation vs Raspberry+Enet NCS 以极大优势获胜:0.8 秒 vs 6。

方向决策

坦克(又名 PiTanq)使用图像分类器来决定走哪条路:左,右或直。详情见专用文章。

分类网络已经用 Keras 进行了训练,并且用 Tensorflow 处理 Raspberry 有一个针对 Keras 格式的适配器)。

该模型非常简单,即使在 Raspberry 上也显示出良好的性能:每张图像 0.35 秒。

但是,有了 NCS,我们可以期待一些性能提升。所以,我们需要在 NCS 上运行一个 Keras 模型。Open Vino 支持很多不同的 NN 格式,有 Tensorflow,但是没有 Keras。

将 Keras 转换为 TF 是一项常见的任务,并且有许多可用的资源。我用了这本指南。

同一作者还有另一篇文章讲述了如何在 NCS 上运行 Keras 的所有步骤。

此外,英特尔还为此案例提供了文档。

最后,我得到了基于所有来源的代码:

import tensorflow as tf
from tensorflow.python.framework.graph_util import convert_variables_to_constantsfrom keras import backend as K
from keras.models import load_model
from keras.models import model_from_jsondef load_keras_model(json_file, model_file):
    jf = open(json_file, 'r')
    loaded_model_json = jf.read()
    jf.close()
    loaded_model = model_from_json(loaded_model_json)
    loaded_model.load_weights(model_file)
    return loaded_modeldef freeze_session(session, keep_var_names=None, output_names=None,     clear_devices=True):
    graph = session.graph
    with graph.as_default():
        freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or []))
        output_names = output_names or []
        output_names += [v.op.name for v in tf.global_variables()]
        input_graph_def = graph.as_graph_def()
        if clear_devices:
            for node in input_graph_def.node:
                node.device = ""
        frozen_graph = convert_variables_to_constants(session,    input_graph_def, output_names, freeze_var_names)
        return frozen_graphmodel = load_keras_model('./model.json', './model.h5')
frozen_graph = freeze_session(K.get_session(),
                              output_names=[out.op.name for out in model.outputs])tf.train.write_graph(frozen_graph, ".", "ktf_model.pb", as_text=False)

同样的代码在 GitHub 上也有。

现在我们有了一个 TF 模型,然后通过模型优化器将其转换为 Open Vino:

python mo_tf.py --input_model "model/ktf_model.pb" --log_level=DEBUG -b1 --data_type FP16

基准测试显示了显著的差异:每幅图像 0.007 秒(而不是 0.35 秒)。

所有车型(Keras,TF,Open Vino)都在 GitHub 上。

物体检测

物体探测任务是机器人的另一个特点。它是用 OpenCV-DNN 和移动 SSD 模型实现的。

英特尔模型动物园包含许多基于移动 SSD 的窄特异性检测器,但整个模型缺失。

但在兼容 Tensorflow 模型列表中有提及。

利用之前网络转换的经验我们生成 MobileSSD 2018_01_28 的开放 Vino 模型。

有趣的是,如果你试图用 OpenCV-DNN 打开这个版本的 MobileSSD,它会失败:

cv2.error: OpenCV(4.1.0-openvino) /home/jenkins/workspace/OpenCV/OpenVINO/build/opencv/modules/dnn/src/tensorflow/tf_importer.cpp:530:  error: (-2:Unspecified error) Const input blob for weights not found in function 'getConstBlob'

但是当我们尝试转换 OpenCV 兼容版本 MobileSSD-11_06_2017 时,转换也失败:

[E0919 main.py:317] Unexpected exception happened during extracting attributes for node FeatureExtractor/MobilenetV1/Conv2d_13_pointwise_1_Conv2d_2_1x1_256/Relu6\. Original exception message: operands could not be broadcast together with remapped shapes [original->remapped]: (0,) and  requested shape (1,0,10,256)

到目前为止,如果我们想同时使用开放 Vino 和 OpenCV-DNN 方法,我们需要两个不同版本的 MobileSSD。

Open Vino 赢得基准:0.1 秒对 1.7 秒。

MobileSSD 的新版本看起来不如以前的版本稳定:

图像分类

PiTanq 的另一个能力是用 Imagenet 上的 Tensorflow 和 Inception 对图像进行分类。

坦克在《盗梦空间》中使用了一个相当老的版本——2015 年 12 月 5 日。从那时起有足够的时间,现在《盗梦空间》有四个版本!

好消息是它们都是由 Open Vino 支持的。

上图中的旧版本指标是:

  • 笔记本电脑,笔记本电脑 62%
  • 笔记本电脑,笔记本电脑 11%
  • 13 秒
  • 猫在哪里?

在 NCS 上运行分类器:

  • 笔记本电脑,笔记本电脑 85%
  • 笔记本电脑,笔记本电脑 8%
  • 0.2 秒
  • 还是没有猫

结论

所有使用 Tensorflow 和 OpenCV-DNN 的神经网络的场景都被 NCS 取代。

这意味着 Tensorflow 可以退出董事会了。说实话,这个框架对树莓来说太重了。

NCS 的性能允许更广泛地使用神经网络。例如,利用实时对象检测来流式传输视频,或者应用实例分割。

单进程的限制是有限的,但是有一种方法可以通过一个专用的服务来包装 NCS。

链接

  • 英特尔推出开放式 Vino】
  • 打开 Raspbian 的 Vino 安装指南
  • 开维诺模型动物园
  • 下载开放葡萄酒模型的资源
  • 支持 NCS 的 PiTanq 固件
  • PiTanq 主页

基于图网络的机器人控制

原文:https://towardsdatascience.com/robotic-control-with-graph-networks-f1b8d22b8c86?source=collection_archive---------8-----------------------

内部 AI

利用关系归纳偏差提高概括和控制

source

正如任何对技术感兴趣的人无疑都知道的那样,机器学习正在帮助改变不同行业的许多领域。在过去的几年里,由于深度学习算法,计算机视觉和自然语言处理等事情发生了巨大的变化,这种变化的影响正在渗透到我们的日常生活中。人工智能预计将带来巨大变化的领域之一是机器人领域。几十年前,科幻作家设想由人工智能驱动的机器人与人类社会互动,或者帮助解决人类的问题,或者试图毁灭人类。我们的现实与此相去甚远,我们今天明白,创造智能机器人是一个比当年预想的更艰巨的挑战。机器人必须感知世界并理解它们的环境,它们必须思考它们的目标和如何实现它们,并使用它们的驱动装置执行它们的计划。

当我们人类想到从桌子上拿起一杯水时,我们可能会对我们的手行进的轨迹有一个大致的想法,但为了实际做到这一点,我们的大脑需要通过神经系统发送一个非常长而复杂的电信号序列,以引起肌肉的正确收缩。我们的感觉系统观察这些电信号的影响(我们看到我们的手是如何移动的),我们的大脑使用这种反馈来补偿误算。这个过程被称为反馈控制,是机器人设计师和机器人研究人员面临的挑战之一。我们的机器人不仅需要计划它的手臂应该如何在空间中移动以抓住一个物体,它还必须指定需要施加到它的马达上的电压,以便实现适当的扭矩和力,并完成目标。

反馈控制是一个广阔的领域,具有非常丰富的理论,在我们生活的几乎每个方面都有许多应用。电梯、汽车、飞机、卫星和无数其他日常物体依靠控制算法来调节其内部操作的某些方面。控制理论为控制工程师提供了为许多关键系统设计稳定可靠的控制算法的工具,而这些方法通常依赖于对我们系统的潜在动态的深刻理解。

在设计稳定飞机的控制系统及其自动驾驶软件时,工程师们非常依赖于几十年来在飞机动力学方面的研究和经验。飞机如何对其操纵面角度的变化作出反应是一个相对容易理解的过程,这在试图找出如何控制这样一个系统时提供了很大的好处。

source

不幸的是,并不是所有的系统都被理解到这种程度的细节,而且获得这种知识的过程通常是非常漫长的,需要多年的研究和实验。随着技术的进步,我们构建的系统的复杂性也在增加,这给控制工程师带来了许多挑战。

在这个机器学习的时代,一个直接的方法当然是从实验期间收集的数据中学习动力学模型。例如,我们可以想到一个带有简单抓钳的机械臂。手臂的状态由每个关节的角度和角速度组成,我们可以采取的行动是关节内每个电机的电压。这些电压会影响机械臂的状态,我们可以将其视为一个函数:

这意味着我们的动力学可以被认为是一个将状态-动作映射到状态的函数,通过学习,我们可以使用类似神经网络的模型来近似它:

其中θ代表我们神经网络的参数。这一过程也经常在基于模型的强化学习算法中完成,在该算法中,学习到的动态模型用于加速学习策略的过程。令人失望的是,这经常失败,并且除了使用前瞻时出现的复合误差现象之外,学习的模型倾向于很差地概括到它以前没有见过的状态。学习模型不能很好地推广的原因之一是因为许多神经网络架构非常一般函数逼近器,因此推广到看不见的现象的能力有限。

神经网络和感应偏置

让我们用一个简单的例子来形象化这一点。假设我们从一个类似于直线的函数中采样点,并尝试用一个学习模型来拟合这个函数。

source

如果我们尝试使用一个简单的前馈神经网络来近似这个数据,我们可能会在我们的数据被采样的值的范围内获得稳定的性能,如果我们做得好,我们可能会在某种程度上做得很好,甚至超过这个范围。但是,任何使用过神经网络的人都知道,如果我们对输入值范围从 0 到 1 的网络进行训练(如上图所示),并试图预测类似 1000 的输出,我们将得到完整的、完全无用的输出。然而,如果不使用神经网络,而是使用线性近似作为我们的模型,我们可能仍然会获得相当好的性能,甚至远远超出训练输入范围。这是因为我们的数据是从有噪声的线性线中采样的,并且使用线性近似减少了模型的假设空间,我们必须首先只搜索那些良好的候选模型。神经网络是一个更加通用的模型,可以近似任意结构的函数,但这并不意味着它是这项工作的最佳选择。

当卷积神经网络用于图像处理时,观察到类似的现象。原则上,前馈神经网络可以逼近任何函数,包括图像分类器,但这可能需要庞大的模型和令人难以置信的数据量。卷积网络(或 CNN)通过利用问题中固有的结构来更有效地执行这些任务,例如相邻像素之间的相关性和对神经网络中移动不变性的需要。

source

图形网络

回到我们近似机器人系统动力学的问题,对于这个问题,传统神经架构的一个共同特征是,它们将系统视为单个组件。例如,当建模我们的机械臂时,我们可以将神经网络的输入作为一个向量,包含我们手臂的所有角度和角速度。

source

这是系统在通用 RL 基准中建模的标准方式,通常在策略优化任务中工作良好。但当试图了解我们的机械臂的动力学时,这是不够的,因为机械臂不仅仅是角度和角速度的向量。一个机器人手臂有结构,它由几个关节组成共享相同的底层物理,并以一种与它们如何组装有关的方式相互作用。

记住这一点,我们希望我们的神经网络架构以这样一种方式来处理系统,事实证明,我们可以通过一个对图形数据进行操作的特殊神经网络来做到这一点。

来自谷歌 DeepMind 的研究人员在 2018 年发表了一篇题为“关系归纳偏差、深度学习和图形网络”的论文。在这篇论文中,他们介绍了一种新的神经网络架构,他们称之为图网络,并表明它可以用来非常准确地模拟对象之间相互作用中发生的不同物理现象,如多体引力系统中的行星,刚体粒子之间的相互作用,甚至句子和分子。可以对图形数据进行操作的神经网络的想法早于本文,但是图形网络架构概括了图形神经网络(gnn)的许多先前变体并扩展了它们。

source

这种方法的一个明显的限制是,我们需要了解系统的结构,以便用图来建模。在某些情况下,我们可能没有这些知识,但在其他许多情况下,我们有,利用这些知识可以使我们的学习问题变得容易得多。

那么这些图形网络是如何工作的呢?简而言之,图的 DeepMind 公式由规则的节点和边组成,此外还有一个全局向量。在网络的每一层中,每条边都使用它开始和结束的节点进行更新。之后,使用结束于每个节点的边的集合来更新每个节点,然后使用所有节点和边来更新全局向量。

source

这个过程可以在论文的上图中看到;首先,通过将它们的特征与它们的发送者和接收者节点的特征一起进行更新,并使用前馈神经网络来更新边缘特征向量。之后,通过将节点的特征与所有传入边的集合一起进行更新,并对它们应用另一个神经网络。最后,将所有节点和边的集合作为全局向量,用另一个神经网络更新全局向量特征。

具有学习模型的模型预测控制

在同时发表的另一篇论文中,名为“图形网络作为推理和控制的可学习物理引擎”,DeepMind 的研究人员使用图形网络来建模和控制不同的机器人系统,包括模拟和物理系统。他们将这些不同的机器人系统建模为图表,并使用数据来学习动力学模型。从论文中可以看到这样一个图表的例子:

source

以这种方式对系统建模,作者实现了对未来状态的非常准确的预测,这种预测可以很好地推广到参数变化的系统,例如更长的躯干或更短的腿。

许多应用中使用的一种强大的控制方法是模型预测控制(MPC)。在 MPC 中,我们的控制器使用动态的线性模型来提前规划固定数量的步骤,并对轨迹采用解析成本函数的导数,以使用梯度下降来优化轨迹。例如,假设我们有一个机器人手臂的线性模型,我们希望它遵循一个期望的轨迹,我们如何找到这样做所需的动作?

假设我们的成本函数是这样的形式:

这意味着,在每一步,我们希望最小化我们希望遵循的参考轨迹和实际轨迹之间的距离,我们还希望最小化能量消耗,这就是第二项所做的(假设 a 是我们在电机中使用的电压)。

利用我们有一个线性动力学模型的事实,我们可以把它写成:

由于我们的成本函数和模型都是可微分的,我们可以对这个成本函数的动作集求导,并使用梯度下降迭代优化它。

同样的事情可以用更复杂的动力学图形网络模型来完成。它对于动作也是可微分的,并且我们可以以类似的方式执行模型预测控制。

事实证明,这非常有效,在许多情况下,使用学习模型的控制与使用这些模拟机器人系统背后的真实物理模型的控制一样有效。这是向学习复杂机器人系统的动力学模型和控制策略的能力迈出的非常大的一步,具有对不确定性的鲁棒性和对系统物理参数的灵活性。

使用 UIPath 的机器人流程自动化(RPA)

原文:https://towardsdatascience.com/robotic-process-automation-rpa-using-uipath-7b4645aeea5a?source=collection_archive---------4-----------------------

(Source = https://www.laserfiche.com/ecmblog/what-is-robotic-process-automation-rpa/)

“我们对机器人着迷,因为它们是我们自身的反映。”

—肯·戈德堡

介绍

RPA 是一项正在开发的技术,用于自动化手动任务。RPA 与传统编程的区别在于其图形用户界面(GUI)。RPA 自动化是通过分解用户执行的任务并重复它们来执行的。因此,这种技术可以使基于图形的过程的自动化更容易编程。RPA 应用程序的示例包括[1]:

  • 从扫描的文档(如 pdf)中提取数据。
  • 生成电子邮件/监控电子邮件帐户。
  • 读取和创建发票。
  • 自动化薪资处理。
  • 在静态环境中自动化复杂的基于软件的任务。

RPA 利用软件机器人在 Web/桌面或 Citrix 环境中执行任务。平均而言,机器人执行同等过程的速度比人快三倍,而且它们能够全年 24 小时不间断地工作。RPA 擅长于任何类型的基于规则的重复性应用程序[2]。RPA 公司的一些常见例子有 Automation Anywhere、UIPath 和 blueprism [3]。

UIPath

UIPath Community Edition 是一款免费软件,可以在 Windows 上下载。使用 UIPath,可以实现复杂的工作流,创建基于序列和流程图的架构。然后,每个序列/流程图可以由许多子活动组成,例如记录机器人要执行的一组动作或筛选和数据采集指令。此外,UIPath 还支持错误处理机制,以防决策情况或不同流程之间出现意外延迟。这可以通过使用控制流命令来完成,例如:

  • If 语句。
  • 等待某个 UI 元素出现或消失。
  • 增加延迟。
  • 使用调试模式分解工作流执行。

Figure 1 : UIPath Interface

UIPath 的另一个特别的功能是它能够处理结构化的表格(例如 XLSX 和 CSV 文件)。这允许开发人员循环通过和过滤来自表的数据,以处理和创建从 web 或任何其他基于桌面的应用程序收集信息的结构化数据。

作为一个应用程序示例,我创建了一个 web 抓取工具来打开 Chrome,以遍历所选类别的所有 Amazon 页面。然后,我可以在一个 CSV 文件中存储该类别中每篇文章的名称、价格和链接。最后,可以对这个文件进行分析(使用 python ML 算法),以查看价格如何随时间变化,并将不同供应商的产品进行比较。

Video 1: Amazon Data Scraping Example

UIPath 目前正在开发其测试版,以将计算机视觉集成为其工作流记录应用程序的一部分。这可能允许在虚拟环境中更好地集成 UIPath,使机器人能够更详细地远程识别不同的 UI 组件。

RPA 业务应用程序

在我与 Documation 软件在的实习期间,我有机会使用 UIPath 进行 RPA 工作。作为实习的一部分,我成功地实现了两个工作流的自动化:

  1. 在财务系统中注册供应商(从结构化数据集中获取数据)。
  2. 使用来自 web 服务的数据在财务系统中创建发票。

这两个工具可以大大加快大中型公司的工作流处理速度。

为了改进上述工作流程,可以添加错误处理机制,在 CSV 文件中存储机器人执行的每个单独流程的状态日志,并标记任何异常。这将允许人类操作员稍后检查机器人如何处理该过程,并查看机器人如何对任何意外事件做出反应。

联系人

如果你想了解我最新的文章和项目,请通过媒体关注我,并订阅我的邮件列表。以下是我的一些联系人详细信息:

  • 领英
  • 个人博客
  • 个人网站
  • 中等轮廓
  • GitHub
  • 卡格尔

文献学

[1] 57 RPA 用例/应用:深度指南[2019 更新]=https://blog . ai multiple . com/robotic-process-automation-Use-Cases/

[2]德意志银行=https://www.youtube.com/watch?v=ZDKQAJuEQhY

[3] Analytics Insight,Kamalika Some=https://www . Analytics Insight . net/top-10-robotic-process-automation-companies-of-2018/

机器人在做科学

原文:https://towardsdatascience.com/robots-are-doing-science-de5fd2b5295f?source=collection_archive---------12-----------------------

Data driven AI approaches combined with robotic systems are rapidly transforming science. Image from Propagator Ventures

边缘的科学

这是一件好事

一次一个研究实验室,机器人正在接管科学。

他们正在发现新的药物,生长纳米管的新方法,并扩大我们的新材料库。

他们不会厌倦,也不会浪费时间去思考生命的意义。他们也没有威胁要组织工会或请病假。

他们中的一些人甚至开始形成自己的假设,并进行他们设计的实验——来解决他们选择的问题。

遇见亚当

亚当是世界上第一批机器人科学家之一。目前他在英国剑桥进行酵母实验。

酵母或 酿酒酵母 是负责葡萄酒、面包和啤酒的真菌。就像狗和它们的品种一样,酵母也有许多种类,每一种在基因上都略有不同。像一个雄心勃勃的研究生一样,亚当希望在尽可能多的酵母菌株上进行实验,以达到他的目标。

亚当的形状像一个移动诊所,有机器人手、离心机、冰柜和恒温箱。他没有脸也没有声音,但如果你仔细观察下面的视频,你会发现他有一个性格——偷偷写在他小心翼翼的动作中,写在他行动之间的停顿中,写在他问自己的问题中。

他从冰箱中挑选特定的酵母菌株,并将其转移到一个微量滴定器——一个有许多小试管或“井”的盘子。每个试管里都有一种营养丰富的含糖液体和一些精选的添加剂。

每隔 30 分钟,将该板放入阅读器中,仔细测量每个孔反射的光。亚当可以利用这些信息来确定每个孔中酵母的生长速度。这能告诉他添加到井中的特定化学物质对真菌是有益还是有害。

如果他愿意,他可以进入其中的一个井,舀起一些细胞,让它们在另一个井中生长,他也监测这些细胞。

亚当同时运行了一千个酵母实验,每个实验持续长达 5 天。

在这个酵母宇宙中,亚当是一个仁慈的无所不知的上帝。

亚当不仅仅是一台无脑的机器,运行着一个又一个盲目的实验。

从他庞大的数据库中,他可以挑选出一种酶,并猜测可能对此负责的基因。然后,他进行有针对性的实验来证实或反驳这一假设。

没有人参与这个过程。管理亚当的团队不知道他在看哪种酶,也不知道他提出了什么假设。他们只有在亚当检查了他的预感后才能看到结果。

Adam 的初步结果确定了超过 15 种酶的遗传标记。

但更重要的是,它宣布了一个新范式的诞生,即自主科学家

Robot scientist Eve, located at the University of Manchester. Eve studies new drug candidates for diseases. Eve is a close cousin of Adam.

虽然目前是一个小部落,但这些自主科学家的潜力如此之大,以至于许多人认为我们正处于一场重大科学革命的边缘——我们的知识每隔几年就会翻一番。

如果是这样,这可能是科学探索中“爱迪生”方法终结的开始。

爱迪生范例

1878 年,托马斯·阿尔瓦·爱迪生即将发现第一个商用电灯泡。

物理学是众所周知的:

  1. 电流通过任何材料(例如:铜线、丝绸、气体)都会使其升温。
  2. 炽热的物质发光。

如果设计巧妙,这些无处不在的双重观察可以放在一起制造电灯。

然而,为了产生足够的光,这些材料需要被加热到极高的温度。这意味着大多数物质要么与周围的空气发生反应,要么变成液体,这两种情况都不是我们想要的结果。

The light of the bulb is generated by the extremely hot filament at the center. The choice of the filament material is the result of massive scientific and engineering effort lasting years. Photo by Yuichi Kageyama on Unsplash

爱迪生面临的挑战是为他的灯泡找到不会自焚的合适材料。至少,候选材料应该能够让电流通过:也就是说,要有良好的导电性。这排除了粘土、木材和玻璃。

此外,它应该满足一些常识性的要求。它应该至少持续几天——如果可能的话甚至更长。它不应该太贵,只有爱迪生才能买得起。

然而在那个时候,还没有一本材料手册列出世界上所有的材料以及它们的光学、电学、热学、化学和机械性能。

因此爱迪生着手对一种又一种材料进行物理测试。

据估计,他用了 2000 多种材料做实验,包括他自己的头发,直到他发现了由异国情调的东方竹子制成的碳丝。

科学的劳动

现代科学的肮脏秘密是,它仍然以爱迪生 150 年前开创的同样方式运行。

当然,我们肯定已经走了很长的路,因为这个过程的大部分现在是由我们深厚的科学知识和直觉驱动的。我们知道我们使用或需要的东西背后潜在的物理和化学,这有助于大大缩小搜索空间。今天的科学家不太可能把自己的头发放入熔化的金属中,而是希望得到 vibranium。

来自外部的科学遵循高度组织化的逻辑进程,其中每一步都是先验知识和思考的结果。

但在内部,仍然存在混乱和任意选择。

Closed loop workflow of data driven science. The potential chemical space available for exploration is impossibly vast. Theoretical models and computer simulations help us narrow this down to smaller subset of combinations — which is too big for manual exploration but might be accessible to autonomous systems. The robotic agent studies a smaller subset of this region, measures the results and uses this information to improve its own selection and planning criteria. Image taken from ‘Using artificial intelligence to accelerate materials development’

例如,为了制造一种轻质钢,基础物理和化学知识可能会告诉冶金学家,他的最佳选择是在铁中添加镍、铬或锰。

但是从这里开始,没有真正的前进道路,除非这些组合中的每一种都是物理合成的,并且最终的合金在实验室中对其物理和化学性质进行表征。这些实验可能很简单,也可能很复杂。可能需要重复,直到我们能够确定结果。

在地面上,科学是人类的努力,立足于对真实自然现象的公正观察。

如果有一千个计算或方程式指出镍是与铁搭档的最佳金属,只要有一个观察反驳它,这并不重要。

发现新药、电池元件、汽车零件、玻璃、溶剂、纺织品、陶瓷、电子材料、合金、液体、凝胶等仍然是一项艰巨的任务,需要令人生畏的体力劳动。

这就是像亚当和夏娃这样的自主机器人科学家承诺要创造一场革命的地方。

高通量实验

与人类科学家相比,使用机器人进行实验的明显优势是可以探索更大的搜索空间。

亚当研究了数千种酵母菌株,在他的项目周期中进行了超过 600 万次测量。一个在一年内研究 50 种酵母菌株的研究生会被认为是超级明星。

在时间和空间上进行大量实验的能力是发现新材料的一个特别重要的要求。

我们知道元素周期表中的大约 120 种元素——为什么我们不能把它们每一种都成对地混合起来,看看我们最终会创造出什么?也许这里有一种超级合金或者一种新的磁铁。甚至可能是超导体?

仅仅是元素按 50:50 比例的二元组合就需要我们创造和研究 7140 种材料。但是这里的问题是,我们需要研究所有可能的组合比率!

The workflow of Science. The current paradigm typically takes 10 to 20 years to scale a product from conception to commercialization. The emergent AI driven approaches are promising to reduce this time to as little as 5 years. From [‘Inverse molecular design using Machine learning: Generative design for matter engineering’](https://science.sciencemag.org/content/361/6400/360)

目前正在努力解决这些问题的一小部分。国家可再生能源实验室的高通量实验数据库包含超过 60,000 个金属样品薄膜。该数据库包含这些材料的结构、电学和光学信息,可供公众查阅。

空军研究实验室的自主研究系统 (ARES)一直在研究快速生长碳纳米管的最佳条件。通过结合数学见解和遗传算法,该系统已经达到其目标增长率,确定了对碳纳米管生长最有影响的条件。它通过一天运行 100 个实验达到了这个目标。

随着深度学习的爆发,科学家们正在将敌对网络和变分编码器等技术与机器人技术相结合,以创建更高级版本的 Adams。这些系统不仅进行了大量的实验,涵盖了组成空间的巨大区域,而且它们还随着每次迭代而自我完善——就像人类科学家会做的那样。

自主科学家最近进入了商业领域,如atom wisebenevolent aiZymergen 等公司致力于开发闭环系统,以发现材料、有机物和药物。**

然而,人类科学家并没有被机器人取代的危险。我们提供了先进的自动化所不能提供的东西:创造力。

如果有的话,这可能意味着未来的研究生院将是一个非常不同的地方,每个学生都能够同时进行成千上万的实验。

然而,科学将会永远改变,用太多的知识淹没我们,让我们不知如何是好。

新的材料和设备将使世界变得无法辨认,而这些现在都不存在了。

机器人正在从事科学研究,这是一件好事。

延伸阅读

  1. Philip Ball,利用人工智能加速材料开发, MRS 通报,2019 年 5 月
  2. 罗斯·金等人,科学的自动化,科学,2009
  3. Alan Guzik 和 Kristin Persson,材料加速平台,2018

您应该知道的健壮和非健壮的数据简化方法

原文:https://towardsdatascience.com/robust-non-robust-methods-for-data-reduction-you-should-know-a1dc7347a802?source=collection_archive---------18-----------------------

网络技术的快速发展、云计算、移动互联网的出现以及物联网设备的出现(如家用电器和自动驾驶汽车)导致了大量数据的创建、交换和存储。但是,这些数据中的大部分可能包含大量冗余和噪声。提高机器学习(ML)模型的预测精度在于选择最小和最紧凑的有用数据集;数据清理过程中的一个棘手问题。减少数据大小(维度)的原因包括实现 CPU 和 GPU 计算工作时间的减少。不用说,没有人希望在确定预测模型大致准确之前,花费数百美元运行云计算能力。可以通过几种方式对数据集进行数据缩减。在数据分析和机器学习预测建模中,我们经常会问这样的问题,所有的属性、子集或至少一个预测因素是否有助于解释反应?

观测值减少

在减少观测数据的情况下,粗略的方法是将数据切成两半,或者任何其他比例。假设观察结果是真正随机的,尽管有好处,也不建议这样做。例如,如果我们要收集大量的曲目和用户级别的音乐元数据,那么我们可以选择数据集中的前几行,并且仍然能够很好地表示整个数据群体。然而,如果数据不是随机的,这可能会带来麻烦。假设我们有一个音乐记录的数据集;第一行可能是特定于“Jazz”这样的流派的数据点—在这种情况下,样本是有偏差的。最安全的选择是分层抽样。比方说,我们的模型需要“流派”作为由类变量组成的解释属性;爵士乐、摇滚乐、古典音乐、流行音乐等。我们可以对原始数据集中出现的每个变量进行相同分布百分比的采样。

减少数据观察是很容易的,但是我们不能说属性也是一样。数据集包含多达数百个属性,这些属性不应该挤在预测模型中。

简单属性约简技术

当谈到属性约简时,工具和概念变得相当复杂。我们可以通过使用数据集的专业知识、可视化和执行简单的统计分析来决定移除属性,或者使用一种强大的统计工具来减少数据。让我们看一个例子,展示在 IMDB 5000 电影数据集上的可视化和简单的统计分析。我们想检验“流派”是否对 IMDB 分数有任何影响。也就是说,如果我们想要拟合一个模型来预测 IMDB 分数,我们需要“流派”作为一个解释属性,还是完全删除它?

我们首先从下面的链接下载 IMDB 数据集,并运行下面的代码。

library(data.table)library(GGally)
IMDB <- read.csv("movie_metadata.csv")sum(duplicated(IMDB))IMDB <- IMDB[!duplicated(IMDB), ]ggplot(imdb_score, aes(imdb_score)) + geom_histogram(binwidth = 0.5, color = "dark gray")

IMDB 分数显示了在 6 到 8 之间向右倾斜的分布。除了一些低频类型,这使我们认为,给定足够的类型样本数,我们往往会发现他们的平均 IMDB 分数也在这个范围内。这是考虑该属性对 IMDB 分数的解释价值很小的良好开端,但是我们将通过使用平均值的简单统计来确认这一点。

“流派”是由一个或多个流派组合的字符串组成的分类属性。在这个分析中,我们避免解析字符串中的流派,并计算它们的平均值以避免复杂的平均值相加。相反,我们选择了电影业中最常用的电影类型配方。

sort(summary(IMDB$genres),dec=T) #topmost commonly used movie genres excluding ‘others’gnr.df <- as.data.frame(IMDB[,c("genres", "imdb_score")])gnr.df$'Comedy|Drama' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Comedy|Drama") 1 else 0)gnr.df$'Comedy' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Comedy") 1 else 0)gnr.df$'Horror' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Horror") 1 else 0)gnr.df$'Drama' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Drama") 1 else 0)gnr.df$'Documentary' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Documentary") 1 else 0)gnr.df$'Comedy|Drama|Romance' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Comedy|Drama|Romance") 1 else 0)gnr.df$'Comedy|Romance' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Comedy|Romance") 1 else 0)gnr.df$'Drama|Romance' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Drama|Romance") 1 else 0)gnr.df$'Crime|Drama|Thriller' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Crime|Drama|Thriller") 1 else 0)gnr.df$'Action|Crime|Drama|Thriller' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Action|Crime|Drama|Thriller") 1 else 0)gnr.df$'Action|Crime|Thriller' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Action|Crime|Thriller") 1 else 0)gnr.df$'Drama|Thriller' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Drama|Thriller") 1 else 0)gnr.df$'Crime|Drama' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Crime|Drama") 1 else 0)gnr.df$'Horror|Thriller' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Horror|Thriller") 1 else 0)gnr.df$'Crime|Drama|Mystery|Thriller' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Crime|Drama|Mystery|Thriller") 1 else 0)gnr.df$'Action|Adventure|Sci-Fi' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Action|Adventure|Sci-Fi") 1 else 0)gnr.df$'Comedy|Crime' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Comedy|Crime") 1 else 0)gnr.df$'Documentary' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Action|Adventure|Sci-Fi") 1 else 0)gnr.df$'Drama' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Comedy|Crime") 1 else 0)gnr.df$'Comedy' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% " Action|Adventure|Thriller") 1 else 0)gnr.df$'Horror' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% " Drama|Mystery|Thriller ") 1 else 0)means <- rep(0,17)for (i in 1:17) {means[i] <- mean(gnr.df$imdb_score[gnr.df[i+2]==1])}plot(means, type = "b", col = "dark red", ylim = c(1,8), xlab = "Genres")

上图显示,体裁作为一种预测因素,并不能很好地解释反应 IMDB 得分,因为平均而言,使用频率最高的体裁组合的 IMDB 得分在 6 到 7 之间。实际上,我们可以通过消除流派来合理而自信地减少数据集的维度。

属性约简:相关性分析

相关性测试的思想是识别两个属性之间的线性强度或者它们之间的相关性强度。这种分析有助于我们确定属性的相互依赖性。一方面,可能有完全的独立性,而另一方面,我们可能有共线性;其中一个变量是另一个变量的线性函数。换句话说,由于这两个属性往往会一起增加或减少,因此很难区分给定预测模型对响应的单独影响。

必须指出的是,在相关性分析中,属性量化了一对属性(即两个属性)之间的关联,而不是大量属性之间的关联。当处理具有数百个属性的大型数据集时,将会有成千上万个相关性的矩阵。即使数据是完全随机的,你也会偶然发现一些属性对之间有很高的相关性。

掌握相关分析背后的技术概念是值得的。如果你不喜欢这些定义,可以随意跳过。我们首先定义两个统计概念;协方差和相关性。

协方差、相关性和相关系数

协方差:类似于方差,它测量单个随机变量与其均值的平方偏差(Var(X)= E(X)-E(X)))。协方差衡量两个属性如何一起波动。换句话说,如果第一个属性很大,第二个属性也很大,两者会一起波动。

相关性就是协方差的归一化版本。对此的解释是,协方差数量很少用作推断两个属性之间关系强度的描述性统计,因为协方差数量取决于两个属性的单位度量。换句话说,如果我们有两个属性,用两个独立的单位来度量,那么得到的量就是一个我们不能与任何一个单位相关联的数字。因此,协方差通常通过除以两个属性的标准偏差的乘积来标准化(即,零均值和方差为 1),从而得到一个称为相关系数皮尔逊相关系数的量。

从数学上也可以看出,相关系数是两个标准化列向量(即,属性值)之间角度的余弦。例如,如果两个单独的属性值接近,则两个向量之间的角度将很小,其余弦值接近+1,这表明正相关性很高。如下图所示,相对方向(正和负)的向量(箭头)相对于水平轴(深红色)属性是非正交的或相对平行的,以指示某种数量的关系。

Vectors with various degrees of correlation and directions

计算相关系数

为了进行相关分析,我们使用 r 等统计软件来计算相关系数,这是一个相当简单的操作。相关系数是一个介于+1 和-1 之间的数字。正号或负号表示相关的方向。正号表示直接相关;第一属性的单位值的增加使第二属性增加一个单位值,而负号表示负相关;第一属性的单位值的增加使第二属性减少一个单位值。但是,如果属性之间没有明显的线性关系,则相关性为零或接近于零。

前面的陈述带有一些警告:

1 —接近零或零相关系数不一定意味着没有关系,而是意味着 没有线性关系 。这基本上告诉我们,这两个属性具有零或接近零的相关性,但却相互依赖,通常以非线性方式

2 —尽管相关系数旨在量化一对变量之间的线性关联强度,非线性关联有时会产生不反映关系强度的相关性

3 —计算具有明显非线性关系的一对变量的相关系数通常是不明智的。因此,相关性并不是属性内关系的详尽总结。一个好的做法是绘制属性,并对其统计数据摘要进行可视化检查。

4-相关系数的使用很大程度上取决于一对属性是从高斯(正态)分布中抽取的样本这一事实。因为有些属性比其他属性具有更高的分散性,所以值得检查每个属性的分布形式,并考虑是否有任何属性需要转换。例如,对数变换通常用于减少正偏度,并产生更接近正态的分布。

5-分析最终有助于在检查随机属性时识别一些潜在的冗余。但是某种程度的相关性不应该总是意味着其中一个是冗余的,尽管如果相关性非常高,那么其中一个可能是“几乎冗余的”。

以下面的代码示例为例,绘制一个数据集来说明第 1、2 和 3 点。

*set.seed(1)x = rnorm(600) #vector withdrawn from a normal distributiony = 1 + x + 0.5*x^2 #nonlinear function (1)plot(x,y)legend(-3,12, c("Pearson",round(cor(x,y),2)))y = 1 + x^2 #nonlinear function (2)plot(x,y)legend(-3,15, c("Pearson",round(cor(x,y),2)))*

在图的左侧,皮尔逊相关系数很大(> 0.8),但是属性呈现非线性关系。图的右侧是另一个非线性关系,其中相关系数接近于零。如果不直观地检查属性,我们将无法看到关联的真实性质。

让我们运行另一个代码示例,但这次是在汽车数据集上,以显示冗余。我们想从数据集中得到的答案来自以下内容:每加仑英里数(mpg)可以从其他属性中预测出来吗?

*library(GGally)path = "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data"auto_data <- read.csv(path, header = F, sep = "", quote = "\"'", na.strings ='?')colnames(auto_data) <- c('mpg', 'cylinders', 'displacement','horsepower', 'weight', 'acceleration', 'model_year', 'origin', 'name')str(auto_data) #we see there is '?' value in the datasetround(cor(auto_data[,c(-7,-8,-9)]),2)ggcorr(auto_data[,c(-7,-8,-9)], label = T)*

Various correlation values between set of attributes

气缸和排量高度相关(+1)。它们之间共线性的存在意味着气缸提供的关于响应 mpg 的信息在位移存在时是多余的。即使我们从力学的角度来分析这两个属性,也是如此。

高维空间中的多重共线性问题

到目前为止,我们已经讨论了线性相关性可以通过相关系数来检测。但是,在高维空间(即大型属性集)中,我们仍然可以看到三个或更多属性之间的共线性,而不会显示每对属性之间的高度相关性。这种现象称为多重共线性。我们不会进一步讨论这个话题,但是,解决方案可能相对简单的是,使用主成分分析(PCA),虽然这不是它的全部。

主成分分析

PCA 可能是最广泛使用的数据简化技术。即使该技术实际上并不涉及删除属性本身,而是通过将一组相关属性转换成所谓的主成分来实现约简。每个主成分都是原始属性的线性组合,所有主成分都是相互正交的,所以没有冗余信息。此外,每个新的主成分应该指向原始数据中最大可能方差的方向。简单地说,主成分将给出方差的方向和大小,这将帮助我们更好地预测响应。

但是为什么 PCA 关注数据集中的方差呢?请记住,信息都是关于可变性的。当一个属性的方差为零时,它不会泄露任何有价值的信息,因为这意味着它的所有观测值都是相同的。此外,PCA 与转换连续属性(即定量)有关。

PCA 的另一个好处是它还允许我们可视化大量的属性。假设我们有一组 10 个属性,如果我们要为每个属性组合创建一个散点图,以确定任何可能的相关性,我们最终会有 45 个图!当属性的数量非常大时,这不是一个可行的尝试。

PCA 是一种无监督方法,因为它处理一组属性而不考虑响应属性。也就是说,没有关于它们对反应的影响的指导。我们稍后将回到这一点。此外,PCA 不假设原始数据集的潜在概率分布。即,它是否是正态(高斯)l 分布。幸运的是,在现实世界中,数据是高斯分布的,PCA 通常是一种健壮的技术,因此我们可以松一口气了。

为了直观显示这一过程,下图显示了以 x、y、z 轴表示的数据集的 1A 图,该数据集包含四个不同颜色和形状的实验数据集。我们可以看到数据集表现出一定的线性。第一和第二主成分 PC1 和 PC2 一起将数据集转换为最具可变性方向上的一组新的基向量。1B 图是数据集到由 PC1 和 PC2 轴表示的二维空间的变换。我们可以看到,数据集的最大方差或动态性主要是沿着 PC1 解释的,而 PC2 方差相对更接近于零,因此其等级更低。如果我们沿着 PC1 线投影 1B 图中的数据,最后一句话会更好理解,其中显示 PC1 仍然靠近原始数据集,并且具有最大的方差,而 PC2 投影将给出较小的方差,并且距离原始数据集最远。

3-dimensional observations sample are transformed onto a 2-dimensional space that maintains the largest variance in the data.

存在许多计算主分量的方法,如幂法、谱分解、特征值分解(ED)、奇异值分解(SVD)和神经网络算法。r 软件包提供了内置函数 prcomp()来计算使用奇异值分解(SVD)技术的 PCA。在计算一组属性的主成分之前,它们应该被标准化为具有一个和零均值的方差。实际上,该计算从相关矩阵而不是协方差矩阵中找到主分量(请参见上面的相关和协方差概念)。

求解 PCA:特征向量和协方差

如果你不喜欢,这部分可以跳过。我们可以通过特征值分解(ED)技术来解释 PCA,以帮助我们发展技术直觉。它的要点可以归结为以下几点:

1-减去数据集 x 中每个属性的平均值。

2-求 x 的协方差的特征向量。

3-执行基的改变:位于 m 维空间中的数据集(即> = 2)。PCA 询问是否存在另一组基向量,它是原始基向量的线性组合,可以更好地表达数据集?我们所说的更好是指方差和投影最大的方向最接近原始数据集。用线性代数的话来说,基的变化是一个矩阵 P,它将把数据集 X {V1,V2,…,Vn}变换成 Y {V1,V2,…,Vn},其中 V 是一个向量。这种新的数据表示用这组新的基向量来表示,这些基向量是彼此正交的主分量,并且指向变换数据集的最大方差的方向。基本上,我们要求一个矩阵 P 来完成这个转换。

a.计算数据集 Y 的协方差,并将其命名为 CY,它捕获所有可能的属性对之间的协方差。这个平方协方差矩阵将具有非对角线上的协方差值和对角线上的方差值。

b.通过矩阵 p 对角化 cy 来优化协方差 CY,以达到最小化数据集中冗余的目的,即 CY 中的所有非对角值(协方差值)都应该为零。

c.前一点指的是线性代数方法,该方法认为对角化 CY 的正交矩阵 P 是数据集 X 的协方差的特征向量,因此是其主分量。

d.CY 的对角线值是 X 数据集属性的方差。

e.根据最大方差对 CY 进行排序,以帮助找到 p 中最重要的对应主成分。

虽然 PCA 仍然是一种健壮的技术,但是它肯定有一个缺点,即 PCA 关于每个主成分的重要性的决定不依赖于响应属性。换句话说,在等级中被降级的具有低方差的主成分对于预测响应也可能是重要的,并且在某些情况下甚至更重要。因此,有其他方法可以帮助克服这种偏见。可以使用稳健的方法偏最小二乘法(PLS ),该方法简单地利用响应来识别新属性,该新属性不仅很好地估计了旧属性,而且与响应相关,实际上,它找到了解释响应和预测值的方向。

总结

我们已经讨论了用于执行预测建模的各种数据简化方法。目的是缩小属性和观察值的选择范围,简洁地解释响应,并帮助快速运行所选的模型。一些归约方法可能需要数据集的专业知识,或者可视化和执行统计分析。一些方法是不稳健的,包括通过分层采样的观察减少,或通过 2 维或更多维空间的相关性分析的属性减少,以及最后,使用 PCA,一种稳健的技术,用于减少数据集的维度空间而不丢失高维空间中的重要信息。我们还解释了每种方法都有其独特的挑战或缺点,但这不应该阻止人们进一步探索这些方法。

鲁棒优化的 BERT 预训练方法

原文:https://towardsdatascience.com/robustly-optimized-bert-pretraining-approaches-537dc66522dd?source=collection_archive---------21-----------------------

Photo by Joakim Honkasalo on Unsplash

用于增强 BERT 模型性能的预训练方法的变化摘要

自然语言处理(NLP)近年来一直处于上升趋势。这都归功于语言模型(lm)预训练方法。由于各种原因(训练数据、计算成本和超参数选择),仔细比较 lm 预训练方法几乎是不可能的。在这篇文章中,我将总结 BERT 的预训练方法中的一些变化,这些变化影响了最终的结果,因此它在 9 个胶合任务中的 4 个中实现了最先进的结果。要获得详细的理解,请阅读下面的文章。

[## RoBERTa:一种鲁棒优化的 BERT 预训练方法

语言模型预训练带来了显著的性能提升,但是仔细比较不同的方法…

arxiv.org](https://arxiv.org/abs/1907.11692)

伯特训练不足

我们几乎认为 BooksCorpus英文维基百科数据集(总共 16 GB)足以让一个语言模型获得对语言的基本理解,但事实并非如此。脸书和华盛顿大学的研究人员(论文作者)在 DGX-1 机器上训练了罗伯塔总共 160 GB 的未压缩英语数据集,每台机器都有 8 x 32GB 的英伟达 V100。

Table 1: Comparing the dataset size and the performance of various models. (image is taken from the paper)

在上表中,我们可以看到,在类似的设置下,RoBERTa 在小队和 MNLI-m 任务中仅用了 100k 步就超过了 BERT large model(相比之下,BERT 用了 1M)。

下一句预测损失

BERT 使用两种不同类型的训练目标,一种是掩蔽语言模型(MLM),另一种是下一句预测(NSP)。在 MLM,BERT 选择 15%的标记进行替换,其中 80%的标记被替换为【面具】,10%保持不变,10%被随机选择的词汇标记替换。

NSP 是一个二元分类任务,它预测两个输入段是否同时出现。该目标旨在改进下游任务,因为它需要模型理解两个给定序列的关系和上下文。正如在论文中观察到的,去除 NSP 会损害自然语言理解(NLU)任务的表现。但是在最近的一些模型中,如 XLNet 、 SpanBERT 等,NSP 损失的必要性受到质疑。

因此,在各种设置(段对、句子对、完整句子、文档句子)下进行实验,以比较 NSP 损失对模型性能的影响。在 SEGMENT_PAIR(有 NSP 损失)中,设置原始 BERT 的原始输入格式被使用,类似地,在句子对(有 NSP 损失)中,设置输入被从来自相同文档或不同文档的连续部分取样。但是在全句子(没有 NSP 损失)中,设置输入由来自一个或多个文档的完整句子组成,类似地,在文档句子中,设置输入与来自相同文档的完整句子打包在一起。这些实验的输入大小保持在 512。

Table 2: Comparison of performance of models with and without NSP loss (image is taken from the paper)

该表显示, DOC-SENTENCES(无 NSP 损失)设置中的模型优于所有其他模型。如同在其他设置中一样,该模型不能学习长程相关性。尽管如此,RoBERTa 使用完整句子设定训练目标。

静态屏蔽与动态屏蔽

在 MLM 训练目标中,BERT 在数据预处理过程中仅执行一次屏蔽,这意味着在每一个历元都将相同的输入屏蔽提供给模型。这被称为静态屏蔽。为了避免每个时期使用相同的掩码,训练数据被复制 10 次。如果每次将序列输入模型时都执行屏蔽,则模型会看到同一句子的不同版本,屏蔽位于不同的位置。这里,这种类型的屏蔽被称为动态屏蔽。

Table 3: Comparison of performance of models trained with static and dynamic masking

用动态掩蔽训练的模型的性能稍好于或至少可与 BERT(即静态掩蔽)模型中使用的原始方法相比,因此用动态掩蔽训练 RoBERTa。如果您有兴趣了解屏蔽是如何工作的,以及它如何提高 BERT 模型的整体性能,您可以查看这个链接。

大批量小批量训练

如果相应地提高学习速度,用大的小批量训练可以提高优化速度和最终任务性能。这显示在以前的工作(显示论文链接)在机器翻译中完成。为批量大小为 256 的 1M 步骤训练模型的计算成本相当于为批量大小为 8K 的 31K 步骤训练。用大的小批量训练模型改善了 MLM 目标的复杂性,同样,通过分布式数据并行训练更容易并行化。即使没有大规模并行化,效率也可以通过梯度累积来提高。

Table 4: Comparison of the effect of increasing batch size (bsz) and learning rate and performance of the model

字节对编码

字节对编码(Byte-Pair Encoding,BPE)是字符级和单词级表示的混合,它只依赖于子单词单元。这些子词单元可以通过对训练数据集执行统计分析来提取。一般来说,BPE 词汇表的大小范围从 10K -100K 子词单位。

BERT 使用 30K 的字符级 BPE 词汇大小,它是在用启发式记号化规则预处理之后学习的。罗伯塔使用了由拉德福德等人(2019) 在论文中讨论的编码方法。这里,BPE 子词词汇表减少到 50K(仍然大于 BERT 的 vocab 大小)个单位,具有编码任何文本的能力,而没有任何未知标记,并且不需要预处理或标记化规则。在某些情况下,使用这种编码会降低最终任务的性能。尽管如此,这种方法还是用于编码,因为它是一种通用的编码方案,不需要任何预处理和标记化规则。

结论:

  1. 在选择预训练策略(和超参数选择)时,即使是最小的决策也对模型在最终级任务中的性能起着至关重要的作用。
  2. 大多数最先进的变压器模型训练不足。即使是训练时间最长的 RoBERTa 模型在 500k 步后也没有过度拟合。

ROC 曲线,完整介绍

原文:https://towardsdatascience.com/roc-curve-a-complete-introduction-2f2da2e0434c?source=collection_archive---------3-----------------------

作者:雷扎·巴盖里

ROC(接收器操作特性)曲线是一种有用的图形工具,用于评估二元分类器的性能,因为其区分阈值是变化的。为了理解 ROC 曲线,我们应该首先熟悉二元分类器和混淆矩阵。在二进制分类中,给出了一个对象集合,任务是根据对象的特征将其分为两组。例如,在医学测试中,我们希望分类器根据某些特征(如医学测试结果)来确定患者是否患有某种疾病。

评估分类器意味着测量预测类或标签与评估集中真实标签的匹配程度。在二元分类法中,我们通常把两类中较小的和较有趣的称为正类,把较大的/另一类称为负类。在医学诊断问题中,患有疾病的患者通常是阳性的,而其他人是阴性的。图 1 显示了一个简化的数据集,其中只有一个特征和两个标签。横轴表示特征 x,纵轴表示标签,可以是正的也可以是负的。在这个图中,蓝圈是正数,红圈是负数。

Figure 1

这是我们的训练数据集,每个点称为一个例子。现在,我们希望我们的分类器学习训练数据集,并仅基于特征值预测示例的标签。分类器预测可能不完美,并且在预测实际标签时可能出错。因此,二元分类器的预测有四种可能的结果:

True Positive ( TP ):这里分类器预测或标记一个肯定的项目为肯定的,这是一个正确的预测。

真否定( TN ):这里,分类器正确地确定否定类别的成员应该得到否定标签,这又是正确的预测。

假阳性( FP ):分类器误将一个阴性项目预测为阳性,称为 I 型分类错误。

假阴性( FN ):分类器错误地将一个阳性项目标记为阴性,称为 II 型分类错误。

图 2 显示了这些结果的图形表示。

Figure 2

这四个结果定义了一个 2×2 a 的列联表或混淆矩阵,如图 3 所示。为了记住这些术语,您可以分别用正确和不正确替换 True 和 False,也可以分别用选择和拒绝替换肯定和否定。

Figure 3

所以,比如假阳性( FP )就是选错了。现在,我们可以根据这些新概念为分类器定义一些评估统计数据或指标:

准确率:正确预测数与总预测数之比。所以:

灵敏度也称为召回或真阳性率( TPR ):它测量被分类器正确预测(或召回)为阳性的初始阳性的比例。

精度:分类器的肯定预测中真正肯定的部分。

特异性或真阴性率( TNR ):被分类器正确预测(作为阴性被拒绝)的阴性比例。

假阳性率( FPR ):被错误选择为阳性的阴性比例。

图 4 显示了这些指标的图形表示。

Figure 4

随机分类器

现在,我们考虑一些特殊情况,并尝试为它们计算这些性能指标。对于第一种情况,我们假设我们有一个预测任何数据点为阳性的差分类器。如图 5 所示,这个分类器从不拒绝任何数据点为负,所以 TN = 0。它也从不漏掉一个正数,所以 FN=0 。现在我们有:

回忆或 TPR = TP/(TP+FN) = TP/TP = 1

FPR = FP/(FP+TN) = FP/FP =1

Figure 5

对于第二种情况,我们假设我们有另一个糟糕的分类器,它拒绝所有的数据点,并且从不选择任何数据点作为阳性(图 6)。由于没有选择(无论是正确的还是不正确的) TP=FP=0,所以:

回忆或 TPR = TP/(TP+FN) = 0/(0+FN) = 0

FPR = FP/(FP+TN)= 0/(0+TN)= 0

Figure 6

到目前为止,我们有两个总是选择或拒绝所有数据点的分类器。现在我们假设有第三个分类器位于两者之间。它被称为随机分类器。对于每个数据点,它以相等的概率随机地将它们标记为正或负。因此,这就像挑选一个数据点,然后抛硬币来决定应该给它分配哪个标签。现在想象我们总共有 N 个数据点,并且 N 是一个非常大的数字。我们还假设实际正的数量是 Np ,实际负的数量是 Nn 。现在,对于分类器选取的每个点,它实际上是正数的概率是 Np/N ,它实际上是负数的概率是 Nn/N 。对于阳性点,其被分类器标记为阳性或阴性的概率为 0.5。现在我们可以计算这个分类器得到每个结果的概率。

对于一个 TP 为正的概率是 Np/N ,被预测为正的概率是 0.5 所以总概率是 (Np/N)×0.5 。用类似的方法,我们可以计算出其他结果的概率。

FN= (Np/N)×0.5

FP= (Nn/N)×0.5

TN=(Nn/N)×0.5

所以我们看到得到 TP 的概率等于 FN 也就是说 TP=FN 。同理, FP=TN 。这意味着:

TPR = TP/(TP+FN)= TP/(TP+TP)= 0.5

FPR = FP/(FP+TN)= FP/(FP+FP)= 0.5

如果分类器选择了一个概率较低的正呢?例如,想象一个分类器,它以 0.3 的概率预测一个肯定的结果,并以 0.7 的概率将其拒绝为否定的结果。然后:

TP= (Np/N)×0.3

FN= (Np/N)×0.7

FP= (Nn/N)×0.3

TN= (Nn/N)×0.7

TPR = TP/(TP+FN)= 0.3/(0.3+0.7)= 0.3

FPR = FP/(FP+TN)= 0.3/(0.3+0.7)= 0.3

所以,通过改变选择概率, TPRFPR 都会改变,但始终保持等于选择概率。事实上,我们之前研究的前两个分类器也可以描述为随机分类器的一个特例。对于预测一切为正的分类器,选择概率为 1,所以 TPR=FPR=1 ,对于拒绝一切的分类器,选择概率为零,所以 TPR=FPR=0 。图 7 显示了 TPRFPR 的关系图,以及这些分类器各自的分数。

Figure 7

在该图中,点 B 代表一般随机分类器,其以概率 p 预测正点。A 点是预测一切为负的分类器,可以认为是随机分类器 p=0 。C 点是预测一切为正的分类器,是随机分类器 p=1TPRFPR 的范围都是从 0 到 1,并且所有这些点都位于对角线上。通过改变选择概率,可以改变随机分类器沿对角线的位置。

我们现在可以用一种更数学的方式来表达选择概率。对于数据集中的每个点 i ,我们将使用 x(i) 来表示输入特征,使用 y(i) 来表示我们试图预测的实际标签或目标变量。在二进制分类的情况下, y(i) 取二进制值。这里我们假设对于正的点 y(i)=1 ,对于负的点 y(i)=0 。因此,一对 (x(i),y(i)) 定义了训练数据集中的每个点或示例。我们的任务是学习一个函数 h: X → Y 使得 h(x)y 对应值的良好预测器,函数 h 称为假设。 h(x) 应该给出每个点的正标签的概率 x(i) ,其数学上可以写成:

P(y=1|x) = h(x)

其中 P 是给定 x 对于每个点 i 的条件概率 y=1 。因为我们只有两个可能的类别,所以负标签的概率简单地是:

P(y=0|x) = 1-h(x)

分类器应该使用 x 值为每个点计算 h(x) 以预测该点的标签。我们如何定义随机分类器的 h(x) ?这里我们假设 h(x) 在 0 和 1 之间具有均匀分布。这种分布具有恒定的概率,并且这与我们的随机分类器一致,该随机分类器总是以恒定的概率选择阳性。所以:

h(x) ~均匀(0,1)

但是 h(x) 仅仅给出了点 x(i) 具有正标签的概率。我们怎么能说它是积极的还是消极的呢?我们定义了一个选择阳性的阈值。如果 h(x) 大于或等于阈值,我们将 x 标记为正,如果小于阈值,我们将它标记为负:

h(x) ~均匀(0,1)

如果 h(x)≥阈值则 y(I)= 1

y(i)=0 如果 h(x) <阈值

现在我可以说明,如果你想让随机分类器的选择概率为 p ,阈值应该等于 1-p

我们知道:

如果 h(x)≥阈值,y(I)= 1

X 是一个随机变量,可以取 x 的值。如果我们假设 h(X) 在 0 和 1 之间具有均匀分布。那么 h(X) 的概率分布函数 ( pdf )简单来说就是 1。

现在我们可以计算它大于阈值的累积概率:

所以h(X)≥阈值的概率是 p 也就是说 y(i)=1 的概率也是 p ,分类器以概率 p 预测一个正。

当选择概率为零时,阈值将为 1 ( TPR=FPR=0 ),当选择概率为 1 时,阈值将为零( TPR=FPR=1 )。因此,在图中,通过将阈值从 1 变为 0,我们沿着图 8 中从点 A 到点 C 的对角线移动。

Figure 8

现在我们将学习如何用 Python 实现这个随机分类器。首先,我们需要定义一个非常简单的数据集(清单 1)。

如果您运行这个代码,您将得到这个数据集的图,如图 9 所示。

Figure 9

这里我们有 50 个只有一个特征的例子( x )。一半点标为负( y=0 ),另一半点标为正( y=1 )。正负点之间没有重叠(在 x 值上)。现在我们需要定义假设函数 h(x) (清单 2)。函数predict_proba()负责为每个 x 返回 h(x) 。它接受一个数据实例数组( x ),并使用Numpy的均匀分布返回一个概率数组。因此,现在每个点都被赋予一个概率,该概率来自 0 和 1 之间的均匀分布。

现在我们定义准备 ROC 曲线中的点的函数(清单 3)。该函数获取由predict_proba()生成的所有点的概率数组以及实际标签数组( y )。然后,它定义介于 0 和 1.1 之间的阈值。你可能会问为什么门槛的上限是 1.1?而不是 1?稍后我会解释。对于每个阈值 t ,如果该点的 h(x) (具有正标签的概率)大于或等于 t ,则该函数预测为 1,否则为零。然后基于这些预测值和 y 中的实际值,建立混淆矩阵,计算出 TPRFPR 值。最后,它为每个阈值返回具有相应值 TPRFPR 的阈值数组。 TPRFPR 阵列将用于绘制 ROC 曲线。

图 10 显示了使用 Python 代码绘制的 ROC 曲线。你可能会注意到 ROC 曲线没有那么接近对角线,这也意味着每个阈值的 TPRFPR 值不够接近。

Figure 10

这是因为我们没有那么多的数据点。想象你有一枚公平的硬币,你把它抛 10 次。正面和反面的总数不一定相等,但是,如果你增加投掷次数,正面和反面的总数会更接近。因此,如果我们显著增加例子的数量,我们将得到一个更真实的 ROC 曲线。清单 4 通过将示例数量增加到 10000(同样,一半的点标记为 1,另一半标记为 0,没有重叠)做到了这一点。结果如图 11 所示。现在 ROC 曲线非常接近对角线,并且清楚地表示随机分类器。

Figure 11

这些结果表明, TPR vs FPR 的图可以用于评估二元分类器的性能,然而,我们迄今为止所研究的分类器并不真正有用,因为它们都是盲目工作并随机选择正数据点。我们如何在这个图中包含一个真正的分类器?

逻辑回归分类器

逻辑回归是一种统计模型,可用于二元分类。这里我们使用逻辑回归来研究二元分类器的行为。我假设您已经对此很熟悉,并且只给出了简要的描述。该模型假设假设具有以下形式:

其中 xi 为特征, g 称为逻辑函数或 sigmoid 函数。图 12 显示了 sigmoid 函数的曲线图。

Figure 12

ai 的最佳值将在学习过程中确定。因为我们的数据集中只有一个特征:

现在和以前一样,我们有:

P(y=1|x) = h(x)

P(y=0|x) = 1-h(x)

所以,成为正点的概率,现在用一个 sigmoid 函数来描述。我们现在准备将逻辑回归应用于 Scikit-learn 中的一个简单数据集。我们首先定义我们的数据集,它有 20 个例子:

然后我们使用 Scikit-learn 中的逻辑回归模型来拟合数据。该模型将 sigmoid 函数拟合到数据集,以预测每个特征输入的阳性标签的概率。Scikit-learn 的LogisticRegression模型有一个叫做predict_proba()的方法可以返回这个概率。清单 6 中使用了这种方法来预测一些测试数据点的概率。需要注意的是,predict_proba()返回的是负标签和正标签的概率,正标签的概率存储在它的第二列中(第一列存储负标签的概率,所以如果我们将第二列的值称为 p ,第一列的值就是 1-p )。因此,我们应该首先通过分割返回的数组来分离概率,并将其存储在skl_prob变量中。

图 13 显示了原始训练数据集加上predict_proba()预测的概率图(红色曲线)。很明显,它是 s 形的。换一种方式来剧情也是有启发的。我们可以先定义一个 sigmoid 函数。然后让LogisticRegression返回它学习到的 sigmoid 函数的系数( a0a1 in h(x) )。这些系数存储在clf.coef_ ( =a1 )和clf.intercept_ ( =a0 )中。我定义了一个名为logistic_predict_proba()的函数,使用这些系数来计算 h(x) 。如果我们用这些系数绘制 h(x) ,我们会得到与 Scikit-learn 的predict_proba()方法完全相同的结果(图 13 中的黄色曲线)。在该图中,我用 p 标记了 y 轴,以强调它是一个概率,但是它也可以标记为 h(x ),因为 h(x) 是一个概率,并且我在这里绘制了它的值。

Figure 13

但是这些概率如何变成每个数据点的 0 或 1 标签呢?再次使用阈值。对于该模型,预测概率与阈值 0.5 进行比较。如果概率大于 0.5,它将被指定为 1,否则为 0。

在清单 7 中,我定义了一个名为logistic_predict()的函数,使用我们之前生成的概率来预测标签。它将概率作为一个参数,并将其与作为阈值的 0.5 进行比较,以预测标签。我们实际上不需要定义这样一个函数。Scikit-learn 的LogisticRegression模型有一个叫做predict()的方法来做同样的事情。它获取输入要素并使用之前由模型计算的概率(与我们使用predict_proba()检索的概率相同),并以类似的方式预测标注。

清单 7 的输出显示两个函数给出了相同的结果。现在我们有了所有必要的工具来绘制这个分类器的 ROC 曲线。我们使用与随机分类器相同的过程。我们产生一些介于 0 和 1.1 之间的阈值,对于每个阈值,使用来自LogisitcRegression模型的概率来预测标签。然后,我们使用这些预测标签和每个数据点的实际标签来计算 TPRFPR 值。为此,我们可以很容易地使用之前定义的roc_curve()函数。最后,我们可以使用生成的 TPRFPR 值绘制 ROC 曲线(图 14)。

Figure 14

同样,我们真的不需要定义自己的函数。Scikit-learn 有一个名为metrics.roc_curve()的函数,它在清单 9 中做了同样的事情。

它非常类似于我的函数,具有相同的参数和返回值,结果图将类似于图 14。检查其返回的数组是有益的。在清单 10 中,我取了一个阈值(实际上是 threshold 数组的第二个值),并使用该值预测标签。然后,我计算混淆矩阵, TPRFPR 的值。这些值等于metrics.roc_curve()TPRFPR 数组中返回的对应阈值的值( TPRFPR 数组的第二个值)。

如果您检查阈值的值,您会注意到它从一个大于 1 的数字开始。这里我解释一下原因。如您所知,阈值 1 意味着我们想要一个不预测任何阳性标签的分类器。我们知道:

如果 h(x)≥阈值,y(I)= 1

对于随机分类器,我们可以取 pdf 的积分来计算 P(h(x)≥threshold) 。问题是我们通常不知道 pdf 函数取这个积分。相反,我们计算由该阈值产生的阳性和阴性标签的数量,并直接计算概率。这个概率总是小于或等于 1,但是阈值仍然需要从一个大于 1 的数开始。这是因为当概率大于或等于阈值时,roc_curve()函数预测一个正标签。现在有可能某些 h(x) 值等于 1。如果阈值等于 1,该函数仍然预测它们的正标签。所以分类器仍然预测一些阳性标签,这不是我们想要的分类器。我们知道 h(x) 是一个概率,永远不可能大于 1。现在,通过将阈值设置为 1.1,我们确保阈值总是大于所有概率( h(x) 值),并且不会预测到阳性标签。结果是一个不预测任何肯定结果的分类器。

因此,现在应该清楚 Scikit-learn 中的roc_curve()函数是如何工作的了。现在让我把重点放在 ROC 情节本身。在图 15 中,突出显示了 ROC 曲线中的一些点。这个数字有点夸张,因为当通过数据点时,s 形曲线的斜率应该慢得多(如图 13 所示)。

Figure 15

A 对应于大于 1 的阈值,对于该阈值分类器不选择任何东西。以前研究过这种分类器。由于没有选择 TP=FP =0 ,并且 TPR=FPR=0 如前所示。对于 B 点,只有一些正点选择正确,所以 0 < TPR < 1 ,但是 FPR 仍然为零。对于点 D,所有的正点都被正确选择,但是一些负点也被选择为正点,所以 TPR=10 < FPR < 1 。对于点 E,我们有一个阈值 0,分类器为其选择所有内容。所以, TN =FN = 0 。我们之前也展示过,对于这种情况, TPR=FPR=1

重要的是要注意,无论您对分类器使用什么模型,ROC 曲线的这两点总是相同的。大于 1 的阈值总是给出 TPR=FPR=0 ,而 0 的阈值总是给出 TPR=FPR=1 。结果,所有的 ROC 曲线都经过这两点。我们还有一个点 C,它对应于阈值 0.5。如图 15 所示,对于这个特定的数据集,这个阈值正确地预测了一切。因此,不存在不正确的选择或拒绝以及 FP=FT=0 。因此:

TPR = TP/(TP+FN) = TP/TP = 1

FPR = FP/(FP+TN) = 0

因此,我们有一个理想的分类器,可以在阈值为 0.5 的情况下正确预测训练数据集的所有标签。理想的分类器总是经过这个点( TPR=1,FPR=0 ),这个 ROC 曲线就是这种分类器的特征曲线。

如前所述,逻辑回归模型总是使用阈值 0.5 来预测标签。那么用其他阈值来绘制 ROC 曲线有什么意义呢?答案是,我们使用一系列所有可能的阈值以某种方式扫描我们的数据集,并查看数据点在特征空间中的结构。如果我们只有理想的分类器,ROC 曲线就没有多大用处,然而,在许多情况下,分类器不能正确预测所有事情,这就是 ROC 曲线对我们有用的地方。让我在清单 11 中定义一个新的数据集。

图 16 显示了该数据集的曲线图。它有 50 个数据点。一半的点标记为 1,另一半标记为 0。但是,与之前的数据集相比,有很大的不同。这里正负点部分重叠。这意味着对于一些负点来说, x 的值高于正点的最小 x 值。

Figure 16

我们使用前面的步骤来拟合逻辑回归模型并绘制 ROC 曲线。这次只使用了 Scikit-learn 功能。首先,我们计算概率( h(x) )。

图 17 显示了带有数据集点的结果概率曲线。

Figure 17

最后,我们使用清单 13 中的这些概率绘制 ROC 曲线。

得到的 ROC 曲线绘制在图 18 中。

Figure 18

这个 ROC 曲线现在和之前的相比有点不同。图 19 突出显示了这条曲线上的一些点,以便更好地理解它。

Figure 19

如前所述,阈值 0 和大于 1 的阈值(点 A 和 E)保持在相同的位置。例如,对于阈值为 0.9 的点 B,我们仍然在重叠区域之外。这里 TPFN 都大于零,但是 FP 还是零。所以 FPR=00 < TPR < 1 和 B 点位于垂直线上。对于 C 点,我们在重叠区域内,所以 FP 不再为零,该点偏离垂直线。此外,如图所示,C 点位于对角线上方,这意味着 TPR > FPR 。我们可以简化这个不等式:

从图中可以清楚地看出,这个不等式对于这个数据集是成立的。这是因为当我们开始降低阈值时,我们首先会遇到正的点。换句话说,实际的正点平均起来具有更高的 h(x) 或者被预测为正点的概率更高。

对于 D 点,我们又在重叠区域之外,但是这次 FN=0TNFP 都大于零,所以 TPR=10 < FPR < 1 和 D 点位于水平线。事实是重叠点的标签不能通过仅使用一个特征来预测。您需要一个以上的特征来分离这些点。

如果我们增加数据集中重叠点的比例会发生什么?清单 14 定义了这样一个数据集,然后绘制了 ROC 曲线。数据集和 ROC 曲线分别显示在图 20 和 21 中。

Figure 20

Figure 21

正如你所看到的,现在我们有了一个更大的重叠区域,所以从垂直线的偏离开始得更快了。有一种方法来表征 ROC 曲线与理想分类器(只有一条垂直线和一条水平线)的偏离。为此,我们计算 ROC 曲线下的面积,如图 22 所示。

Figure 22

我们称这个量为 AUC(曲线下面积)。对于理想的分类器,AUC 是长度为 1 的矩形的面积,因此它正好是 1。对于随机分类器,它大约是下三角形的面积 0.5。对于其他分类器,AUC 介于 0.5 和 1 之间。AUC 越高,分类器越好,因为它更接近理想的分类器。要在 Scikit-learn 中计算 AUC,您可以使用metrics.auc()函数,该函数接收由metrics.roc_rurve()函数生成的 TPRFPR 数组,并返回 AUC 值。清单 13 和清单 14 中都使用了这个函数。

但是我们可以将重叠区域的大小增加多少呢?最坏的情况是正负点完全重叠。清单 15 定义了这样一个数据集,并符合逻辑回归模型。结果如图 23 所示。如你所见,假设函数看起来像一条直线,而不是一个 sigmoid 函数。

Figure 23

接下来,我们绘制清单 16 中的 ROC 曲线。

ROC 曲线如图 24 所示。如您所见,它类似于随机分类器的 ROC 曲线,AUC 也接近 0.5。事实上,如果增加数据集中的点数,ROC 曲线会看起来更平滑,AUC 会更接近 0.5。

Figure 24

但是为什么它看起来像一个随机分类器呢?图 25 解释了原因。正如您看到的

事实上,当数据点完全重叠时,分类器无法仅使用一个特征来区分它们,并且它将正标签分配给几乎一半的数据点,而将负标签分配给其他数据点。因此,这个分类器并不比随机分类器好。

Figure 25

因此,表现得像一个随机分类器似乎是最糟糕的情况。但是有可能在对角线下面有一条 ROC 曲线吗?我指的是每一点都有 AUC < 0.5. To have such a case, we need a classifier which is even worse than a random classifier! Such a classifier should favor a wrong label for each data point which means something is systematically wrong with it. Let’s build a classifier like this.

As you see, this classifier is similar to a logistic regression classifier. In the logistic regression model, the function 【 returns the probability of being a positive ( p 的曲线。这里我定义了一个名为logistic_mispredict_proba()的新函数,它返回 1-p 。事实上,对于明显错误的正点,它返回负点的概率(由逻辑回归分类器计算)。这样,它会支持每个数据点的错误标签。现在,我们使用清单 18 中的这些错误概率来绘制图 16 中相同重叠数据集的 ROC 曲线。

图 26 显示了由logistic_mispredict_proba()返回的数据点和概率函数( h(x) )。正如你看到的,它类似于图 17,然而,概率函数现在是沿着 x 轴镜像的。

Figure 26

图 27 显示了 ROC 曲线,其现在位于对角线下方,AUC 为 0.02。

Figure 27

最后,图 28 将 ROC 曲线上的点连接到概率函数上的点。

Figure 28

对于 B 这样的点,现在 TPR 小于 FPR 。当你得到这样的 ROC 曲线时,说明学习算法没有正常工作,是在错误标注数据点。

数学解释

这是本文的最后一部分,我将讨论一些更高级的话题。如果你对 ROC 曲线的数学理论不感兴趣,可以跳过这一节。

为了描述 ROC 曲线的数学解释,我们需要定义一种新的符号。正如你所记得的,最初我们有一些积极和消极的数据点。我们用 D+ 来表示一个数据点的实际标签为正的事件(我们简称它们为正),用 D-来表示一个数据点的实际标签为负的事件(我们简称它们为负)。我们还使用 T+ 来表示数据点的预测标签(通过分类器)为正的事件,以及 T- 来表示数据点的预测标签为负的事件。

现在我们可以定义一个类似于 P(T+|D+) 的条件概率。它是在给定数据点的实际标签为正的情况下,预测该数据点为正的概率。其实就是指得到一个 TP 的概率。现在假设具有实际正标签的点的总数是 Np 。分类后,它们中的一些将被正确地预测为阳性,而另一些将被错误地预测为阴性。前者是 TP ,后者是 FN 。所以, Np = TP+FN。同样,如果真否定的总数是 Nn 那么 Nn = TN+FP。根据定义 P(A|B) = P(A,B)/P(B) ,所以

如果你还记得,这就是灵敏度或者 TPR 的定义。所以,灵敏度实际上是从正数据点中得到一个 TP 的概率。

同理, P(T-|D-) = TN/(TN + FP) 等于特异性P(T-|D-) 表示假设一个数据点的实际标签为负,则该数据点被预测为负的概率。所以,特异性是从负点中得到一个 TN 的概率。最后, FPR 是从负点中得到一个 FP 的概率。FPR = P(T+| D-)= FP/(FP+TN)。如你所见,我们可以描述所有我们之前定义为条件概率的量。

如前所述,分类器通常不是理想的,并且有可能错误标记测试点。想象一下,一个分类器预测一个测试数据点的阳性标签,这个点真的是阳性的可能性有多大?数学上,我们感兴趣的是计算 P(D+|T+) 。这是一个重要的量。例如,一个分类器应该根据一些特征,比如他的医学测试结果,来预测一个病人是否患有某种疾病。如果分类器预测患者患有该疾病,那么这个患者真的患有该疾病的可能性有多大?要回答这个问题,我们需要贝叶斯定理。贝叶斯定理描述了一个事件发生的概率,基于可能与该事件相关的条件的先验知识。让事件 A1,。。。,Ak 形成空间 S 的分隔,使得

Pr(Aj) > 0 对于 j = 1,.。。,k ,设 B 为事件,使得 Pr(B) > 0 。然后,对于 i = 1,.。。,k

其中 P(Ai|B) 称为事件 Ai 的条件概率,假设事件 B 已经发生。在这个等式中 P(Ai) 通常被称为先验概率,因为 P(Ai) 是在我们知道关于事件 B 的任何事情之前该事件的概率,而 P(Ai|B) 被称为后验概率,因为它是在事件 B 发生之后事件 Ai 的概率。此外, P(B|Ai) 称为给定 AiB 的可能性,表示事件 B 给定事件 A 的可能性有多大。

事实上,贝叶斯定理通过纳入观察事件 B 提供的证据,将先验概率 P(Ai) 转化为后验概率 P(Ai|B)

在二元分类的情况下,数据点最初应该是正的或负的,因此:

P(D+)+P(D-)=1

因此贝叶斯定理给出:

P(D-) 替换为 1-P(D+) :

为了简化这个方程,我们可以把分子和分母都乘以(1-P(D+)/P(T+| D-)。然后我们有:

为了使这个等式更简单,我们需要定义一个新概念。在概率论中,一个事件 e几率 定义为该事件发生的概率, P(e),除以该事件不发生的概率, 1 — P(e)

因此,如果我们知道一个事件的概率或几率,我们可以很容易地计算出另一个。举个例子,如果一个特定事件的概率是 0.9,那么这个事件的几率就是事件 0.9 除以 0.1,也就是 9:1。根据这个等式,当概率为零时,赔率也为零,但当概率为 1 时,赔率无穷大。此外,在赔率和概率之间存在相关性:

现在我们可以用这个概念来简化为 P(D+|T+)导出的最后一个方程。我们可以将 P(D+)/(1-P(D+)) 替换为 odds(D+) 得到:

如果我们重新排列这个等式,我们得到:

但是左手边简直等于赔率(D+|T+) 。所以最后我们有了:

术语 P(T+|D+)/P(T+|D-)T+ 的两种可能性之比,我们称之为似然比( LR )。一般来说,可能性比率是特定事件 A 发生的概率除以事件ABB未发生的概率。事件 T+ 实际上是阈值的函数,因为当 h(x) (由分类器计算的点的阳性标记的概率)大于或等于阈值时,分类器预测数据点的阳性标记:

P(T+| D+)= P(h(x)≥阈值| D+)

P(T+| D-)= P(h(x)≥阈值| D-)

因此,对于具有特征 x 的数据点,似然比是假定该数据点的真实标签为正的情况下h(x)≥阈值的概率除以假定该数据点的真实标签为负的情况下h(x)≥阈值的概率。现在还记得我展示了 P(T+|D+) 等于 TPRP(T+|D-) 等于 FPR ,所以我们有:

对于对应于 ROC 曲线上一点的每个阈值, TPR/FPR 等于似然比( LR )。这也等于连接原点和该点的直线的斜率。例如,在图 29 中,点 tLR 等于将其连接到原点的蓝线的斜率。

Figure 29

这个等式能告诉我们什么?假设我们有一个数据集。我们通常知道 D+ 的先验赔率。例如,考虑图 16 的数据集,其中 25 个点是正的,25 个点是负的。这里:

这是我们对 D+ 的先验概率,或者说是我们在观察分类器预测之前的初始知识。请不要混淆 P(D+)h(x)h(x) 是在给定特征 x 的情况下预测正点的条件概率,由分类器计算,但 P(D+) 是在开始分类之前,点的实际标记为正而不考虑其特征 x 的概率。现在给我们一个测试点。我们不知道它的 x 值,因此我们也不知道 h(x) 的确切值,但是我们有一个阈值,我们被告知 h(x) > = threshold。这意味着分类器预测该测试点的阳性标签。现在,这个点真的是正的概率是多少?如果我们没有这个预测,我们对这个测试点的最佳猜测仍然是先前的赔率赔率(D+)* 。*

但是有了这个预测,我们就可以计算 ROC 曲线上给定阈值的似然比,然后计算后验 odds 也就是 odds(D+|T) 。后验概率可以转换回概率,这是测试点确实为正的概率。现在,再次查看图 19。对于垂直线上的点,如点 B,我们有:

因此,通过观察事件 T+ (这意味着分类器预测具有点 B 的阈值的正标签),我们可以 100%确定我们有一个 D+ 事件,这意味着该点的实际标签是正的。这是有意义的,因为高于该阈值的所有点实际上是阳性的(图 19)。

对于像点 D 这样的水平线上的点:

所以通过观察一个 T+ 事件或一个 TP 预测与 D 点的阈值,后验赔率或概率变得大于前验赔率或概率。换句话说,这样的观察减少了我们对测试数据点实际标签的不确定性。但是 P(D+|T+) 不像上一种情况是 1。那是因为在这个阈值以上有一些负的点被预测为正的( FP ),有可能我们的测试点就是其中之一。

事实上,对于非理想分类器对角线上方的任何点(如图 19 中的点 C ),我们有类似的情况。对于这样一个点TPR>FPRso1<LR<无穷大,我们得到同样的结果。

对于随机分类器,所有点都在对角线上,因此:

随机分类器不会改变先前的概率,并且由于其盲目的性质,它不能改变我们对测试数据点的实际标签的不确定性。对于对角线下方的点,如图 28 中的点 B:

我们知道这个分类器给出了一个错误的答案,所以当它预测一个肯定的答案时,更有可能答案是错误的,并且测试点的实际标签是否定的,所以给出这个预测的实际肯定的几率(或概率)变得低于先前的几率。同样,这个观察结果(尽管它是一个错误的预测)减少了我们对测试数据点的实际标签的不确定性。

到目前为止,为 T+ 事件计算了似然比,这意味着h(x)>=阈值。但是,我们可以有其他条件。通常,对于事件 e:

推导和前面一样。将 T+ 替换为 e 即可。例如,我们可以有两个阈值 t1t2 ,并计算事件 t1≤h(x) < t2 的可能性。

现在我们可以稍微简化一下这个分数。我们知道:

P(t1≤h(x)<T2 | D+)= P(h(x)≥t1 | D+)—P(h(x)≥T2 | D+)

前面说过,P(h(x)>= threshold | D+)= P(T+| D+)等于 TPR 。因此

P(t1≤h(x)<T2 | D+)=TPR(t1)**—TPR(T2)

TPR(t1) 表示使用阈值 t1 计算的 TPR 。此外:

P(t1≤h(x)<T2 | D-)= P(h(x)≥t1 | D-)—P(h(x)≥T2 | D-)

=[1—P(h(x)<t1 | D-)]—[1—P(h(x)<T2 | D-)]

但是:

P(h(x)<t1 | D-)= P(T-| D-)=特异性

根据定义FPR = 1-特异性,所以

最后,我们有

现在,请看图 30。如果我们在 ROC 曲线上有两个阈值为 t1t2 的点,LR 实际上是连接它们的直线的斜率。我们现在可以用这个 LR 来计算 D+赔率

Figure 30

我们又有了一个测试点。我们不知道它的 x 值,所以我们不知道 h(x) 的确切值;我们只知道这个测试点的 t1≤h(x) < t2odds(D+| t1≤h(x)<T2)给出 odds 这个测试数据点在这个条件下确实是正的。

这可以带给我们一个关于 ROC 曲线的结论。LR 实际上是两个条件概率的比值。根据定义,概率是正数,所以比率也是正数。这样一来,任意两点之间的斜率(with 等于 LR )永远不可能是负数,ROC 曲线永远是增函数。

现在,请看图 31。我们在 ROC 曲线上有五个点 t1t5 ,每个点对应一个阈值,这个阈值用相同的名字来称呼。如果你还记得,当我们从 TPR=FPR=0TPR=FPR=1 时,阈值是递减的。所以我们有五个阈值t1<T2<T3<T4<t5

Figure 31

t4t5 用垂直线连接。这条线的斜率是无穷大,这意味着 LR 也是无穷大。

所以如果一个数据点的 h(x) 位于这个阈值范围内,那么它的实际标号肯定是正的。以图 19 中的点 B 为例,显示了对于这样的间隔,我们只有实际标签为正的点,这是一致的结果。

t1t2 用一条水平线连接。这条线的斜率为零,这意味着 LR 也为零。因此:

所以当 h(x) 在这个阈值范围内时,我们就可以确定该点的实际标签为负。以图 19 中的点 D 为例,可以看出在这样的区间中,我们只有实际标签为负的点,这解释了为什么几率为零。

连接 t3t4 的直线斜率远大于连接 t2t3 的直线斜率。这意味着:

因此,当 t3≤h(x) < t4,数据点的实际标签为正的机会比 t2≤h(x) < t3 高得多。

最后,连接点 t1t5 的线永远是对角线。这条线的斜率是 1,所以 LR 也是 1。结果,LR 不改变后验 odd,并且前验 odd 等于后验 odd。这也是有道理的。记住对于像 t1TPR=FPR=1阈值> 1 这样的点。这是拒绝一切的分类器。此外,对于像 t5TPR=FPR=0阈值=0* 这样的点,因为这是预测一切为正的分类器。所以当我们说 t1≤h(x) < t5 时,意思是 h(x) 可以取 0 到 1 之间任何可能的值。这是一个不添加任何关于 h(x) 的更多信息的条件,因为我们已经知道 h(x) 是一个概率,并且在 0 和 1 之间有界。结果,通过观察这个条件,我们关于测试点的不确定性没有改变。该区间的 LR 为 1,后验概率保持与先验概率相同。*

因此,ROC 曲线也可以被认为是一种显示似然比的图形工具,而似然比是计算后验概率所必需的。一个好的分类器是给出高后验概率的分类器。这意味着当分类器预测一个正点时,分类器是正确的概率很高,并且该点确实是正的。现在,请看图 32。这里显示了三个分类器 ROC 曲线。一种是理想分类器(分类器 A)。其他的都不理想,但是有一个比较接近理想的分类器(分类器 B)。

Figure 32

我们知道逻辑回归使用 0.5 的阈值。所以对应于每个分类器的这个阈值的点已经被标绘。连接这些点和原点的线也已经显示出来。如前所述,这条线的斜率给出了该阈值的 LR 。分类器 A 是理想的分类器,斜率是可能的最高值(无穷大)。所以 LR 和后验几率都是无穷大,后验概率等于 1。这意味着当分类器预测到阳性标签时,我们可以确保它是正确的标签。

现在我们比较一下量词 BC 。对于分类器 B ,连接原点到 t=0.5 点的直线的斜率明显较高。这意味着 LR 、后验几率以及后验概率更高(我们假设对于所有这些分类器,我们具有相同的先验几率)。因此,当分类器 B 做出预测时,预测的标签更有可能是正确的。事实上,分类器 B 的预测比 C 更可靠,这使其成为更好的分类器(它也具有更高的 AUC) 。随着 t=0.5 点越来越接近( TPR=1,FPR=0 ),这个斜率越来越大,后验概率也越来越大。

但是 AUC 的统计解释是什么? AUCTPR vs FPR 的曲线下面积。所以数学上:

随机变量 X 的累积分布函数( cdf ) 定义为:

并且 cdf 与该随机变量的概率分布函数( pdf )之间存在关系:

类似的等式适用于条件 cdfpdf 和:

现在我们可以根据 cdf: 来写 TPRFPR

你可能注意到了,我把 h(x) < t 换成了 h(x)≤t 。如果我们假设 h(x) 具有连续分布,那么 P(h(x)=a)=0 对于任意数 a、和多加一个点不改变概率。同样,我们有:

现在我们可以写:

但是我们知道:

现在我们可以在积分中替换它,但是这会把我们的积分变量从 FPR 变成 t ,所以积分的极限也应该改变。我们已经有了 FPR 的 cdf。使用 cdf 的定义,我们有:

现在,如果 t=-infinity ,积分将为 1,因为 pdf 被归一化,如果 t=infinity ,积分为零。所以:

需要注意的是,当我们用一个 pdf计算 FPRTPR 时,的阈值范围是从-无穷大到无穷大。这是因为 pdf 不是一个概率,不在零和 1 之间。然而,在代码中,我们使用了 0 到 1.1 的阈值范围。这是因为我们没有使用 pdf 直接计算介于 0 和 1 之间的概率。

现在我们有:

现在我们应该用 pdf 替换 G :

将其代入 AUC 方程,我们得到:

现在我们用一个小技巧来简化它。我们可以将 g 乘以一个系数,该系数可以是 0 或 1:

为了进一步简化,我们可以使用指示器功能:

事件的指示器函数在事件发生时取值 1,在事件未发生时取值 0。事件 E 的指示函数的期望值等于 P(E) :

如果我们回到 AUC 等式,我们看到当 s 在-无穷大和 t 之间或者简单地小于等于 t 时,系数为 0,当 s 在 t 和无穷大之间或者简单地大于t 时,系数为 1(事实上它大于或等于 t ,但是所以我们可以用事件 s > t 的指示函数来代替。但是 s 是随机变量 h(X)|D+ 的值 t 是随机变量 h(X)|D-的值。所以指标作用是针对事件h(X)| D+>h(X)| D-。**

值得注意的是,该指示函数有两个变量,为了计算其期望值,我们应该对 s 和 t 进行积分。最后,通过用指示函数替换虚拟系数,我们得到:

但这意味着什么呢?假设我们从带有实际正标签( D+ )的点中随机抽取一个点 x1 ,从带有实际负标签( D- )的点中随机抽取一个点 x2AUC 简单来说就是 h(x1) > h(x2) 的概率。你应该注意到这不是 x1 预测为正而 x2 预测为负的概率。预测是将 h(x) 与阈值进行比较的结果。这里我们只是针对这些点比较 h(x) 。然而,这个概率给了我们一些关于数据集中正负点的可分性的信息。

请看图 13。对于一个理想的分类器 AUC=P(x1 > x2)=1 。这意味着,如果我们随机选择一个正点和一个负点,正点的 h(x) 将总是更高。这是因为所有的正点都比所有的负点具有更高的 h(x) 。现在,请看图 23。对于随机分类器 AUC=P(x1 > x2)=0.5 。意思是,如果我们随机选择一个正的和一个负的,那么 h(x1) > h(x2)h(x1)≤h(x2) 两者的概率是相等的。这是数据点重叠的结果。对于对角线上方的非理想分类器 AUC=P(x1 > x2) > 0.5。**AUC 越高,数据集中出现的重叠越少,并且在将最佳 sigmoid 函数拟合到该数据集后,预测正确的标签将更容易。

如你所见,ROC 曲线的数学理论与我们在前面章节中所学的一致。这里我们假设数据集只有一个特征 x,并且 xh(x) 都是标量。如果我们有一个以上的特征,那么 x 将是一个矢量,但是 h(x) 仍然是一个标量,这里推导的所有方程仍然有效。

在本文中,我们只使用了 Scikit-learn 的逻辑回归模型。Scikit-learn 有更多的机器学习算法,但绘制 ROC 曲线可以用类似的方式完成。首先,您使用该模型的predict_proba()方法来计算概率。然后你需要将这些概率和真实标签放入metrics.roc_curve()中,以计算 TPRFPR 。您也可以使用计算出的 TPRFPR 通过metrics.auc()计算 AUC。您最终可以使用类似matplotlib的绘图库来绘制结果。

我希望你喜欢阅读这篇文章。如果您有任何问题或建议,请告诉我。本文中的所有代码清单都可以作为 Jupyter 笔记本从 GitHub 下载,网址:https://github.com/reza-bagheri/ROC_curve_article

机器学习中的 ROC 曲线

原文:https://towardsdatascience.com/roc-curve-in-machine-learning-fea29b14d133?source=collection_archive---------40-----------------------

曾经对 ROC 曲线的工作原理感到困惑吗?这可能会把一些碎片拼在一起。

二元分类的逻辑回归模型中的默认设置是将预测概率为 0.5 或更高的所有结果分类为 1。低于 0.5 的概率值被分类为 0。

如果我们可以把这个阈值设为 0.5,并增加或减少它,会怎么样呢?它将如何影响分类模型正确预测正面结果的能力?这些正是 ROC 曲线旨在以高度可解释的方式直观回答的问题。

ROC 曲线绘制在图表上,Y 轴为真阳性率(灵敏度), X 轴为假阳性率(1 -特异性)。对于从 0 到 1 的许多阈值,发现了 TPR 和 FPR 的值。这些值随后被绘制在图表上。我基于逻辑回归问题创建的基本 ROC 图如下所示:

解释:

这里的主要目的是在 ROC 曲线上找到一个点,在该点下的面积最大。这是因为在这一点上,模型可以正确地区分二进制类,它们之间的重叠最小。

休·哈维博士的一幅精美简洁的图像可以用来更好地理解这一点。

Harvey, H. (2019). [image] Available at: https://twitter.com/DrHughHarvey/status/1104435699095404544 [Accessed 18 Jul. 2019].

因此,随着 AUC 的增加,二元类之间的重叠减少。在那个特定的阈值点,模型可以最好地区分类别。以下列出了 ROC AUC 的一些重要要点:

  • ROC AUC 为 0.5 表明阳性和阴性数据类别完全重叠,该模型基本上是无意义的,仅相当于简单的猜测
  • ROC AUC 为 1 表示正负数据类别完全分离,模型尽可能高效。
  • 你的 ROC AUC 越接近 1 越好。

最后总结一下,ROC 曲线是通过将我们的阈值从 0 变到 1 来为每个模型生成的。它最终帮助我们可视化灵敏度特异性之间的权衡,并理解我们的数据类是如何分离的。

附加 cookie:

使用以下 python 代码可以很容易地找到 AUC 分数:

from sklearn.metrics import roc_auc_scoreroc_auc_score(‘Actual Values’, ‘Predicted Probabilities’)

ROC 曲线和有效前沿

原文:https://towardsdatascience.com/roc-curves-and-the-efficient-frontier-7bfa1daf1d9c?source=collection_archive---------24-----------------------

解释如何用一点金融来解释 ROC 曲线

第一次看到一个 ROC 曲线(受试者工作特性),很迷茫。为什么数据科学家和统计学家对同一个事物有这么多的称呼(例如,回忆和敏感度是同一个事物,而敏感度和真实肯定率是同一个事物)?这条曲线到底想告诉我什么?

但是在思考和使用它们之后,我意识到 ROC 曲线基本上是你的模型的成本/收益曲线。更具体地说,ROC 曲线是金融市场有效前沿曲线的数据科学表亲。

有效边界

让我先戴上我的金融帽子。金融的核心概念之一是风险和回报之间的权衡——你的钱面临的风险越大,你就应该得到越多的补偿(通过更高的预期回报)。尽管风险的定义在很大程度上取决于你的性情和投资哲学,但潜在的直觉很有意义:如果你没有得到回报,为什么还要承担额外的风险?

As your risk increases, you should demand a higher expected return as compensation

虽然你可能不一定同意前一个图中资产的等级顺序,但它表达了这一点。然而,这并不是故事的全部。没有人只持有股票或债券的投资组合。我们持有多样化的投资资产组合。那么当我们开始投资股票、债券、黄金等时,风险和收益曲线会发生怎样的变化呢?在同一个投资组合中。也就是说,如果我们计算我们可能持有的所有投资组合的风险和回报值,然后将它们全部绘制在散点图上,风险和回报图会是什么样子?它看起来会像这样:

The Efficient Frontier

眼熟吗?它看起来就像一条 ROC 曲线!上图中的曲线,我们称之为有效边界,是投资世界的关键。它可能值得自己的一系列博客文章,但这里要注意的要点是:

  1. 蓝点代表的投资组合受曲线绿线(有效边界)上的投资组合支配。这意味着,一个理性的投资者永远不会想持有红线上的劣质投资组合,因为对于相同的风险,他可以在有效边界上获得更高的回报。对于一组给定的投资资产,只有一个有效边界。
  2. 为什么有效前沿线有曲线形状?因为承担更多风险的回报是递减的。在这一点上,我无法说得很清楚,但回报减少的原因是,随着你在风险曲线上越走越远(在 X 轴上向右移动),你的投资组合越来越集中在股票和其他风险资产上。这些风险资产高度相关,所以你开始失去投资组合多样化的好处。我们将在后面看到 ROC 曲线以类似的方式表现。

回到数据科学

那么,为什么要谈论金融和有效边界呢?这不是数据科学的帖子吗?这是因为当它影响我们的钱包时,成本和收益是最直接和最容易理解的。为什么有效边界有吸引力应该是显而易见的——沿着它的投资组合给你带来最大的投资回报。ROC 曲线的工作方式也是一样的——下方面积最大的曲线代表能给我们带来最大收益的模型。这个模型基本上就是你的数据科学有效前沿

在 ROC 曲线的情况下,什么是收益(砰),什么是成本(美元)?让我们来看看实际的 ROC 曲线。

ROC is your model’s Cost vs. Benefit Curve

收益是你的模型的真实阳性率,成本是假阳性率(我稍后会用简单的英语解释这个,请耐心听我说)。就像投资组合风险和回报一样,我们希望找到一个模型,对于给定的假阳性率,该模型能给出最高的真阳性率。在上面的 ROC 曲线图中,random forest 的曲线下面积最高(0.847)。正如你所看到的,对于任何假阳性率,它都会产生最高的真阳性率(只需将手指放在 X 轴上的任意一点,然后垂直向上移动;你穿过的最后一条线是给你最大爆炸的模型)。曲线下的区域全面总结了模型在不同成本水平上的性价比。

混乱矩阵

现在让我们用一个例子来解释成本和收益的含义。在二进制分类问题中,我们试图将观察结果分为两组,如好投资坏投资。下面的 2 乘 2 矩阵(称为混淆矩阵)显示了一个简单的股票预测模型的结果,该模型试图猜测股票在未来 12 个月内是上涨还是下跌(数据是虚构的,仅供说明)。

We are trying to predict whether a stock will go up or not over the next 12 months

红色的数字代表不正确的预测,而绿色的数字代表正确的预测。ROC 曲线很酷的一点是,它在一个图表中捕捉了所有这四个数字,并直观地显示了它们之间的权衡。

轰动/好处

让我们先计算一下我们的收益(真实阳性率):

真阳性率= 30 / (10 + 30) = 75%

那 75%是什么意思?总共有 30 + 10 = 40 个好的投资,我们正确地预测并利用了其中的 30 个,或 75%。还不错!尽管真正的正回报率是我们模型的优势,但请注意,它的计算包括了我们错误预测为不良投资的 10 只股票(预测=不良,实际=良好)。因此,真正的正利率(我们的 bang)是一个既包括我们的正确预测,也包括我们的机会成本(当它实际上是一只好股票时不投资的结果)的数字。

机会成本一点都不好玩,那么我们该如何降低它呢?在之前的 ROC 曲线中,看橙色线(朴素贝叶斯)。如果我们愿意承担最大成本(大约 100%的假阳性率),预测一切都是好的投资,会发生什么?在这种情况下,你抓住了每一个好的投资,但却招致了巨大的成本。

还要注意,在上面的 ROC 曲线示例中,随机森林能够将机会成本降低到几乎为零,而朴素贝叶斯却无法在不导致最大成本的情况下做到这一点。一般来说,我们总是不得不接受至少一些错过的机会。最后,注意 ROC 曲线展示了与有效前沿相同的收益递减。这意味着每一次减少错失机会的尝试都会让你付出更多的代价。

美元/成本

在减少错过的机会(也称为假阴性)和增加我们模型的假阳性率(成本)之间有一个权衡。让我们先计算一下上一个例子的成本:

假阳性率= 20 / (40 + 20) = 33%

这意味着有 40 + 20 = 60 个不良投资,不幸的是,我们被其中的 20 个,或者 33%困住了。在我们的例子中,这些是真正的负成本,而不仅仅是错过的机会。我们投资了,损失了 20 倍,哎哟!

让我们更深入地研究 ROC 曲线所代表的成本与收益的权衡。假设我的模型有真实的信号(它不只是产生随机噪声),我可以使用一个概率阈值来调整它打开的频率。例如,如果我将阈值设置为 90%(只有当模型给出 90%或更高的概率时,才预测一个好的投资),它几乎永远不会开启——但当它开启时,我们会期望更多的时候赚钱。

另一方面,如果我将阈值设置为 10%,我们的模型将一直开启。我们会投资大量的股票,但更多的股票(相对于 90%门槛的情况)是赔钱的。这些赔钱的人是假阳性,我们在追求尽可能多的好投资(真阳性)的过程中付出的代价。

把这一切联系在一起

如何适当地调整您的模型的阈值是另一天的主题。这在很大程度上取决于你的模型的个体特征,假阳性和假阴性的平均成本,等等..

但我希望大家从所有这些中吸取的一个关键点是,每个分类模型都可以在以下两者之间进行权衡:

  • 机会成本:你的模型预测的收益/真阳性率越高,你错过的机会就越少,你的机会成本就越低。但是,当你降低机会成本时,你最终会撒下更大的网,随着更多真正的积极因素,你也会捕捉到更多…
  • 误报:较高的误报率意味着你的模型采取更多的行动,但也更容易出错。这些误报就是你产生的成本

ROC 曲线是特定模型如何有效地权衡成本和收益的可视化。这就是为什么曲线下面积最大的模型,如有效边界模型,在以产生的成本提供最大收益方面优于其他模型。

摇摆命令行

原文:https://towardsdatascience.com/rock-the-command-line-52c4b2ea34b7?source=collection_archive---------2-----------------------

节省您时间的 21 个 Bash 命令

本文是对 Bash 命令的简单介绍。知道如何在命令行中移动是节省时间的一项基本技能。我们将讨论 21 个最常见的命令及其关键标志。我们还将介绍 Bash 快捷方式,为您节省大量的击键次数。⌨️

A shell

条款

术语 UnixLinuxBashshell命令行、终端、shell 脚本是不同的东西,但是它们共享我们将讨论的命令。这里有一个差异和相似之处的快速分析。

Unix 是贝尔实验室在 20 世纪 70 年代开发的一种流行的计算机操作系统。它不是开源的。

Linux 是最流行的 Unix 衍生品。它运行着世界上大量类似计算机的设备。

你的 终端 是让你进入操作系统的模拟器程序。您可以同时打开多个终端窗口。

shell 语言用于向底层操作系统发送命令。

Bash 代表伯恩再次脱壳。它是最常见的与操作系统通信的 shell 语言。这也是 macOS 的默认外壳。要了解更多关于支持 Linux 和 Bash 的开源基金会的信息,请查看本文。

命令行界面 (CLI) 是指基于键盘输入的界面,在这里输入命令。通常,它用于实时信息和文件操作。将 CLI 与通常使用鼠标的图形用户界面(GUI)进行对比。CLI 通常被称为命令行。

脚本 指的是包含一系列 shell 命令的小程序。脚本被写入文件,可以重用。您可以在脚本中创建变量、条件语句、循环、函数等等。

唷。明白了吗?我们下面讨论的命令适用于上面所有斜体的术语。我会交替使用 Bashshell命令行

另请注意:我交替使用目录文件夹。这两个术语的意思是一样的。

标准输入/输出流是标准输入( stdin )、标准输出( stdout )和标准误差( stderror ) 。他们会突然冒出一大堆。当我使用术语 print 时,我指的是打印到 stdout,而不是打印机。

最后,将下面前缀为 my _ whatever 的命令替换为 your whatever。😄

事不宜迟,下面是我们将在本文中讨论的命令列表。

21 大 Bash 命令

获取信息

**man**:打印一个命令的手册(帮助)
**pwd**:打印工作目录
**ls**:列出目录内容
**ps**:查看正在运行的进程

操作

**cd**:更改工作目录
**touch**:创建文件
**mkdir**:创建目录
**cp**:复制
**mv**:移动或重命名
**ln**:链接

重定向和管道

**<**:重定向标准输入
**>**:重定向标准输出
**|**:将一个命令的内容传送到下一个命令

阅读

**head** : 读取文件的开头
**tail** : 读取文件的结尾
**cat**:读取一个文件或者连接文件

结束

**rm**:删除
**kill** : 结束一个流程

搜索

**grep**:搜索
**ag**:搜索

档案馆

**tar**:将多个文件合并成一个文件

让我们开始吧!

前 21 条命令解释

首先让我们看看以 stdout 形式返回信息的命令,这意味着标准输出。一般情况下, stdout 会写到你的终端。

获取信息

**man command_name**:打印命令手册。就像帮助一样。

**pwd**:打印当前工作目录的文件路径。您经常需要知道自己在文件系统中的位置。

**ls**:列出目录内容。另一个超级常用命令。

ls -a:也用-a列出隐藏文件。

ls -l:使用-l查看文件的更多信息。

注意标志可以这样组合:ls -al

**ps**:查看正在运行的流程。

ps -e :-e打印所有正在运行的进程,而不仅仅是与当前用户 shell 关联的进程。这通常是你想要的。

操作

**cd my_directory**:将工作目录更改为我的 _ 目录。使用 my_directory 的相对路径../在目录树中上移一级。

CD

**touch my_file**:在指定的路径位置创建 my_file

**mkdir my_directory**:在指定的路径位置创建 my_directory

**mv my_file target_directory**:将我的文件移动到目标目录

mv也可用于重命名文件或文件夹,如下所示:

mv my_old_file_name.jpg my_new_file_name.jpg

**cp my_source_file target_directory**:将源文件复制一份,放入目标目录

**ln -s my_source_file my_target_file**:用符号链接将我的目标文件链接到我的源文件

my_source_file 的内容更新时, my_target_file 的内容会自动更新。如果我的目标文件的内容被更新,那么我的源文件的内容也被更新。酷毙了。

如果 my_source_file 被删除,那么my _ target _ file’的内容被删除,但是文件继续存在。只是一个空文件。

如果 my_target_file 被删除, my_source_file 继续存在,其内容保持不变。

-s标志也允许你链接目录。

    • 2019 年 4 月 12 日更新,纠正并澄清 ln -smv 行为。感谢杰森·沃尔沃克。**

现在让我们看看输出重定向和管道是如何工作的。

重定向和管道

**my_command < my_file**:将 stdin 重定向到 my_file 。当 my_command 需要用户输入来执行某项操作时非常有用。

**my_text > my_file**:将 stdout 重定向到 my_file 。创建 my_file 如果它不存在。覆盖 my_file 如果它确实存在。

例如ls > my_folder_contents.txt创建一个文本文件,列出你的工作目录的内容。

使用 double >>将 stdout 附加到 my_file 而不是覆盖它。

现在我们来看看管道命令。

Pipe the result of one command to the other

**first_command | second_command**:管道符|用于将一个命令的结果发送给另一个命令。管道左侧命令的 stdout 被传递给管道右侧命令的 stdin。

“一切都是管道”是 Unix 中的一句口头禅——因此几乎任何有效的命令都可以通过管道传输。

用管道链接命令会创建一个管道。多个管道可以像这样连接在一起:

first_command | second_command | third_command

Pipeline

请注意,管道并行执行所有命令。这种行为偶尔会导致意想不到的结果。点击阅读更多。

说到读取,我们来看看从命令行怎么做。

阅读

**head my_file**:读取 my_file 的前几行。也可以读取其他 stdin。

**tail my_file** : 读我的 _ 文件的最后几行。也可以读取其他 stdin。

Head at the front, tail at the back.

如果您是使用 pandas 的数据科学家,那么最后两个命令应该听起来很熟悉。如果不是,都是映射得比较好的隐喻,应该不会太难记。

让我们看看另一种读取文件的方法。

cat根据传递的文件数量,打印一个文件或连接多个文件。

cat

**cat my_one_file.txt**:一个文件,cat将内容打印到 stdout。

当您给 cat 命令两个或更多文件时,它的行为会有所不同。

cat my_file1.txt my_file2.txt:对于两个或更多的文件,cat con cat 将文件的内容合并在一起,并将输出打印到 stdout。

如果您想将连接的文件保存为一个新文件,使用>写操作符,如下所示:

cat my_file1.txt my_file2.txt > my_new_file.txt

现在我们来看看移除和结束事物。

结束

**rm my_file**:从你的文件系统中删除 my_file

rm -r my_folder:删除 my_folder 以及 my_folder 中的所有文件和子文件夹。-r用于递归。

如果不想每次删除都有确认提示,请添加-f

**kill 012345** : 通过给它时间关闭来优雅地结束指定的运行进程。

**kill -9 012345** : 立即强制结束指定的运行过程。-s SIGKILL-9意思相同。

搜索

接下来的几个命令——grepagack——用于搜索。Grep 是古老的、值得信赖的兄弟——可靠,但是速度较慢,用户友好性稍差。

Get a grep!

**grep my_regex my_file**:在 my_file 中搜索 my_term 。为每个匹配返回文件的整行。 my_term 默认为正则表达式。

grep -i my_regex my_file : -i使搜索不区分大小写。

grep -v my_regex my_file:返回所有不包含 my_term 的行。-v返回逆,像很多语言中的不是

grep -c my_regex my_file : 用-c返回找到匹配的次数。

grep -R my_regex my_folder:用-R递归搜索文件夹和所有子文件夹中的所有文件。

现在让我们转向Ag——grep更年轻、更快、更帅的兄弟姐妹。

Get it?

如果您运行以下命令并发现您的机器上没有 ag ,请参见此处的安装说明。在装有自制软件的 Mac 上运行brew install the_silver_searcher。(更新于 2019 年 8 月)。

**ag my_regex my_file**:返回行号和任何匹配的行。

ag -i my_regex my_file : -i为不区分大小写。

Ag 自动读取你的。gitignore 文件并排除任何匹配文件或文件夹的结果。相当酷!

ag my_regex my_file–skip-vcs-ignores:用–skip-vcs-ignores覆盖自动版本控制系统文件读取。

也可以做一个。忽略文件,从标签中排除文件路径。

第三个同胞是 Ack 。Ag 和 Ack几乎是同卵双胞胎——他们 99%可以互换。Ag 更快,所以我会坚持使用它。

档案馆

现在让我们看看如何制作 tarball 档案。

**tar my_source_directory**:将源目录下的多个文件合并成一个 tarball 文件。此命令对于分发其他人将下载的文件很有用。

tar

一个 tarball 有。tar 文件扩展名,代表磁带存档。磁带告诉你这个命令有多老了!

tar -cf my_file.tar my_source_directory:用 my_source_directory 的内容创建一个名为 my_file.tar 的 tarball 文件。-c用于创建,-f用于文件。

-xf提取一个 tar 文件。-x用于提取,-f用于归档。

tar -xf my_file.tarmy_file.tar 中的文件展开到当前工作目录。

现在让我们来看看拉链和解压。tar 文件。

tar -cfz my_file.tar.gz my_source_directory使用 gzip 压缩文件。-c表示创建,-f表示文件,-z表示压缩。Gzip 为文件的消费者节省了空间和下载时间。

通过在我们之前看到的提取命令中添加-z标志来解压缩.tar.gz文件。

tar -xfz my_file.tar.gz-x为提取,-f为文件,-z为压缩。

tar 有很多其他的标志可以使用。

Bash 别名

创建 Bash 别名来保存您在终端中的击键。然后你可以做类似于键入bu而不是python setup.py sdist bdist_wheel的事情。

只需在您的~/.bash_profile中添加以下内容:

alias bu="python setup.py sdist bdist_wheel"

如果你没有一个~/.bash_profile文件,你可以从命令行用touch命令创建一个。

然后重启你的终端,用两次击键构建你的 Python 包。没有比输入 2 个字母而不是 44 个字母更好的了。😃

添加您喜欢的任何其他别名,并观察您的生产力增长。🌴

让我们回顾一下我们已经讲过的内容。

回顾:21 个 Bash 命令

获取信息

**man**:打印命令
的手册(帮助)**pwd**:打印工作目录
**ls**:列出目录内容
**ps**:查看正在运行的进程

操作

**cd**:更改工作目录
**touch**:创建文件
**mkdir**:创建目录
**cp**:复制
**mv**:移动或重命名
**ln**:链接

重定向和管道

**<**:重定向标准输入
**>**:重定向标准输出
**|**:将一个命令的内容管道化到下一个命令

阅读

**head** : 读取文件的开头
**tail** : 读取文件的结尾
**cat**:读取文件或连接文件

结束

**rm**:删除
**kill** : 结束一个流程

搜索

**grep**:搜索
**ag**:搜索

档案馆

**tar**:将多个文件合并成一个文件

包装

在本文中,您已经看到了 21 个最常见的 shell 命令。如果你还有一个你认为应该上榜的,请在 Twitter @discdiver 上告诉我。

您还看到了如何创建 Bash 别名来节省时间。

如果您想深入了解,这里有一些资源:

  • 征服命令行是马克·贝茨的一本很棒的免费电子书。

[## 征服命令行

学习掌握和征服最有价值和最有用的命令行工具,用于基于 Unix 和 Linux 的系统。在这个…

conqueringthecommandline.com](http://conqueringthecommandline.com/book/basics)

  • 来自 gnu.org 的官方 Bash 文档在这里。
  • SedAwk听起来像是两兄弟,但它们实际上是 Bash 中常见的文本处理实用程序。在这里了解更多关于他们的。
  • cURL —读作“curl”——用于通过 url 和测试服务器传输数据。点击了解更多。
  • 如果你想学习如何把这些命令和其他 Bash 代码放到脚本中,这里有一个很好的指南。
  • 这里有一个关于 Bash 脚本的大备忘单。

像任何语言一样,学习 Bash 需要练习。用它来提高你的工作效率,并享受把它教给别人的乐趣。😄

我写了如何使用编程和数据科学工具,如 Docker、Git 和 Python。如果你对此感兴趣,在这里阅读更多和关注我。👏

炮轰快乐!