从图像处理开始的 11 个步骤
OpenCV 和 Python:超级流行的图像处理库的基础
猎户座星云(又名 M42) 由作者拍摄*。【天竺葵】*
Python 现在是世界上用于任何目的的最广泛使用的编程语言之一。与此同时,图像已经成为大多数深度学习算法的基础,用于与自动驾驶、地球观测或人脸检测等相关的显然遥远的任务。
OpenCV 是用 C++编写的多平台库,为 处理图像 而生。你可以用它做 几乎所有的 :从 蒙版 到 人脸检测 。
幸运的是,有 API 比允许你用 C、Java,当然还有 Python 。
在本文中,我们将通过 10 的步骤来学习成像的基础知识 。
0.安装 OpenCV
要安装OpenCV Python 3 API我们可以简单地使用 pip 。所以在 命令行 或 Anaconda 提示符 中我们可以写:
1.导入图像
安装完成后,我们可以 导入名为cv2
的 包。我们还将导入matplotlib
来显示我们的实验结果。
2.阅读图像
现在让我们定义一下我们想玩的 图像路径 。我们可以使用函数**cv.imread()**
将图像作为 Numpy 数组导入和读取。
认识我最久的人都注意到了我是多么热爱天体摄影。所以,我们来玩一张美丽的 猎户座星云的照片吧! (更多信息*此处 和 此处 为 astro-addicteds)。*
让我们使用**matplotlib**
立即显示该图像的内容:
**
图 1-假彩色的猎户座星云(又名 M42)。[瓦卡罗]
这张 8 bit ( 压缩 ) JPEG 图像是用我的 80/480 折光仪 和一台 佳能 EOS 60D 采集的。 它有(R、G、B)三个通道,分辨率约为2048 x 1328。**
不幸的是,正如我们所看到的,图像 的颜色绝对是交错的 ( 图 1 )。
OpenCV 实际上使用了 BGR 三合 而不是 RGB 作为标准。
因此,有必要转换图像并将通道放在正确的位置: 从 BGR 到 RGB 。
4.重新排列频道:从 BGR 到 RGB
为了将通道按正确的顺序排列,并使它们适应 RGB 颜色空间 ,我们可以使用**cv.cvtColor()**
函数将**COLOR_BGR2RGB**
作为转换参数。
****
图 2——真实颜色的猎户座星云(又名 M42)。稍微好一点,不是吗?[瓦卡罗]
颜色都是 现在肯定 比较均衡 ( 图 2 )。
5.分别显示频道
由于我们的图像实际上是 3 个不同矩阵*的 堆栈(每个颜色通道 R、G 和 B 一个矩阵),我们可以考虑分别显示每个矩阵。*
我们可以使用numpy
语法来对立方体进行切片。**
****
图 3 — RGB 图像通道[A.Vaccaro]
我们到了! 分割三个通道 可以让我们从 光谱角度 (图 3)注意到表征我们主题的有趣细节。
例如,猎户座星云的中心富含 氢气,它发出的光(能量)主要是红色和近红外 。
相反,旁边的反射星云(跑男星云,左边)反射周围年轻恒星的光(通常趋向蓝色)。
拆分渠道 我们实现 ,不出所料,准确的说是 这些 前面提到的 方面 。
红色通道中的白色代表猎户座星云的中心,而蓝色通道则更多地出现在小跑步者星云中。
6.可视化直方图
直方图和图像。不可避免的结合!
一个通道 的 直方图可以告诉我们 数字在每个通道 内是如何分布的。例如,通过分析单个直方图,我们能够知道 是深色区域还是浅色区域占优势 。
**
图 4 — RGB 图像直方图[A.Vaccaro]
注意: ***flatten()***
这里使用的是展开数组的函数。
天空背景像素是暗的 ,由于它们占优势,它们将直方图(图 4 )向相对 低动态值 ( 例如 25 )移动。
7.提取位深度
每个像素具有预定的容器大小。不,我说的不是图像几何(例如分辨率)。
我指的是图像 信息内容 :其通道灰度 的种类、丰富度和 动态。
例如,我们可以选择将收集到的信息保存在一个 2 位 容器中的每个像素内:我们会发现自己拥有一个只有白色或黑色像素(0,1 )的图像。**
如果我们决定切换到 8 位 呢?我们将有一个从 0 到 255 的灰度(用于每个通道)。信息,就这样, 开始有了自己的动态 。你明白了!
我们正在玩的物体是一个**numpy**
**ndarray**
。让我们来看看它们的像素有多大。
所以它有经典的**dtype**
属性,我们可以用它来知道图像 的 位深度。
不错!这是 的 8 位 图像。这是我们可以预料到的事情,因为它是一个 JPEG 文件。
这意味着图像中最清晰的像素的值为最暗的像素为 0 。**
一个 16 位 通道图像将允许我们保留高达 65536 级 的灰度( 0,65535 )而不是只有 256 级。这一切,显然是以 为代价,其大小在 盘上。
8.裁剪图像
在我们 裁剪图像 之前,让我们利用**shape**
属性找出它的(几何 ) 尺寸 :
输出元组 告诉我们图像有1328 行2048 列3 个通道** ( RGB )。为了 裁剪图像 我们可以简单地使用**numpy**
索引方法。**
例如,取 的前 200 行 和 的前 300 列 (所有通道的)我们可以简单地这样写:**
****
图 5 —图像左上角的裁剪部分。
**瞧!如果我们想从 600 到 900 行、350 到 1250 列和所有通道中进行选择:
****
图 6 —图像的中央裁剪部分。
如果相反,我们想 只裁剪一个通道 ( 第一个)我们只需要写:
****
图 7 —图像的中心单色裁剪。
超级简单!
9.像素数量
图像中有多少像素?要回答这个很简单的问题,只需 将长边的像素数 乘以短边的像素数即可。
2,719,744.大约对应270 万像素** 。**
10.剖析图像
假设你想 从图像中提取一个垂直和一个水平截面 。
****
图 7——如果我们想剖析图像,该怎么办?
我们要 提取这两个轮廓 。我们如何做到这一点?很简单。
我们可以按照这种方式对第 600 行的 水平段 进行操作。
****
图 8-第 600 排的水平剖面图。
对于列#1000 处的 垂直的一个 也是如此。
****
图 9-立柱#1000 的垂直剖面图。
图形中的每条曲线 对应每个 RGB 通道 的 段。
有了这样的简介(图 8,9 )就很容易验证,并且有 的证据 证明我们仅仅通过看图像就能读到的东西。**
-1.结论
我们可以暂时停在这里。OpenCV 是一头贪得无厌的野兽:这只是冰山一角。欢迎来到这个 无比广阔的世界 。
🤝如有任何疑问、反馈或协作要求,请随时 联系我Linkedin。我会很高兴和你聊天!
👉要获得更多类似的内容,并关注即将发布的文章,请不要忘记在 Medium上关注我。****
我的数据科学之旅给你的 11 条建议
帮助您更成功地进入数据科学的提示。
本杰明·戴维斯在 Unsplash 上拍摄的照片
我做到了!大约两年半后,我转行进入了数据科学领域。如果你正计划将职业生涯转向数据科学,并担心这会花费你这么长的时间,不要这样做。我并不完美,可能和你有不同的生活境遇。但是我会和你分享一些我希望我做了(或者更快做了)的事情来帮助你在更短的时间内成功。
为我的情况做好准备:
a)我是一个蹒跚学步的孩子的丈夫和父亲。
b)我有数学硕士学位,刚开始的时候几乎没有编码经验。
c)我是一名高中数学老师,开车上班要花一个小时。
解决了这个问题,让我们来看看这些技巧吧!
1.如果你要转行,寻找在当前领域应用数据科学技能的机会。
请记住,作为一名数据科学家,你是一名问题解决者。当你培养了一种分析思维,开始把它应用到你领域的问题中。这可能意味着做你自己的副业。更好的是,你可以在你目前的职业中找到一个你可以用数据科学解决的问题。我在学校这样做是为了影响为学生雇佣额外支持的决定。也许在你的公司里,如果你能经常展示使用数据科学解决公司问题的益处,就能创造一个机会。
2.如果你参加课程,立即应用你学到的技能。
Jonathan Chng 在 Unsplash 上拍摄的照片
所以你已经参加了几门课程来增强基本技能。这很好,但不要陷入所谓的“教程炼狱”。这是你一门接一门地学习,仅此而已。立即应用您的技能!课程使用的数据是为了教学目的,但不会总是让你准备好面对真正杂乱的数据。尝试一两项新技能,感受在未知情况下使用它们的感觉。说到实验…
3.经常实验。
照片由 Unsplash 上的 battle creek 咖啡烘焙师拍摄
玩你所学的。尝试新功能。获取一些新数据以使用新的可视化。将你从未想过会接触到的数据可视化。将您的工作流程转换成可重复使用的脚本。根据你的分析写一份报告。尝试设置一个基本的 web 应用程序。做所有这些将有助于引导你走向你真正喜欢的数据科学。
4.尝试公开分享你的作品。
你需要一种方式来展示你的能力。找一个平台来做这件事。我在用 Squarespace 制作的个人网站上写过博客,在 Medium 上也写过博客(当然是在 Medium 上),制作过 Youtube 视频,在 Twitter 和 Linkedin 上分享过可视化效果和我正在做的事情。无论你决定哪一个,坚持一个,并试着每月至少做一次以上的事情。这样做实际上引起了一家出版公司的注意,他们让我做一个关于 Tensorflow 的在线课程。
5.迅速决定你想在数据科学领域做什么。
由 Jens Lelie 在 Unsplash 上拍摄的照片
有句谚语说“万事通,无所不能”。如果你的时间像我一样被限制在每天一个小时,你就无法掌握 Python、R、SQL、统计学、机器学习、数据可视化、AI 以及有效沟通上述任何一项的能力。你可以根据你喜欢使用的东西和/或你做过的项目来选择你想要专注的技能。对我来说,我坚持使用 Python,因为它可以灵活地访问数据科学的任何部分,并允许我构建 web 应用程序。我对使用什么工具的关注是基于我正在做的与教育相关的项目,因为那是我的领域。
6.不要放弃锻炼。
当我开始这段旅程时,我正开始完全摆脱我的父亲。但当我如此沉迷于数据科学世界时,我开始否定我在锻炼方面的兴趣和健康。我在中途意识到这一点,不得不重新获得我失去的所有健康进步。我的武术练习也落后了一点。即使每天只做 5 到 10 分钟的小运动量训练,也要做些事情让你的身体保持运动。虽然我们是有伟大思想能力的生物,但我们最初是被设计来移动的
7.让你的 LinkedIn 个人资料迅速脱颖而出
在广告周刊上发现 Linkedin 标志
不管你在旅程的哪个阶段,清理你的 LinkedIn 个人资料。有很多方法可以让你修改这份资料,以引起他人的注意,并找到潜在的雇主。我的简介让一位脸书招聘人员联系我,希望得到一份起薪超过 13 万美元的工作。根据我所学的一些快速修改是:
a)将“数据科学家”和“机器学习”等词放在你要陈述的地方。
b)如果您做过数据科学相关的工作或项目,请将它们添加到您的个人资料中,强调某人如何从您的工作中受益。
这里是我的 LinkedIn 个人资料,给你一些关于以上的想法。
8.寻找导师。
或者至少是对你的工作和进步的第二种意见。你需要有人来帮助你调整你的技能。有一个导师当然是很好的。鉴于我的情况,我不能放弃我的工作去全职的新兵训练营。这就是我选择sharpes minds的原因。无论你在哪里,他们都会为你安排一位来自该领域的导师,时间灵活,有大量的招聘支持,并且在你被聘用之前不会收取任何费用。
9.不要得寸进尺。
瑞安·弗兰科在 Unsplash 上拍摄的照片
有了正确的支持系统,事情当然会变得容易得多。对我来说,那是我的妻子。她每天给我一个小时的时间学习,做项目,申请职位。我本可以拿更多,但除非绝对必要,否则我尽量不拿。但它确实有负面影响,让我牺牲了和她在一起的宝贵时间。除此之外,我有时还会抱怨转行花了这么长时间,我一度把她推得太远了。过了一段时间,我的妻子原谅了我,并暂停了其他一切。在追求新职业的同时,记得平衡你的生活。它对别人的影响比你想象的要大。
10.开始写博客
照片由格伦·卡斯滕斯-彼得斯在 Unsplash 拍摄
我之前提到过这一点,但我特别强调这一点是因为书面交流的重要性。到目前为止,我需要我的写作技巧来传达项目提案的请求,为上周发布的用户创建一个使用/解释仪表板的教程,用于与同事就任务进行日常交流,以及起草电子邮件以澄清临时请求。博客有助于培养这些技能。如果你需要更多关于为什么你应该写博客的影响,请阅读大卫·罗宾逊的这篇文章,它与我分享来影响这个决定。
11.做能完成以上 2 条以上建议的事情
图片来自financialish.com
如果你想做我之前提到的 2+个想法,试着做能完成多件事的项目。例如,当我必须为一个项目做点双列相关时,我必须了解它,然后应用它。为了加深我对它的理解,我写了一篇博文。
线性回归是确定数据的两个或多个连续特征之间相关性的经典技术…
towardsdatascience.com](/point-biserial-correlation-with-python-f7cd591bd3b1)
因此,这个项目让我解决了我在数据科学工作中的问题,并产生了一篇博文,增加了我在公众面前的曝光率。通过在 youtube 视频中演练代码,可以更进一步。
通过写这篇博客,我实际上同时完成了两项任务。我将与 SharpestMinds 学员进行一次私人网络研讨会,分享我获得数据科学职位的经验。在这篇博文中,我总结了我将分享的技巧,并创建了一篇对你和他们都有帮助的博文。谁说你不能一心多用。
最终想法
这不是一个详尽的列表。如果你对我提到的更多技巧感兴趣,我会非常乐意和你聊天。我已经不怎么用 Linkedin 了。在 Twitter 上直接给我发消息,告诉我你是通过这篇博客找到我的,我们可以约个时间。
如果你想根据我的经验得到更深入的建议,看看下面这些帖子:
帮助您开始学习数据科学的课程指南
towardsdatascience.com](/a-potential-data-science-foundation-for-math-backgrounds-188b03b9f1ff) [## 为什么专注对您的数据科学之旅至关重要
以及它将如何节省您进入该领域的时间
towardsdatascience.com](/why-focus-is-key-for-your-data-science-journey-b62715b2a1c)
再次感谢您的阅读!如果你是一名数据科学家,正在阅读这篇文章,请在下面的评论中添加我遗漏的任何建议。
直到下一次,
约翰·德杰苏斯
实践 Matplotlib 的 11 个可视化示例
综合实践指南
韦斯利·廷吉在 Unsplash 上拍摄的照片
数据可视化在数据科学领域非常重要。它不仅用于交付结果,也是探索性数据分析的重要组成部分。
Matplotlib 是一个广泛使用的 Python 数据可视化库。事实上,许多其他库都是构建在 Matplotlib 之上的,比如 Seaborn。
Matplotlib 的语法通常比 Python 的其他可视化库更复杂。但是,它为您提供了灵活性。你可以自由定制剧情。
这篇文章可以被认为是一个 Matplotlib 教程,但主要集中在实践方面。在每个示例中,我将尝试生成一个不同的图,指出 Matplotlib 的重要特性。
我将在 Kaggle 上的客户流失数据集上做例子。我经常使用这个数据集,因为它很好地混合了分类变量和数字变量。此外,它带有目的性,因此示例构成了探索性的数据分析过程。
让我们首先安装依赖项:
import numpy as np
import pandas as pdimport matplotlib.pyplot as plt
%matplotlib inline
Matplotlib 由 3 层组成,分别是后端、艺术家和脚本层。脚本层是 matplotlib.pyplot 接口。
脚本层使得创建情节相对容易,因为它自动化了将所有东西放在一起的过程。因此,它是数据科学家使用最广泛的图层。
我们将把数据集读入熊猫数据帧。
cols = ['CreditScore', 'Geography', 'Gender', 'Age', 'Tenure', 'Balance', 'NumOfProducts', 'IsActiveMember', 'EstimatedSalary',
'Exited']churn = pd.read_csv("/content/Churn_Modelling.csv", usecols=cols)churn.head()
(图片由作者提供)
数据集包含一些关于银行客户及其银行账户的特征。“退出”栏表明客户是否发生了搅动(即离开了银行)。
我们准备好出发了。
1.每个国家的客户数量
这个很简单,但是对于柱状图来说是一个很好的例子。
plt.figure(figsize=(8,5))
plt.title("Number of Customers", fontsize=14)plt.bar(x=churn['Geography'].value_counts().index,
height=churn.Geography.value_counts().values)
(图片由作者提供)
在第一行中,我们创建了一个特定大小的人物对象。下一行向 Figure 对象添加一个标题。bar 函数绘制实际数据。
2.调整 xticks 和 yticks
默认设置通常是合适的,但在某些情况下可能需要进行细微的调整。例如,我们可以增加字体大小,也可以调整 y 轴的取值范围。
plt.xticks(fontsize=12, rotation=45)
plt.yticks(ticks=np.arange(0, 7000, 1000), fontsize=12)
将这两行代码添加到前面的图中将产生:
(图片由作者提供)
3.更改默认体形大小
默认的图形大小是(6,4),我认为这是非常小的。如果您不想明确定义每个图形的大小,您可能需要更改默认设置。
matplotlib 的 rcParams 包用于存储和更改默认设置。
plt.rcParams.get('figure.figsize')
[6.0, 4.0]
如您所见,默认大小为(6,4)。我们把它改成(8,5):
plt.rcParams['figure.figsize'] = (8,5)
我们还可以更改其他参数的默认设置,如线条样式、线条宽度等。
我还将 xtick 和 yticks 的字体大小更改为 12。
plt.rc('xtick', labelsize=12)
plt.rc('ytick', labelsize=12)
4.创建简单的直方图
直方图用于可视化变量的分布。
下面的语法将创建一个简单的客户余额直方图。
plt.hist(x=churn['Balance'])
(图片由作者提供)
大多数顾客的账户余额为零。当排除零平衡时,分布接近正态(高斯)分布。
5.自定义直方图
定义直方图的两个基本特征是仓的数量和值的范围。
箱数的默认值为 10,因此值范围将被分成 10 个相等的箱。例如,先前直方图中的第一个柱是 0–25000。增加容器大小就像提高分辨率一样。在某种程度上,我们会对分布有更准确的了解。
取该列的最小值和最大值来定义值范围。我们可以调整它以排除异常值或特定值。
plt.hist(x=churn['Balance'], bins=12, color='darkgrey',
range=(25000, 225000))plt.title("Distribution on Balance (25000 - 225000)", fontsize=14)
(图片由作者提供)
低于 25000 或高于 225000 的值被排除,并且箱的数量从 10 增加到 16。我们现在看到一个典型的正态分布。
6.创建简单的散点图
散点图通常用于绘制数值变量之间的关系。我们可以用散点图来显示变量之间的相关性。
sample = churn.sample(n=200, random_state=42) #small sampleplt.scatter(x=sample['CreditScore'], y=sample['Age'])
(图片由作者提供)
年龄和信用评分之间似乎没有关联。
7.带支线剧情的散点图
我们可以在同一个图形对象上放置多个散点图。虽然语法比其他一些库(例如 Seaborn)长,但 Matplotlib 在子情节方面非常灵活。我们将做几个由支线剧情组成的例子。
支线剧情函数创建一个图形和一组支线剧情:
fig, ax = plt.subplots()
我们可以在图上创建多个图,并用图例来标识它们。
plt.title("France vs Germany", fontsize=14)ax.scatter(x=sample[sample.Geography == 'France']['CreditScore'], y=sample[sample.Geography == 'France']['Age'])ax.scatter(x=sample[sample.Geography == 'Germany']['CreditScore'], y=sample[sample.Geography == 'Germany']['Age'])ax.legend(labels=['France','Germany'], loc='lower left', fontsize=12)
(图片由作者提供)
8.支线剧情网格
支线剧情不一定要一个接一个。subplots 函数允许使用 nrows 和 ncols 参数创建一个 subplots 网格。
fig, (ax1, ax2, ax3) = plt.subplots(nrows=3, ncols=1)
(图片由作者提供)
我们有一个空的支线剧情网格。在下面的例子中,我们将看到如何填充这些支线剧情,并做一些小的调整,使它们看起来更好。
9.重新安排和访问支线剧情
在添加标题之前,让我们在支线剧情之间留出一点空间,这样它们会看起来更好。我们将使用 tight_layout 函数来实现这一点。
我们也可以去掉中间的 x 记号,只保留底部的。这可以通过 sharex 参数来完成。
fig, (ax1, ax2, ax3) = plt.subplots(nrows=3, ncols=1, figsize=(9,6), sharex=True)fig.tight_layout(pad=2)
(图片由作者提供)
有两种方法可以进入支线剧情。一种方法是显式定义它们,另一种方法是使用索引。
# 1
fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1)
first subplot: ax1
first subplot: ax2# 2
fig, axs = plt.subplots(nrows=2, ncols=1)
first subplot: axs[0]
second subplot: axs[1]
10.绘制支线剧情
我们将创建一个包含两列的网格,并为每一列添加条形图。
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, sharey=True,
figsize=(8,5))countries = churn.Geography.value_counts()
products = churn.NumOfProducts.value_counts()ax1.bar(x=countries.index, height=countries.values)
ax1.set_title("Countries", fontsize=12)ax2.bar(x=products.index, height=products.values)
ax2.set_title("Number of Products", fontsize=12)
(图片由作者提供)
11.创建二维直方图
2D 直方图显示了一对变量的分布。我们得到了两个变量的值如何一起变化的概述。
让我们创建一个信用评分和年龄的 2D 直方图。
plt.title("Credit Score vs Age", fontsize=15)
plt.hist2d(x=churn.CreditScore, y=churn.Age)
(图片由作者提供)
人口最多的群体由年龄在 30 到 40 岁之间的客户组成,他们的信用评分在 600 到 700 之间。
结论
我们在这篇文章中介绍的只是 Matplotlib 功能的一小部分。我分享的一些信息可以被认为是细节,而其中一些是非常基本的。然而,它们都有助于充分利用 Matplotlib。
和其他学科一样,掌握 Matplotlib 的最好方法是实践。一旦您熟悉了基本功能,就可以继续使用更高级的功能。
感谢您的阅读。如果您有任何反馈,请告诉我。
12 只神奇的熊猫和数字功能
通过在您的分析中使用这些函数,让您的日常生活更加轻松
礼貌:https://pixabay.com/photos/code-programming-python-1084923/
我们都知道熊猫和熊猫很神奇,它们在我们的日常分析中起着至关重要的作用。如果没有熊猫和 NumPy,我们将被遗弃在这个巨大的数据分析和科学世界中。今天,我将分享 12 个令人惊奇的熊猫和 NumPy 函数,它们将使你的生活和分析比以前容易得多。最后,您可以在 Jupyter 笔记本上找到本文中使用的代码。
让我们从 NumPy 开始:
NumPy 是使用 Python 进行科学计算的基础包。除其他外,它包含:
- 一个强大的 N 维数组对象
- 复杂的(广播)功能
- 集成 C/C++和 Fortran 代码的工具
- 有用的线性代数、傅立叶变换和随机数功能
除了其明显的科学用途,NumPy 还可以用作通用数据的高效多维容器。可以定义任意的数据类型。这使得 NumPy 可以无缝、快速地与各种数据库集成。
- argpartition()
NumPy 有这个神奇的功能,可以找到 N 个最大值索引。输出将是 N 个最大值的索引,然后我们可以根据需要对这些值进行排序。
x = np.array([12, 10, 12, 0, 6, 8, 9, 1, 16, 4, 6, 0])index_val = np.argpartition(x, -4)[-4:]
index_val
array([1, 8, 2, 0], dtype=int64)np.sort(x[index_val])
array([10, 12, 12, 16])
- allclose()
Allclose()用于匹配两个数组并获得布尔值形式的输出。如果两个数组中的项在容差范围内不相等,它将返回 False。这是检查两个数组是否相似的好方法,而这实际上很难手工实现。
array1 = np.array([0.12,0.17,0.24,0.29])
array2 = np.array([0.13,0.19,0.26,0.31])# with a tolerance of 0.1, it should return False:
np.allclose(array1,array2,0.1)
False# with a tolerance of 0.2, it should return True:
np.allclose(array1,array2,0.2)
True
3.剪辑()
Clip()用于将数组中的值保持在一个区间内。有时,我们需要将值保持在一个上限和下限内。出于上述目的,我们可以利用 NumPy 的 clip()。给定一个区间,区间外的值被剪切到区间边缘。
x = np.array([3, 17, 14, 23, 2, 2, 6, 8, 1, 2, 16, 0])np.clip(x,2,5)
array([3, 5, 5, 5, 2, 2, 5, 5, 2, 2, 5, 2])
4.提取()
Extract()顾名思义,用于根据特定的条件从数组中提取特定的元素。使用 extract(),我们还可以使用类似于和和或的条件。
# Random integers
array = np.random.randint(20, size=12)
array
array([ 0, 1, 8, 19, 16, 18, 10, 11, 2, 13, 14, 3])# Divide by 2 and check if remainder is 1
cond = np.mod(array, 2)==1
cond
array([False, True, False, True, False, False, False, True, False, True, False, True])# Use extract to get the values
np.extract(cond, array)
array([ 1, 19, 11, 13, 3])# Apply condition on extract directly
np.extract(((array < 3) | (array > 15)), array)
array([ 0, 1, 19, 16, 18, 2])
- where()
其中()用于从满足特定条件的数组中返回元素。它返回符合特定条件的值的索引位置。这几乎类似于我们在 SQL 中使用的 where 条件,我将在下面的例子中演示它。
y = np.array([1,5,6,8,1,7,3,6,9])# Where y is greater than 5, returns index position
np.where(y>5)
array([2, 3, 5, 7, 8], dtype=int64),)# First will replace the values that match the condition,
# second will replace the values that does not
np.where(y>5, "Hit", "Miss")
array(['Miss', 'Miss', 'Hit', 'Hit', 'Miss', 'Hit', 'Miss', 'Hit', 'Hit'],dtype='<U4')
6.百分位()
Percentile()用于计算沿指定轴的数组元素的第 n 个百分位数。
a = np.array([1,5,6,8,1,7,3,6,9])print("50th Percentile of a, axis = 0 : ",
np.percentile(a, 50, axis =0))
50th Percentile of a, axis = 0 : 6.0b = np.array([[10, 7, 4], [3, 2, 1]])print("30th Percentile of b, axis = 0 : ",
np.percentile(b, 30, axis =0))
30th Percentile of b, axis = 0 : [5.1 3.5 1.9]
让我知道你以前是否用过它们,它对你有多大帮助。让我们继续看神奇的熊猫。
熊猫:
pandas 是一个 Python 包,提供了快速、灵活、富于表现力的数据结构,旨在使结构化(表格、多维、潜在异构)和时间序列数据的处理变得既简单又直观。
pandas 非常适合许多不同类型的数据:
- 具有不同类型列的表格数据,如在 SQL 表或 Excel 电子表格中
- 有序和无序(不一定是固定频率)时间序列数据。
- 带有行和列标签的任意矩阵数据(同类或异类)
- 任何其他形式的观察/统计数据集。这些数据实际上根本不需要标记就可以放入 pandas 数据结构中。
以下是熊猫擅长的几件事:
- 轻松处理浮点和非浮点数据中的缺失数据(表示为 NaN)
- 大小可变性:可以在数据帧和高维对象中插入和删除列
- 自动和明确的数据对齐:对象可以明确地与一组标签对齐,或者用户可以简单地忽略标签,让系列、数据框等。在计算中自动调整数据
- 强大、灵活的分组功能,可对数据集执行拆分-应用-组合操作,用于聚合和转换数据
- 使将其他 Python 和 NumPy 数据结构中粗糙的、不同索引的数据转换成 DataFrame 对象变得容易
- 大型数据集的智能基于标签的切片、花式索引和子集化
- 直观的合并和连接数据集
- 数据集的灵活整形和旋转
- 轴的分层标签(每个刻度可能有多个标签)
- 强大的 IO 工具,用于从平面文件(CSV 和带分隔符文件)、Excel 文件、数据库加载数据,以及从超快速 HDF5 格式保存/加载数据
- 特定于时间序列的功能:日期范围生成和频率转换、移动窗口统计、日期移动和滞后。
- read_csv(nrows=n)
您可能已经知道 read_csv 函数的用法。但是,我们中的大多数人仍然会犯一个错误。csv 文件,即使它不是必需的。让我们考虑这样一种情况,我们不知道一个 10gb 的. csv 文件中存在的列和数据,整个读取。csv 文件在这里不会是一个聪明的决定,因为它会不必要的使用我们的内存,并会花费大量的时间。我们可以只从。csv 文件,然后根据我们的需要进一步进行。
import io
import requests# I am using this online data set just to make things easier for you guys
url = "[https://raw.github.com/vincentarelbundock/Rdatasets/master/csv/datasets/AirPassengers.csv](https://raw.github.com/vincentarelbundock/Rdatasets/master/csv/datasets/AirPassengers.csv)"
s = requests.get(url).content# read only first 10 rows
df = pd.read_csv(io.StringIO(s.decode('utf-8')),nrows=10 , index_col=0)
2.地图()
map()函数用于根据输入的对应关系映射系列的值。用于将一个数列中的每一个值替换为另一个值,该值可以是从一个函数、一个字典或一个数列中导出的。
# create a dataframe
dframe = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['India', 'USA', 'China', 'Russia'])#compute a formatted string from each floating point value in frame
changefn = lambda x: '%.2f' % x# Make changes element-wise
dframe['d'].map(changefn)
- apply()
apply()允许用户传递一个函数,并将其应用于 Pandas 系列的每个值。
# max minus mix lambda fn
fn = lambda x: x.max() - x.min()# Apply this on dframe that we've just created above
dframe.apply(fn)
- isin()
isin()用于过滤数据帧。isin()有助于选择在特定列中具有特定(或多个)值的行。这是我遇到的最有用的功能。
# Using the dataframe we created for read_csv
filter1 = df["value"].isin([112])
filter2 = df["time"].isin([1949.000000])df [filter1 & filter2]
5.复制()
*copy()*用于创建一个熊猫对象的副本。当您将一个数据框分配给另一个数据框时,当您在另一个数据框中进行更改时,其值也会发生变化。为了防止上述问题,我们可以使用 copy()。
# creating sample series
data = pd.Series(['India', 'Pakistan', 'China', 'Mongolia'])# Assigning issue that we face
data1= data
# Change a value
data1[0]='USA'
# Also changes value in old dataframe
data# To prevent that, we use
# creating copy of series
new = data.copy()# assigning new values
new[1]='Changed value'# printing data
print(new)
print(data)
- select_dtypes()
select_dtypes()函数根据列 dtypes 返回数据框列的子集。此函数的参数可以设置为包括所有具有某种特定数据类型的列,也可以设置为排除所有具有某种特定数据类型的列。
# We'll use the same dataframe that we used for read_csv
framex = df.select_dtypes(include="float64")# Returns only time column
奖励:
pivot_table()
熊猫最神奇最有用的功能就是 pivot_table。如果您对使用 groupby 犹豫不决,并且希望扩展它的功能,那么您可以使用 pivot_table。如果您知道 excel 中的数据透视表是如何工作的,那么这对您来说可能是小菜一碟。数据透视表中的级别将存储在结果数据帧的索引和列上的多索引对象(分层索引)中。
# Create a sample dataframe
school = pd.DataFrame({'A': ['Jay', 'Usher', 'Nicky', 'Romero', 'Will'],
'B': ['Masters', 'Graduate', 'Graduate', 'Masters', 'Graduate'],
'C': [26, 22, 20, 23, 24]}) # Lets create a pivot table to segregate students based on age and course
table = pd.pivot_table(school, values ='A', index =['B', 'C'],
columns =['B'], aggfunc = np.sum, fill_value="Not Available")
table
如果你们遇到或使用过其他神奇的功能,请在下面的评论中告诉我。我很想知道更多关于他们的事情。
Jupyter 笔记本(使用代码):https://github . com/kunaldhariwal/Medium-12-Amazing-Pandas-NumPy-Functions
LinkedIn*😗https://bit.ly/2u4YPoF
我希望这有助于增强你的知识基础:)
更多信息请关注我!
感谢您的阅读和宝贵时间!
12 台重要的 Colab 笔记本电脑
StyleGAN、GPT-2、StyleTransfer、DeOldify、Magenta 等。参加选拔
我喜欢 Colab 笔记本。作曲:Merzmensch(本文作者)
打开手机。
它至少花了两个艾特斯 才活下来。故事很明显:理论上,人工智能作为一个概念已经在这里了。神经元网络(作为一个概念:1943 — 麦卡洛克&皮茨/泛函:1965 — 伊瓦赫年科/帕拉),机器学习 ( 塞缪尔,1959),反向传播 ( 沃博斯 — 1975),仅举几个重点研究。理论上。但实际上,计算能力仍然是这样的:
人工智能的研究还有待于实际实现。最后,在 2000 年代,每一个拥有个人电脑的人都能够用机器和深度学习做实验。
我记得 2016 年,随着谷歌深度梦想的出现(感谢亚历山大·莫尔德温采夫)。我花了很长时间来设置和运行它。但是结果是惊人的:
左边:Merzmensch 的照片,我平时的“Merzmensch userpic”。右边:这张被 DeepDream 改造的照片,截图:Merzmensch
我爱上了艾。我想尝试更多。后来我发现了 Colab 笔记本。他们改变了我的生活。
Google Colab 笔记本实现了数据科学的民主化。它们允许每个人——人工智能研究员、艺术家、数据科学家等——在每个设备上(甚至在智能手机上)享受机器和深度学习的力量。只需运行细胞,改变参数、值和来源,享受 AI 的多样性。
我想和你分享一些我喜欢的笔记本。试试吧!你可以在这里找到许多关于背景和使用 Colab 笔记本的优秀文章。
图像和视频
01)谷歌深梦
来源:【TensorFlow.org//图片抄送:Von.grzanka
这是怎么回事?
DeepDream 通过神经网络可视化模式识别、解释和迭代生成。通过增加这种创造性的解释,你可以产生梦一样的意象。
神经网络就像我们的大脑一样:它寻找熟悉的模式,这些模式来自它们被训练的数据集。
资料来源——左边:美国国家航空航天局,公共领域,1976 //右边:蒙娜丽莎,带着深深的梦想,CC-by nixtown ,2016
上面的例子(我在 2019 年 11 月法兰克福 AI Meetup 上的一个 屏幕)展示了我们的大脑如何在火星 Cydonia 地区的岩层中识别一张脸。一位用户 Nixtown 通过连续的 DeepDream 迭代改变了达芬奇的蒙娜丽莎——AI 识别出了奇怪的模式。
通常我们的大脑会识别不存在的模式或物体。但是如果我们人类的感知做到了,为什么 AI 不应该呢?
链接:
要尝试的东西:
尝试生成不同的图案并调整图像大小(八度)。使用更多迭代。不要害怕疯狂——结果可能会令人不安。
有趣的事实:
最初,DeepDream 习惯于在每个图案中识别大部分是狗脸。据 FastCompany 称,该网络是在…
ImageNet 数据库的一个更小的子集,于 2012 年发布,用于一场比赛…该子集包含“120 个狗子类的细粒度分类( FastCompany )。
阅读 更多关于我与 DeepDream 的实验。
02)比根
模拟时钟(#409),由比根创造。我截图。
这是怎么回事?
比格根是第一批著名的生成对抗网络之一。在 ImageNet 上以现在不起眼的 128x128 分辨率训练,这个网络因其多方面的生成能力而成为一个标准。
在这个笔记本中,您可以从一长串类别中生成样本。
选择类别“山谷”……(截图:Merzmensch)
…生成照片般逼真的山谷图像系列(由:Merzmensch 生成)
链接:
- 比根关于 arXiv 的论文(安德鲁·布洛克,杰夫·多纳休,卡伦·西蒙扬。高保真自然图像合成的大规模 GAN 训练。 arxiv:1809.11096 ,2018)
- Colab 笔记本
要尝试的东西:
同一个笔记本可以让你创建图像之间的插值。这种方法过去是——现在也是——令人兴奋和创新的,因为以前只有超现实主义者和抽象艺术家才有勇气把不相容的东西结合起来。现在你可以用照片级的结果来做这件事,例如,在约克夏犬和航天飞机之间生成插值。
截图:Merzmensch
生成人:Merzmensch
参见:
03)样式转移
我的用户 pic,正在被梵高画//生成人:Merzmensch //右边来源:梵高,文森特·凡:星夜,1889
这是怎么回事:
在这个实验中,深度学习系统检查了两幅源图像——并转换了它们的风格:不仅是颜色,还有形状和图案。
链接:
请参阅:
人工智能中的艺术
截图来自我的文章“ 14 种深度和机器学习的使用使 2019 年成为一个新的人工智能时代”//右边是迭戈·贝拉斯克斯的《拉斯梅尼亚斯》
有许多方法可以在艺术品上训练人工智能。
其中一个是通过 Reddit 提供的:StyleGAN 在艺术数据集上用 Kaggle 的 24k 图像进行了训练。
你会得到有趣的结果,甚至有可能追踪到模型被训练的原始艺术品。(美术新游戏,各位?视觉词源”:
我用 StyleGAN 生成的图像,在 Kaggle 上训练(截图:Merzmensch)
另一个是 WikiART StyleGAN2 条件模型,由彼得·贝勒斯(等人)提供,由多伦·阿德勒打包成笔记本:
这个模型是在维基图片上训练出来的。它甚至允许在艺术家、流派和风格之间进行选择。
Merzmensch 截图
这些图像令人印象深刻:
Merzmensch 使用 WikiART 模型生成的图像。
要尝试的东西:
- 每一种新的组合都会产生有趣的艺术品。尽量选择不同时代风格不典型的艺术家。像毕加索&文艺复兴或者希什金 & 波普艺术。结果有时出乎意料,也不总是容易理解,但这毕竟是艺术。
链接:
参见:
- 如何培养自己的艺人。
- 数据集的不可背叛性。
06)样式 2
StyleGAN2 生成的图片(数据集 FFHQ,Flickr-Faces-HQ),截图由 Merzmensch 提供
这是怎么回事?
由 NVidia 开发的这个网络是目前(2020 年 3 月 6 日下午 4:27)最先进的图像生成网络。它在高清数据集上进行了训练(例如,来自 Flickr-Faces-HQ 的人脸)。StyleGAN2 提供自动学习、无监督的高级属性分离、随机变化和具有视觉特征的层控制。
有各种各样的笔记本(众包研究的好处),但我最喜欢的是 Mikael Christensen 设计的。
链接:
- 论文:https://arxiv.org/abs/1812.04948
- 视频:https://youtu.be/kSLJriaOumA
- 代号:https://github.com/NVlabs/stylegan/https://github.com/NVlabs/stylegan2
- Colab 笔记本
要尝试的东西:
- 笔记本电脑中有各种 NVidia 默认数据集(注意分辨率):
各种数据集,由 NVidia 提供。Merzmensch 截图
- 尝试新的数据集。训练你自己的模型或者使用那些由各种艺术家和研究人员提供的模型,比如迈克尔·弗里森(关注他的推特以获得新的更新)。
细菌类型 g
我用细菌样式生成的一些图片,截图来自 Merzmensch
艺术风格:
麦克·埃舍尔-斯泰勒根:
我用 Merzmensch 的数据集/截图生成的一些图像
- 制作插值视频:
我的插值实验
- 试用 StyleGAN2 投影。使用 StyleGAN2 笔记本,您会发现(或者更好:重新覆盖)隐藏在网络的潜在空间中的图像。StyleGAN Projection 是一种追溯 StyleGAN2 生成的图像的方法——所以你可以将一张照片检测为人工智能生成的产品(# deep fake decide)。它仍然有一些缺点:你必须知道特定图像的具体数据集;图像的每一个变化都会使投影的过程不可行。
这是一个成功的预测:
我的投影实验,两幅图像都是 StyleGAN2 生成的
这个可能会让你第二天晚上睡不着觉:
我的投影实验,图片在左边
阅读更多信息:
如果你想尝试更多样的动机,试试art breader,这是由乔尔·西蒙设计的强大的图像生成器:
发现图像的协作工具。
artbreeder.com](https://artbreeder.com/)
07)#解除锁定
摄影:弗拉基米尔·佩雷尔曼
那是怎么回事:
由杰森·安蒂奇设计的去彩色模型允许对照片和视频进行有机着色。你可以把古老的历史片段带回到生动的生活中。同时,在 MyHeritage.org实施。
方法是强大的。它可以识别图案和物体,并在其上应用经过训练的视觉数据库的颜色。
例如,这些 1950 年代的花:
它也适用于视频。在这里观看#著名的"火车到达拉乔塔特(卢米埃尔兄弟,1896) 的简化和升级版本
建议:
上传你的黑白影片到你的谷歌硬盘。所以你可以保护隐私(当然,如果你信任谷歌云的话)。
链接:
阅读更多信息:
8) 3D 本·伯恩斯效应
3D 本·伯恩斯版我的照片(Merzmensch),来源
这是怎么回事:
3D 本·伯恩斯效果(由西蒙·尼克劳斯等人开发)允许生成单张照片的动画 3D 视频片段。
要尝试的东西:
在 Colab 笔记本中你会找到组件 autozoom.py 。尝试使用以下参数对其进行微调:
objectTo = process_autozoom({**'dblShift': 10.0,****'dblZoom': 10000000000000000000000000000000000000000000000000000000,**'objectFrom': objectFrom})numpyResult = process_kenburns({'dblSteps': numpy.linspace(0.0, **8.0, 400**).tolist(),'objectFrom': objectFrom,'objectTo': objectTo,'boolInpaint': True})
这将会夸大相机的运动——你会飞过整个场景。就像这个例子:
做一些参数的实验,你会从一个全新的角度体验你的照片。该笔记本提供了许多有用的功能,如串行图像= >视频传输。
链接:
阅读更多:
3D 本·伯恩斯效应。在人工智能的帮助下赋予照片新的维度。
towardsdatascience.com](/very-spatial-507aa847179d)
9)一阶运动模型
娜芙蒂蒂半身像(来源)结合杰弗瑞·辛顿的演讲(来源),部分模型库
这是怎么回事:
Aliaksandr Siarohin 等人的一阶运动模型将面部运动从视频片段转换成图像。
要尝试的东西:
选择您的视频素材和源图像!这么多可能性。说句公道话,不要#DeepFake。
链接:
神经语言处理
10,11)GPT 2
这个由 OpenAI 在 2019 年发布的语言模型是在各种来源的 40 GB 文本上训练的。有几个 GPT-2 Colab 笔记本,其工作方式类似:你输入句子的开头,GPT-2 继续(或者你向提供的文本提问)。变压器驱动模式与“自我关注”一起工作,将的注意力放在指定邻近的文本部分,这允许生成连贯的故事,而不是杂乱无章的胡言乱语。
我更喜欢两个 GPT-2 笔记本:
马克斯·伍尔夫的笔记本允许:
- 通过 GPT-2 生成各种文本
- 训练您自己的文本(高达 355m 型号)
我用了三种语言:
- 英文(关于《爱丽丝梦游仙境》)
- 德语(关于歌德的《浮士德 I》)
- 俄语(论普希金的早期诗歌)
Merzmensch 截图
如您所见,它在某种程度上适用于所有语言。当然,GPT-2 是在英语资源上训练的。对于外语,我们应该应用微调和其他资产,但这个概念证明对我来说是有说服力的。有一些有趣的观察:
- 我对《浮士德》的德语训练越多,这些课文就越接近原著。原因可能是在一个小的数据集中(只有一个单一的文本)。如果你想训练你的文本,提供更广泛的数据量。
- 俄语文本不是很容易理解,但是你仍然可以从普希金的诗歌中辨认出风格甚至形式。和新词是完美的,每个文学先锋都会为这样的发明感到自豪。
《带 Javascript 接口的 GPT-2》——笔记本允许:
文字生成,不多不少。但是你可以控制文本长度(这是一个非常相关的因素):
使用温度和 top_k 可以修改文本的随机性、重复性和“怪异性”。
用生成多少可以生成更长的文本(我用的是值 1000)。
链接:
你也可以使用亚当·金的《GPT 2》的网络实现:
我问这个应用关于生命的意义。这个回答非常明智和成熟。
确实很明智!(截图TalkToTransformer.com作者:Merzmensch)
另请阅读:
- 拉克鲁奇!(我的 GPT 三部曲-2)
音乐
12)洋红色:带变形金刚的音乐
AI 也可以写音乐。在基于张量流的洋红色的情况下,它使用变压器,如 GPT-2,具有自我关注,以允许谐波相干和一致的组成。
这是一个用洋红色生成的示例:
Merzmesch 从 Magenta Colab 笔记本上截取的截图
要尝试的东西:
笔记本提供了很多可能性,比如说对于延续,调制,它都允许。wav 和。midi 导出。Magenta 是 GoogleAI 的一个项目。巨大的东西,它甚至包括硬件。
如果你只是想听,这里是洋红色电台:
Music Transformer 是谷歌 Magenta 研究小组的一个开源机器学习模型,可以生成…
magenta.github.io](https://magenta.github.io/listen-to-transformer)
链接:
人工智能的民主化
这就是 Colab 笔记本的使命——为广大读者提供使用 ML/DL 的可能性。让人工智能变得触手可及。提高数字意识和能力。
而这仅仅是艾春天的开始。经过多年的冰雪覆盖。冷冻系统之后。
在这些图书馆中,您可以找到更多笔记本:
在 Google cola b-tugstugi/dl-cola b-notebooks 上在线尝试深度学习模型
github.com](https://github.com/tugstugi/dl-colab-notebooks) [## MRM 8488/shared _ colab _ 笔记本
存储我创建和共享的 Google 协作笔记本的回购-MRM 8488/shared _ colab _ Notebooks
github.com](https://github.com/mrm8488/shared_colab_notebooks)
让我们实验,探索,创造!
你最喜欢的 Colab 笔记本有哪些?在评论中分享吧!
令初学者惊讶的 12 个数据科学现实
做数据科学工作的白日梦时你应该知道的事情
由 You X Ventures 在 Unsplash 上拍摄的照片
所以你想成为一名数据科学家?闭上眼睛,告诉我你看到自己在做什么。
我真的听不到你说什么,但我会假设它听起来或多或少像这样:“我在我的电脑前用最新最酷的算法做模型。我根据我的前沿模型的结果制作了一个惊人的图表,来帮助我决定我工作的公司的下一步行动。我展示了我的发现,每个人都印象深刻,这改变了我们做生意的方式。”这是我作为一名有抱负的数据科学家时的想法。我从来没有真正停下来思考过那些可能会出现在我面前的恼人的小细节。
从我目前的经历来看,作为一名数据科学家有相当多的……副作用,姑且称之为副作用吧。在这篇文章中,我将告诉你一些数据科学家处理的日常问题/现实,希望能说明工作的现实。
#1: 你可能会收到难以解释的肮脏数据,并且需要找到 5 个不同的人,以不兼容的方式向你解释数据的 5 个不同部分。
在实施一些有用的东西之前,你会做很多将要被丢弃的东西。
#3: 你会在数据清理和特征工程上花费超乎想象的时间。毕竟,这是很多次奇迹发生的地方。
#4: 根据问题的不同,你可能实际上需要使用 excel 或者构建极其简单的产品。从小处着手,逐步构建更复杂的解决方案,这不是懒惰,而是聪明。
当人们向你询问仪表盘或对他们的数据进行想象时,你必须学会避开他们。从好的方面来看,即使在这种类型的任务中没有充分发挥你的潜力很烦人,但有时做一个简单的兼职项目也很有趣。
#6: 你不仅需要知道数据科学,还需要知道如何处理数据。你必须确保遵守合规和 GDPR 规则。
客户会询问他们听到的最新消息(他们在《连线》杂志上读到的闪亮的新算法或新的可解释工具),即使它与你正在做的项目无关。大多数情况下,解释情况是你的责任。
#8: 你不会真的去开发算法。那些已经为你做好了,包装好了,送来了。这当然有助于了解一切是如何工作的,但你与算法本身的关系可能只包括调整它们的参数。
#9: 你必须解释机器学习/数据科学/人工智能在项目之前、期间和之后能够或不能实现什么。
#10: 接收到一条数据后,你无法躲在你的电脑里。理解问题的领域是数据科学项目最重要的部分之一。你将不得不学习很多关于“收集数据的东西”是如何工作的。
你必须让商业利益相关者相信你的解决方案的价值。即使我们生活在一个对数据和人工智能大肆宣传的世界,仍然需要努力让每个人都参与进来。尤其是当你正在改变公司的做事方式时。
#12: 你还必须让你的业务涉众理解你的解决方案的不确定性。机器学习解决方案不将结果基于物理规则。结果基于数据中的模式。对于习惯于听到“猫”、“狗”或“兔子”而不是“概率为 0.879 的狗”的利益相关者来说,这个事实有时很难理解。
如果你在网上阅读 Quora 关于“成为数据科学家的现实”问题的答案,你可能会从其他人那里看到类似或甚至更糟糕的轶事。然而,这些事实不应该阻止你从事数据科学的职业。
如果你问我,这些小“副作用”是让我保持警觉的东西,让我觉得更有趣。我喜欢数据不是每次都非常干净。清理的过程帮助我更好地理解数据,它帮助我了解了一些我以前没有意识到的事情。我也喜欢研究不同的领域。我的工作性质要求我了解不同的行业,不管我认为自己对某个行业有多不感兴趣,我总能学到令我着迷的东西。
我想让你做的就是了解从数据科学家的职位上可以期待什么。你可能不会从工作的第一天开始就活在梦想中。但是只要你享受你正在做的事情,足以应对这些副作用,你就会没事。
👉对数据科学领域以及如何开始学习感到困惑? 免费参加数据科学入门迷你课程 !
掌握 Python 词典的 12 个例子
学习词典的综合实用指南
数据结构是任何编程语言的关键部分。为了创建健壮且性能良好的产品,人们必须非常了解数据结构。
在这篇文章中,我们将研究 Python 编程语言的一个重要数据结构,那就是字典。
Dictionary 是一个无序的键值对集合。每个条目都有一个键和值。字典可以被认为是一个有特殊索引的列表。
这些键必须是唯一且不可变的。所以我们可以使用字符串、数字(int 或 float)或元组作为键。值可以是任何类型。
考虑这样一种情况,我们需要存储学生的成绩。我们可以将它们存储在字典或列表中。
(图片由作者提供)
使用字典,我们可以通过提供学生的姓名(答案)来访问每个学生的成绩。另一方面,为了能够访问特定学生的成绩,我们需要一个额外的列表。
新列表包含学生的姓名,并且与成绩列表具有完全相同的顺序。
(图片由作者提供)
因此,对于这种情况,字典比列表更好。
在这个简短的介绍之后,让我们从例子开始深入字典。这些例子将涵盖字典的特性以及对它们进行操作的功能和方法。
1.创建字典
我们可以通过在花括号之间提供 0 个或更多的键值对来创建一个字典。
empty_dict = {}grades = {'John':'A', 'Emily':'A+', 'Betty':'B', 'Mike':'C', 'Ashley':'A'}grades
{'Ashley': 'A', 'Betty': 'B', 'Emily': 'A+', 'John': 'A', 'Mike': 'C'}
2.访问值
我们通过提供索引来访问列表中的值。类似地,在字典中,通过使用键来访问值。
grades['John']
'A'grades.get('Betty')
'B'
3.所有值和/或所有键
keys 方法用于获取所有的密钥。
grades.keys()dict_keys(['John', 'Emily', 'Betty', 'Mike', 'Ashley'])
返回对象是一个可迭代的 dict_keys 对象。因此,我们可以在 for 循环中迭代它。
同样,values 方法返回所有值。
grades.values()dict_values(['A', 'A+', 'B', 'C', 'A'])
我们不能对 dict_keys 或 dict_values 进行索引,但是我们可以将它们转换成一个列表,然后使用索引。
list(grades.values())[0]
'A'
items 方法返回元组中的键值对。
grades.items()dict_items([('John', 'A'), ('Emily', 'A+'), ('Betty', 'B'), ('Mike', 'C'), ('Ashley', 'A')])
4.更新或添加项目
字典是可变的,所以我们可以更新、添加或删除条目。更新或添加项目的语法是相同的。如果字典中存在给定的键,则更新现有项的值。否则,将创建一个新项目(即键值对)。
grades['Edward'] = 'B+'
grades['John'] = 'B'grades
{'Ashley': 'A',
'Betty': 'B',
'Edward': 'B+',
'Emily': 'A+',
'John': 'B',
'Mike': 'C'}
5.用新字典更新
我们还可以将字典传递给更新函数。该词典将根据新词典中的项目进行更新。用一个例子会更清楚。
考虑以下年级和年级 _ 新词典:
grades = {'John':'A', 'Emily':'A+', 'Betty':'B', 'Mike':'C'}
grades_new = {'John':'B', 'Sam':'A', 'Betty':'A'}
如果我们基于 grades_new 更新成绩,John 和 Betty 的值也将被更新。此外,一个新的项目(‘山姆’:’ A ')将被添加。
grades.update(grades_new)grades
{'Betty': 'A', 'Emily': 'A+', 'John': 'B', 'Mike': 'C', 'Sam': 'A'}
6.删除项目
我们可以使用 del 或 pop 函数来删除一个项目。我们只是传递要删除的条目的键。
del(grades['Edward'])grades.pop('Ashley')
'A'grades
'Betty': 'B', 'Emily': 'A+', 'John': 'B', 'Mike': 'C'}
与 del 函数不同,pop 函数返回被删除项的值。因此,我们可以选择将它赋给一个变量。
7.可重复的字典
我们可以迭代字典。默认情况下,迭代是基于键的。
for i in grades:
print(i)John
Emily
Betty
Mike
我们还可以迭代值(grades.values())或键值对(grades.items())。
8.词典理解
它类似于列表理解。词典理解是一种基于可重复项创建词典的方法。
{x: x**2 for x in range(5)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}{word: len(word) for word in ['data','science','is','awesome']}
{'awesome': 7, 'data': 4, 'is': 2, 'science': 7}
iterable 中的元素成为字典的键。这些值是基于字典理解中的赋值来确定的。
9.从列表列表中创建字典
我们可以使用列表或元组列表来创建字典。
a = [['A',4], ['B',5], ['C',11]]dict(a)
{'A': 4, 'B': 5, 'C': 11}b = [('A',4), ('B',5), ('C',11)]dict(b)
{'A': 4, 'B': 5, 'C': 11}
10.从字典到数据框架
Pandas 的 dataframe 函数可用于使用字典创建数据帧。键成为列名,值成为行。
到目前为止,我们已经用值是字符串的字典做了例子。然而,字典中的值可以是任何类型,比如列表、numpy 数组、其他字典等等。
在从字典创建数据帧的情况下,值由数组组成(例如 list、numpy 数组)。
import numpy as np
import pandas as pddict_a = {'names':['Amber','John','Edward','Emily'],
'points':np.random.randint(100, size=4)}df = pd.DataFrame(dict_a)
df
11.清澈透亮
len 函数返回字典中条目的数量(即长度)。clear 方法用于删除字典中的所有条目,因此我们将得到一个空字典。
len(grades)
4grades.clear()len(grades)
0
12.抄写字典
grades = {'John':'A', 'Emily':'A+', 'Betty':'B'}dict1 = gradesdict2 = grades.copy()dict3 = dict(grades)
所有 dict1、dict2 和 dict3 都包含与 grades 完全相同的键值对。然而,dict1 只是一个指向等级中的键值对的指针。因此,成绩的任何变化也会改变字典 1。
Dict2 和 dict3 在内存中是独立的对象,因此它们不会受到成绩变化的影响。
创建于 pythontutor (图片由作者提供)
我们需要特别注意如何抄写字典。
额外收获:使用 Python 3.9 合并和更新操作符
Python 3.9 为字典提供了 merge(“|”)和 update(“| =”)操作符。我还没有安装 Python 3.9,所以我将使用来自 python 文档的例子:
>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}
>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>> y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}
字典是 Python 中非常重要的数据结构,在很多情况下都会用到。我们在这篇文章中所举的例子将涵盖你需要了解的关于字典的大部分内容。它们会让你在使用字典时感到舒适。
然而,当然还有更多。就像任何其他科目一样,熟能生巧,你会在不断练习中掌握。
感谢您的阅读。如果您有任何反馈,请告诉我。
仪表板的 12 条不太明显的规则
开始可视化之旅时的常见陷阱
挪威厄斯峡湾。作者照片。
既然您已经找到了这里的方法,那么您可能是一名试图理解您的数据以传递信息的分析师,或者是一名试图帮助分析师实现这一目标的设计师/开发人员。我主要在后一个联盟中工作,所以我日常工作的一部分包括让商业用户能够通过数据自助服务他们的决策过程。在这里,我将分享一些对业务分析师有用的精选技巧(我在许多项目中反复看到这些东西)。开发者社区应该也非常好。不过,DataViz 的人在这里可能看不到太多新东西。
你可能已经读过关于数据可视化的最重要和最通用的建议,比如:一个观众、一个目的、一个故事、区域和一个流程。我们将在这里跳过它。如果你想冒险,请查阅一些组织良好的快速阅读材料来开始你的冒险之旅:
所以。你已经得到了数据,你理解了它你准备好上场了。让我们记住几个核心思想:
- 可视化是关于形状的。数字对人脑来说是不自然的。我们生来就没有数字、数字和数学的概念。然而,我们有一个预先训练好的神经网络来进行形状识别。
- 少即是多。如果你能用更少的形状和顶点来展示一些东西,那就去做吧。视觉障碍减缓了感知。最重要的是,有些模式会触发你的潜意识背景威胁分析,应该避免。
条形图和折线图
1.簇状条形图最擅长创造一种令人不安的斑马效果。使用条形图+折线图或折线图/面积图,可以用较少的形状和顶点来传达相同的信息。
聚类图(左上角)具有最高的视觉复杂度(形状和顶点的数量)。面积图(右下角)的视觉复杂度最低。
2.永远不要用堆积图来表示不能自然总结的事物。
典型的错误是将“总计”(即收入)或“小计”包括在你累加的东西中。第二个最常见的错误——累加平均值(平均值不能相加!).
3.避免自然总结的事物的未堆叠图表(除非你知道你在做什么)
除非你想比较上例中城市之间的数字,否则你应该累加。即使你想比较城市之间的数据,那也是骗人的,因为一个城市市场份额的减少并不意味着这个城市的表现不好。只能说明另一个城市表现更好。
4.避免长尾条形图(以及随之而来的未使用的空白空间)。使用树形图或“Top N 条形图可能会更好。
长尾不仅带来大量的空白空间;它们还造成了一种错误的印象,即前 10 根棒线很重要(而在上面的例子中,它们总共只占总量的 12%,88%的交易量来自小棒线)。
好了,今天的条形图已经足够了;让我们继续我们的下一个最爱…
饼图
让我们重复一下:饼图的分析值(您无法直观地感知“这个切片”比“那个切片”大多少,因此您最终会检查每个有问题的切片的数字,并手动计算)。
除了其他问题,香草饼图往往有尖锐的边缘靠近中心。圆环图看起来更轻,内部有一个数字空间。
5.这伴随着一个“但是”:作为哺乳动物,我们在出生时就锁定了圆形,所以当我们看到圆形时,它自然会吸引我们。使用甜甜圈图来美化事物,并把注意力吸引到最重要的数字上。我们不想要一个全条形图的无聊仪表盘,对吧?
轴线
6.条形图更适合于分类轴。对于时间线,折线图效果更好。
然而,这不是一个规则。如果你打算用时间作为交叉过滤器,条形图会更有意义(因为条形图更容易点击)。反之亦然,如果你的条形图有太多的条,你可以通过切换到面积图来释放视觉压力。
7.如果您必须有多个时间线图表,请将它们叠放在一起,使它们的轴对齐。
也尽量有相同的时间框架。
8.确实有秤。它们可以让您避免在每个数据点显示太多值的混乱。
你的观众可能以前看过图表。有些人见过很多。他们的大脑被训练通过在特定的地方寻找特定的元素来阅读图表。缺少轴线会破坏这种阅读过程,引起烦恼。
颜色;色彩;色调
9.简单。图表中的相同事物使用相同的颜色。
你也可以用浅色表示计划(没有发生的事情),纯色表示事实(发生的事情)。
过滤
10.如今,大多数工具都带有可折叠的过滤板。使用它,而不是消耗仪表板的宝贵空间。
我们都不喜欢躲不开的讨厌广告。那么为什么我们喜欢全屏消费内容时无法隐藏的切片器呢?
文本、数字和表格
11.理想情况下,这些不应该太多。如果已经在其他地方显示了页面标题或数据日期,则不需要在报告中重复它(除非您试图创建一个可打印的报告,在这种情况下:为什么呢?).
可视化应该是不言自明的。如果没有,可能即使是文本也无济于事。
12.真的需要那么多裸号吗?都是关于形状的,记得吗?
如果数字在图表中非常明显,就没有必要把它复制成文本。在多个地方显示相同的数字会使人困惑并浪费空间。
额外收获:统计技巧
与简单平均值不同,中位数可以抵抗异常值和偏态。
在真实的数据中,你会不时地遇到偏差很大的值,它们会极大地影响平均值。这就是为什么我们使用中值收入/价格/持续时间,而不是平均值。
分布形状告诉你的不仅仅是简单的平均值/最小值/最大值。看起来也很花哨。
在你的生活中,比你想象的更多的时候,你会对非一般事物感兴趣。
对数标度适用于指数。如果你需要操纵你的观众做些什么,他们也是一个很好的工具。
“我们的销售额在 4 月份有所下降,但我们预计会很快恢复,现在完全不会打包我们的东西”。很酷很正常!
你猜对了。请不要这样做。
还有…奖金奖金!从这个故事开始,还有更多吸引人的角色:
干杯!
12 种主要的退出方法:DNNs、CNN 和 RNNs 的数学和视觉解释
深入研究用于正则化、蒙特卡罗不确定性和模型压缩的 DNNs、CNN 和 RNNs 丢弃方法
动机
在**(深度)机器学习中训练模型的重大挑战之一就是协同改编**。这意味着神经元非常依赖彼此。它们在很大程度上相互影响,并且在输入方面不够独立。同样常见的情况是,一些神经元具有比其他神经元更显著的预测能力。换句话说,我们的输出过度依赖于一个神经元。
这些影响必须避免并且重量必须分配给以防止过度配合。一些神经元的共同适应性和高预测能力可以用不同的正则化方法来调节。最常用的一种是辍学。然而,辍学方法的全部能力很少被使用。
根据是 DNN ,还是 CNN 还是 RNN ,可以采用不同的退出方式。实际操作中,我们只用一个(或者差不多)。我认为这是一个可怕的陷阱。所以在这篇文章中,我们将从数学上和视觉上深入到辍学者的世界中去理解:
- 标准辍学方法
- 标准辍学的变体
- 应用于 CNN 的退出方法
- 应用于 RNNs 的退出方法
- 其他压差应用(蒙特卡罗和压缩)
(不好意思停不下来,所以是 12 法多一点…😄)
记号
标准辍学
最广为人知和使用的退出方法是 Hinton 等人在 2012 年推出的标准退出**【1】…通常简称为“辍学”,出于显而易见的原因,在本文中我们将称之为标准辍学。**
p=0.5 时的辍学
为了防止过拟合在训练阶段,神经元被随机省略。在密集(或全连接)网络中引入,对于每一层我们给出了丢失的概率p
。在每次迭代中,每个神经元都有被忽略的概率p
。Hinton 等人的论文推荐了输入层上的丢失概率p=0.2
和隐藏层上的概率p=0.5
。显然,我们对输出层感兴趣,这是我们的预测。因此,我们不在输出层应用辍学。
在数学上,我们说每个神经元的遗漏概率遵循一个伯努利概率分布p
。因此,我们在神经元(层)的向量与掩码之间进行元素方式的乘法,其中每个元素都是遵循伯努利分布的随机变量。
在测试(或推断)阶段,没有没有脱落。所有的神经元都是活跃的。为了补偿与训练阶段相比的额外信息,我们根据出现的概率进行加权。所以一个神经元不被忽略的概率。是1-p
。
下拉连接
也许你已经熟悉了标准的辍学方法。但是有很多变化。要调整密集网络的前向传递,您可以对神经元应用下降。L. Wan 等人介绍的drop connect【2】不是而是直接在神经元上施加压降,而是在连接这些神经元的权重和偏置上施加压降。
p=0.5 时的辍学
因此,我们发现了与标准辍学方法相同的机制。除了掩模(其元素是遵循分布的随机变量)不是应用于神经元 向量 而是应用于将该层连接到前一层的权重矩阵。
对于测试阶段,可以使用与标准退出方法相同的逻辑。我们可以乘以出现的概率。但这不是 L. Wan 等人提出的方法。这很有趣,因为他们提出了一种即使在测试阶段也能通过应用 DropConnect 的高斯近似来处理 dropout】的随机方法。然后通过从该高斯表示中随机抽取样本。我们将在突出部分之后回到高斯近似。
杰出的人
L. J. Ba 和 B. Frey 介绍的脱颖而出【3】作为一种标准的脱颖而出方法,是基于一个伯努利面具(我会根据这些面具所遵循的分布来称呼它们,这样会更简单)。不同之处在于,在层上,省略神经元的概率p
是而不是常数。根据重量的值自适应**。**
这可以用于任何g
激活函数,甚至可以是一个单独的神经网络。同样,对于Ws
,它可以是W
的函数。然后对于测试阶段,我们通过出现的概率来平衡。
例子
有点晦涩,举个例子吧。在他们的论文中,他们表明在实践中信任网络权重可以近似为权重的仿射函数。又比如我会把乙状结肠的绝对值作为激活函数**。**
与突出示例相比,p=0.5 时的标准压差
因此,我们可以看到权重越大,神经元被忽略的概率就越大。这有力地限制了某些神经元可能具有的高预测能力。
高斯漏失
应用于神经网络的退出方法的列表继续增长。因此,在继续讨论 DNNs 之外的其他内容之前,我想谈谈一类辍学方法,这无疑是最令人着迷的。
仅举几个例子,快速辍学【4】,变化辍学【5】或具体辍学【6】是从贝叶斯角度解释辍学的方法。具体地说,我们有一个掩码,其元素是遵循高斯分布 ( 正态分布)的随机变量,而不是伯努利掩码。这里不赘述大数定律的论证,那不是重点。所以我们试着直观的理解一下这个。****
p=0.5 时的辍学
论文[4]、[5]和[6]表明我们可以用正态定律 T20 为我们的辍学者模拟 T17 伯努利面具 T18。但这有什么区别。万物与虚无同时存在。由于共同适应和/或我们神经元的预测能力,它不会改变任何关于这些方法与过度拟合的相关性的事情。但是与之前介绍的方法相比,它改变了训练阶段所需的执行时间。****
从逻辑上讲,通过在每次迭代中省略掉丢失的神经元,那些在迭代中被省略的神经元在反向传播期间不被更新。他们不存在。所以训练阶段是放慢了**。另一方面,通过使用高斯丢弃方法,所有神经元在每次迭代和每个训练样本中暴露。这样就避免了减速。**
在数学上,存在与高斯掩码的乘法(例如以 1 为中心,具有伯努利定律标准偏差p(1-p)
)。这个通过在每次迭代中保持所有神经元活动来随机加权它们的预测能力来模拟退出。这种方法的另一个实际优势集中在 1:在测试阶段,与没有脱落的模型相比,不需要进行修改。
集体辍学
本文的“难”理解部分结束了。保留更多的直观的部分给我们更好的性能**。**
图像或特征图的问题是像素非常依赖于它们的邻居。简而言之,在一张猫的图片上,如果你取一个对应于它皮毛的像素,那么所有相邻的像素都将对应于同一皮毛。几乎没有或者没有区别。
所以我们理解标准辍学方法的极限**。我们甚至可以说它是低效的,它带来的唯一改变是额外的计算时间。如果我们随机忽略图像上的像素,那么几乎没有信息被删除。省略的像素与其周围的像素几乎相同。表示性能差防止过拟合。**
为什么不利用适当的并且经常在CNN中使用的层。例如最大池层**。对于那些不知道的人:最大池层是一张图片上传递的过滤器或(特征图)选择重叠区域的最大激活。**
Max-Pooling Dropout【7】是 H. Wu 和 X. Gu 提出的一种应用于细胞神经网络的退出方法。在执行池化操作之前,它将伯努利遮罩直接应用于最大池化层内核。直觉上,这使得高活化剂的聚集最小化。限制某些神经元沉重的预测能力是一个非常好的观点。在测试阶段,您可以像前面的方法一样,根据出现的概率进行加权。****
最大池层已被作为一个例子,但同样可以用其他池层来完成。例如,对于平均池层**,我们可以在培训阶段以同样的方式应用退出。然后在测试阶段,将不会有变化,因为它已经是一个加权平均。**
空间缺失
对于 CNN,我们可以利用池层。但是,我们也可以通过遵循 J. Tompson 等人提出的空间丢失**【8】方法来变得更聪明。他们建议克服经典丢失方法的问题,因为相邻像素与高度相关。**
我们可以考虑对每个特征映射应用一个丢弃,而不是随机地对像素应用一个丢弃。如果我们以我们的猫为例,那么这就像从图像中移除红色,并迫使它对图像的蓝色和绿色进行概括。然后,在下一次迭代中随机丢弃其他特征图。
我不知道如何恰当地用数学来表达,使它变得易懂。但是如果你理解了前面的方法,你就不会有任何问题了。在训练阶段,按照具有遗漏概率p
的特征图应用伯努利掩码****。然后,在测试阶段,没有丢失,而是通过出现概率1-p
对进行加权。****
断流器
让我们深入我们的方法,以克服相邻像素高度相关的事实。代替对每个特征图应用伯努利掩模,它们可以在区域中应用。这就是 T. DeVries 和 G. W. Taylor 提出的剪切方法【9】。****
通过最后一次以我们的猫图像为例:这种方法可以通过隐藏图像的区域来进行归纳,从而限制过度拟合。我们最终得到猫的头垂下的图像。这迫使 CNN 去识别描述一只猫的不太明显的属性。
这一节也没有数学。这种方法在很大程度上取决于我们的想象力:正方形区域、长方形、圆形、所有的特征地图、一次一个或者可能几个……这由你决定**。😃**
最大落差
最后,在结束关于 CNN 的这一节之前,我必须指出,显然可以将几种方法结合起来**。当我们知道不同的方法时,这就是让我们强大的原因:我们可以同时利用它们的好处。这就是 S. Park 和 N. Kwak 提出的他们的最大落差方法【10】。**
这种方法在某种程度上是池丢失和高斯丢失的混合。在最大池层上执行退出,但是使用贝叶斯方法**。**
在他们的论文中,他们展示了这种方法给出的结果与一样有效与空间丢失一样。此外,在每次迭代中,所有神经元都保持激活,这限制了训练阶段的减速**。
这些结果是在= 0.02 和σ = 0.05 时获得的。**
RNNDrop
****
嗯,我们已经看到了 DNNs 和 CNN 的一些退出方法。该研究还试图找出哪些方法对循环神经网络 (RNNs)有效。他们通常依赖于 LSTMs,所以我将采用 RNNs 的这种特殊情况。它将推广到其他 rnn。
问题很简单:对 RNN 申请退学是危险的。从这个意义上来说,RNN 的目的是保持对事件的长期记忆**。但是传统的辍学方法效率不高,因为它们会产生噪音,阻止这些模型保持长期记忆。将要介绍的方法允许长期保存这种记忆。**
****
T. Moon 等人提出的RNNDrop**【11】是最简单的方法。一个伯努利掩码仅应用于隐藏的单元状态。但是这个屏蔽从序列到另一个保持相同。这被称为丢失的每序列采样。这仅仅意味着在每次迭代中,我们创建一个随机掩码。然后从一个序列到另一个序列,该屏蔽保持不变**。因此被丢弃的元素保持被丢弃,而当前的元素保持存在。所有的序列都是这样。****
经常辍学
****
S. Semeniuta 等人提出的复发性辍学**【12】是一个有趣的变体。单元状态保持不变。下降仅适用于更新单元状态的部分。所以在每次迭代中,伯努利掩模使得一些元素不再对长期记忆有贡献。但是内存没有改变**。****
变化的 RNN 辍学
****
最后,Y. Gal 和 Z. Ghahramani 介绍的 RNN 丢弃【13】是在内部门之前应用基于序列的丢弃。这导致 LSTM 的不同点上的信号丢失。
打开我们的思维
仍然有许多不同的辍学方法,但是我们将在这里停止这篇文章。完成它,我发现知道辍学方法不仅仅是正规化方法非常有趣。
蒙特卡洛辍学
退出方法还可以提供模型不确定性的指标**。让我解释一下。对于相同的输入,经历退出的模型将在每次迭代中拥有不同的架构。这导致输出中的差异。如果网络相当一般化并且如果共同适应受限,则预测分布在整个模型中。这导致在具有相同输入的每次迭代中输出的较低的方差。研究这个方差可以给出分配给模型的置信度的概念。这可以从 Y. Gal 和 Z. Ghahramani 的方法中看出[14]。**
模型压缩
最后直观的**,通过随机应用漏失,我们可以看到给定神经元甚至层的效率或无效率进行预测。根据这一观察,我们可以通过减少参数数量来压缩模型,同时将性能下降最小化。K. Neklyudov 等人[15]已经提出了这样一种方法,该方法使用变分丢失来修剪 DNNs 和 CNN。**
知识就是分享。
支持我,一键获得访问 中我所有文章的。****
来源和参考
[1] G. E. Hinton,N. Srivastava,A. Krizhevsky,I. Sutskever 和 R. R. Salakhutdinov,通过防止特征检测器的共同适应来改进神经网络
[2] L. Wan,m .,S. Zhang,Y. LeCun 和 R. Fergus,使用 dropconnect 调整神经网络
[3] L. J. Ba 和 B. Frey,用于训练深度神经网络的自适应退出
[4] S .王和 c .曼宁,快速辍学训练
[5] D. P .金玛、t .萨利曼斯和 m .韦林,变分退出和局部重新参数化技巧
[6] Y. Gal,J. Hron,A. Kendall,混凝土脱落
[7] H. Wu 和 X. Gu,卷积神经网络的丢失训练
[8] J. Tompson、R. Goroshin、A. Jain、Y. LeCun 和 C. Bregler,使用卷积网络的有效目标定位
[9] T. DeVries 和 G. W. Taylor,改进了截断卷积神经网络的正则化
[10] S. Park 和 N. Kwak,卷积神经网络中的丢包效应分析
[11] T. Moon,H. Choi,H. Lee 和 I. Song, Rnndrop
[12]s . semen uita,A. Severyn 和 E. Barth,无记忆丧失的经常性辍学
[13] Y. Gal 和 Z. Ghahramani,递归神经网络中辍学的理论基础应用
[14] Y. Gal 和 Z. Ghahramani,辍学作为贝叶斯近似:表示深度学习中的模型不确定性
[15] K. Neklyudov、D. Molchanov、A. Ashukha 和 D. P. Vetrov,通过对数正态乘法噪声进行结构化贝叶斯修剪
[16] A. Labach,H. Salehinejad,深度神经网络退出方法调查
所有图片和 gif 都是自制的,可以免费使用
你应该阅读的 12 篇论文,以了解深度学习时代的对象检测
免费图片来自 Unsplash 。摄影来自乔安娜·科辛斯卡,并由本人编辑。
序
作为“您应该阅读的论文”系列的第二篇文章,我们将回顾计算机视觉研究中一个更困难的领域:对象检测的历史和一些最近的发展。在深度学习时代之前,像 HOG 和特征金字塔这样的手工制作的特征被普遍用于捕捉图像中的定位信号。然而,这些方法通常不能很好地扩展到一般的目标检测,因此大多数应用仅限于人脸或行人检测。借助深度学习的力量,我们可以训练网络来学习捕捉哪些特征,以及预测对象的坐标。这最终导致了基于视觉感知的应用的繁荣,如商用人脸识别系统和自动驾驶汽车。在这篇文章中,我为想学习物体检测的新人挑选了 12 篇必读论文。尽管构建对象检测系统最具挑战性的部分隐藏在实现细节中,但是阅读这些论文仍然可以让您很好地从高层次理解这些想法的来源,以及对象检测在未来将如何发展。
作为阅读本文的先决条件,您需要了解卷积神经网络的基本思想和常用的优化方法,如带反向传播的梯度下降。也强烈推荐阅读我之前的文章《你应该阅读的 10 篇论文了解深度学习时代的图像分类》首先是因为很多很酷的物体检测想法都源于一个更基础的图像分类研究。
2013 年:暴饮暴食
OverFeat:使用卷积网络的综合识别、定位和检测
出自“《over fat:利用卷积网络的综合识别、定位和检测》”
受 AlexNet 在 2012 年 ImageNet 比赛中的早期成功的启发,基于 CNN 的特征提取击败了所有手工制作的特征提取器,OverFeat 很快将 CNN 引入了对象检测领域。这个想法非常直接:如果我们可以使用 CNN 对一幅图像进行分类,那么用不同大小的窗口贪婪地滚动整个图像,并尝试使用 CNN 对它们逐一进行回归和分类,怎么样?这利用了 CNN 用于特征提取和分类的能力,并且还通过预定义的滑动窗口绕过了硬区域提议问题。此外,由于附近的卷积核可以共享部分计算结果,因此没有必要为重叠区域计算卷积,从而大大降低了成本。OverFeat 是一级物体探测器的先驱。它试图在同一个 CNN 中结合特征提取、位置回归和区域分类。不幸的是,由于使用的先验知识较少,这种一步方法的准确性相对较差。因此,OverFeat 未能引领一阶段探测器研究的热潮,直到两年后一个更优雅的解决方案问世。
2013 年:美国有线电视新闻网
用于精确目标检测和分割的基于区域的卷积网络
同样是 2013 年提出的,R-CNN 和 OverFeat 相比有点晚。然而,这种基于区域的方法最终以其两阶段框架,即区域提议阶段和区域分类和细化阶段,导致了一波大的对象检测研究。
在上图中,R-CNN 首先使用一种称为选择性搜索的技术从输入图像中提取潜在的感兴趣区域。选择性搜索并不真正试图理解前景对象,相反,它通过依赖一种启发式方法对相似的像素进行分组:相似的像素通常属于同一对象。所以选择性搜索的结果有非常高的概率包含有意义的东西。接下来,R-CNN 将这些区域提议扭曲成具有一些填充的固定大小的图像,并将这些图像馈送到网络的第二级,以进行更细粒度的识别。与那些使用选择性搜索的旧方法不同,R-CNN 在第二阶段用 CNN 代替 HOG 来从所有区域提议中提取特征。这种方法的一个警告是,许多地区提案并不是真正的完整对象,因此 R-CNN 不仅需要学会对正确的类别进行分类,还需要学会拒绝负面的类别。为解决这一问题,R-CNN 将所有 IoU 重叠≥ 0.5 的地区提案视为积极提案,其余视为消极提案。
来自选择性搜索的区域提议高度依赖于相似性假设,因此它只能提供位置的粗略估计。为了进一步提高定位精度,R-CNN 借鉴了“用于对象检测的深度神经网络”(又名 DetectorNet)的思想,引入了额外的包围盒回归来预测盒子的中心坐标、宽度和高度。这种回归器广泛应用于未来的目标探测器中。
然而,像 R-CNN 这样的两级检测器有两个大问题:1)它不是完全卷积的,因为选择性搜索不是 E2E 可训练的。2)与其它单阶段检测器(如 OverFeat)相比,区域建议阶段通常非常慢,并且单独运行每个区域建议会使其更慢。稍后,我们将看到 R-CNN 如何随着时间的推移发展来解决这两个问题。
2015:快速 R-CNN
快速 R-CNN
来自"快速 R-CNN "
R-CNN 的快速跟进是减少多个区域提议上的重复卷积。由于这些区域提议都来自一幅图像,自然要通过在整个图像上运行一次 CNN 来改进 R-CNN,并在许多区域提议之间共享计算。然而,不同的区域提议具有不同的大小,如果我们使用相同的 CNN 特征提取器,这也导致不同的输出特征图大小。这些具有不同大小的要素地图将阻止我们使用完全连接的图层进行进一步分类和回归,因为 FC 图层仅适用于固定大小的输入。
幸运的是,一篇名为“用于视觉识别的深度卷积网络中的空间金字塔池”的论文已经解决了 FC 层的动态规模问题。在 SPPNet 中,在卷积层和 FC 层之间引入了特征金字塔池,以创建特征向量的词袋样式。该矢量具有固定的大小,并对不同尺度的特征进行编码,因此我们的卷积层现在可以将任何大小的图像作为输入,而不用担心 FC 层的不兼容性。受此启发,Fast R-CNN 提出了一个类似的层,称为 ROI Pooling 层。该池图层将不同大小的要素地图缩减采样为固定大小的矢量。通过这样做,我们现在可以使用相同的 FC 层进行分类和盒回归,无论 ROI 是大是小。
通过共享特征提取器和比例不变 ROI 池层,快速 R-CNN 可以达到类似的定位精度,但训练速度快 10 ~ 20 倍,推理速度快 100 ~ 200 倍。接近实时的推理和用于检测部分的更简单的 E2E 训练协议使得快速 R-CNN 也成为业内的流行选择。
这种对整个图像的密集预测会导致计算成本方面的问题,所以 YOLO 从 GooLeNet 中提取了瓶颈结构来避免这个问题。YOLO 的另一个问题是,两个对象可能会落入同一个粗网格单元中,因此它不能很好地处理像一群鸟这样的小对象。尽管精确度较低,但 YOLO 的直接设计和实时推理能力使一阶段对象检测在研究中再次流行,也是行业的首选解决方案。
2015 年:更快的 R-CNN
更快的 R-CNN:用区域提议网络实现实时目标检测
正如我们在上面介绍的,在 2015 年初,Ross Girshick 通过对提议的区域使用共享特征提取器,提出了一种称为快速 R-CNN 的 R-CNN 的改进版本。仅仅几个月后,罗斯和他的团队再次带来了另一项改进。这个新的网络更快的 R-CNN 不仅比以前的版本更快,而且标志着用深度学习方法进行对象检测的里程碑。
对于快速 R-CNN,网络的唯一非卷积部分是选择性搜索区域提议。截至 2015 年,研究人员开始意识到深度神经网络是如此神奇,它可以学习任何给定足够数据的东西。那么,有没有可能也训练一个神经网络来建议区域,而不是依赖于启发式和手工制作的方法,如选择性搜索?更快的 R-CNN 遵循这一方向和思路,成功创建了地区提案网(RPN)。简单来说,RPN 就是一个 CNN,它以一个图像为输入,输出一组矩形的物体提议,每个提议都有一个客观分数。该报最初使用的是 VGG,但后来像 ResNet 这样的主干网变得更加普及。为了生成区域提议,在 CNN 特征地图输出上应用 3×3 滑动窗口,以生成每个位置的 2 个分数(前景和背景)和 4 个坐标。实际上,这个滑动窗口是用 3×3 卷积核和 1×1 卷积核实现的。
虽然滑动窗口有固定的大小,但我们的对象可能会以不同的比例出现。因此,更快的 R-CNN 引入了一种叫做锚箱的技术。锚定框是预先定义的具有不同纵横比和大小但共享相同中心位置的先前框。在更快的 R-CNN 中,每个滑动窗口位置有 k=9 个锚,每个锚覆盖 3 个比例的 3 个纵横比。这些在不同尺度上重复的锚盒给网络带来了良好的平移不变性和尺度不变性特征,同时共享相同特征图的输出。注意,边界框回归将从这些锚框而不是整个图像来计算。
到目前为止,我们讨论了新的区域提议网络来取代旧的选择性搜索区域提议。为了进行最终检测,Fast R-CNN 使用来自 Fast R-CNN 的相同检测头来进行分类和细粒度定位。还记得 Fast R-CNN 也是用共享的 CNN 特征提取器吗?现在 RPN 本身也是一个特征提取 CNN,我们可以像上图一样只和探测头分享。这种共享设计并没有带来一些麻烦。如果我们一起训练 RPN 和快速 R-CNN 检测器,我们会将 RPN 建议视为 ROI pooling 的恒定输入,并且不可避免地忽略 RPN 的包围盒建议的梯度。一次走动被称为交替训练,你轮流训练 RPN 和快速 R-CNN。在后来的一篇论文“通过多任务网络级联的实例感知语义分割”中,我们可以看到 ROI 池层也可以变得可区分。
2015 年:YOLO v1
您只需查看一次:统一的实时对象检测
虽然 R-CNN 系列在研究社区对两阶段对象检测进行了大肆宣传,但其复杂的实现给维护它的工程师带来了许多头痛。物体检测需要这么繁琐吗?如果我们愿意牺牲一点准确性,我们能换来更快的速度吗?带着这些问题,Joseph Redmon 在 fast R-CNN 提交后仅四天就向 arxiv.org 提交了一个名为 YOLO 的网络,并最终在 OverFeat 首次亮相两年后将人气带回了一阶段物体检测。
与 R-CNN 不同,YOLO 决定在同一个 CNN 中同时处理区域提议和区域分类。换句话说,它将对象检测视为回归问题,而不是依赖于区域建议的分类问题。总的想法是将输入分割成 SxS 网格,并且如果对象中心落入每个单元中,则让每个单元直接回归边界框位置和置信度得分。因为对象可能有不同的大小,每个单元将有多个边界框回归量。在训练过程中,具有最高 IOU 的回归变量将被分配与真实标签进行比较,因此同一位置的回归变量将随着时间的推移学习处理不同的尺度。同时,每个单元也将预测 C 类概率,条件是网格单元包含对象(高置信度得分)。这种方法后来被称为密集预测,因为 YOLO 试图预测图像中所有可能位置的类别和边界框。相比之下,R-CNN 依赖于区域提议来过滤掉背景区域,因此最终的预测要稀疏得多。
2015 年:固态硬盘
SSD:单次多盒探测器
YOLO v1 展示了一阶段检测的潜力,但两阶段检测的性能差距仍然明显。在 YOLO v1 中,多个对象可以被分配给同一个网格单元。当检测小物体时,这是一个巨大的挑战,并且为了将一级检测器的性能提高到与两级检测器相当,这成为一个需要解决的关键问题。SSD 就是这样一个挑战者,从三个角度攻击这个问题。
来自“ SSD:单次多盒探测器”**
首先,来自更快的 R-CNN 的锚箱技术可以缓解这个问题。同一区域中的对象通常具有不同的纵横比才可见。引入锚盒不仅增加了每个单元要检测的对象数量,还帮助网络更好地区分具有这种纵横比假设的重叠小对象。
来自 SSD:单次多盒探测器
SSD 通过在检测之前聚合多尺度特征,在这条路上走得更远。这是一种非常常见的方法,可以在 CNN 中提取细粒度的局部特征,同时保留粗略的全局特征。比如 CNN 语义分割的开创者 FCN,也从多个层面融合特征,细化分割边界。此外,多尺度特征聚合可以很容易地在所有常见的分类网络上执行,因此用另一个网络替换主干非常方便。
最后,SSD 利用了大量的数据增强,尤其是针对小对象的数据增强。例如,在随机裁剪之前,图像被随机扩展到大得多的尺寸,这给训练数据带来了缩小效果,以模拟小对象。此外,大包围盒通常很容易学习。为了避免这些简单的例子支配损失,SSD 采用了硬负挖掘技术来为每个锚盒挑选具有最高损失的例子。
2016 年:FPN
用于目标检测的特征金字塔网络
随着 fast-RCNN、YOLO 和 SSD 在 2015 年的推出,似乎一个物体探测器的总体结构已经确定。研究人员开始着眼于改善这些网络的各个部分。特征金字塔网络是通过使用来自不同层的特征形成特征金字塔来改进检测头的尝试。这种特征金字塔的想法在计算机视觉研究中并不新奇。当特征仍然是手动设计的时候,特征金字塔已经是识别不同尺度模式的非常有效的方法。在深度学习中使用特征金字塔也不是一个新想法:SSPNet、FCN 和 SSD 都证明了在分类前聚合多层特征的好处。然而,如何在 RPN 和基于区域的检测器之间共享特征金字塔仍有待确定。
首先,要使用如上图所示的 FPN 结构重建 RPN,我们需要一个在多个不同比例的要素输出上运行的区域方案。此外,我们现在每个位置只需要 3 个不同纵横比的锚点,因为不同大小的对象将由不同级别的特征金字塔处理。接下来,为了在快速 R-CNN 检测器中使用 FPN 结构,我们还需要对其进行调整,以在多个尺度的特征图上进行检测。由于区域提案也可能有不同的规模,我们也应该在 FPN 的相应级别使用它们。简而言之,如果更快的 R-CNN 是一对在一个尺度上运行的 RPN 和基于区域的检测器,FPN 将其转换为在不同尺度上运行的多个并行分支,并最终从所有分支收集最终结果。
2016 年:YOLO v2
更好、更快、更强
当明凯·何、罗斯·吉斯克和他们的团队不断改进他们的两级 R-CNN 探测器时,另一方面,约瑟夫·雷德蒙也在忙于改进他的一级 YOLO 探测器。最初版本的 YOLO 有许多缺点:基于粗网格的预测带来了较低的定位精度,每个网格单元两个比例不可知的回归器也使得识别小包装对象变得困难。幸运的是,我们在 2015 年在许多计算机视觉领域看到了太多伟大的创新。YOLO v2 只需要找到一种方法来整合它们,以变得更好、更快、更强。以下是修改的一些亮点:
- YOLO v2 从一篇名为“批处理规范化:通过减少内部协变量转移来加速深度网络训练”的论文中添加了批处理规范化层。
锚箱来自“ YOLO9000:更好、更快、更强
- 就像 SSD 一样,YOLO v2 也为边界框回归引入了更快的 R-CNN 的锚框思想。但是 YOLO v2 为它的锚盒做了一些定制。YOLOv2 不是预测锚定框的偏移,而是将对象中心回归 tx 和 ty 约束在负责的网格单元内,以稳定早期训练。此外,锚的大小由目标数据集的 K-means 聚类来确定,以更好地与对象形状对齐。
- 一种称为暗网的新型骨干网络用于特征提取。这是受“网络中的网络”和 GooLeNet 的瓶颈结构的启发。
- 为了提高对小物体的检测,YOLO v2 增加了一个穿透层来合并早期层的特征。这部分可以看做是 SSD 的简化版。
- 最后但同样重要的是,Joseph 意识到输入分辨率是小物体检测的银弹。它不仅将主干网的输入从 224x224 增加了一倍,达到 448x448,而且还发明了一种多尺度训练模式,在训练的不同阶段采用不同的输入分辨率。
请注意,YOLO v2 还试验了一个在 9000 类分层数据集上训练的版本,这也代表了在对象检测器中多标签分类的早期尝试。
2017 年:RetinaNet
密集物体探测的聚焦损失
为了理解为什么一级检测器通常不如两级检测器,RetinaNet 从一级检测器的密集预测中研究了前景-背景类别不平衡问题。以 YOLO 为例,它试图同时预测所有可能位置的类和包围盒,因此在训练期间大多数输出都与负类匹配。SSD 通过在线硬例挖掘解决了这个问题。在训练的早期阶段,YOLO 使用客观性分数来隐式地训练前景分类器。RetinaNet 认为他们都没有得到问题的关键,所以它发明了一个新的损失函数,称为焦点损失,以帮助网络了解什么是重要的。
从 到对密集物体进行焦损检测
焦点损失给交叉熵损失增加了一个幂γ(他们称之为聚焦参数)。自然地,随着置信度得分变得更高,损失值将变得比正常的交叉熵低得多。α参数用于平衡这种聚焦效果。
这个想法很简单,连一个小学生都能理解。因此,为了进一步证明他们的工作,他们修改了他们之前提出的 FPN 模型,并创造了一种新的一级探测器,称为 RetinaNet。它由一个 ResNet 主干,一个 FPN 检测颈以引导不同尺度的特征,以及两个用于分类和作为检测头的盒回归的子网组成。与 SSD 和 YOLO v3 类似,RetinaNet 使用锚盒来覆盖各种规模和纵横比的目标。
有点跑题了,RetinaNet 使用了 ResNeXT-101 和 800 输入分辨率变体的 COCO 精度来对比 YOLO v2,后者只有轻量级的 Darknet-19 主干和 448 输入分辨率。这种不真诚显示了团队对获得更好的基准测试结果的重视,而不是解决一个实际问题,如速度-精度的权衡。这可能是 RetinaNet 在发布后没有起飞的部分原因。
2018: YOLO v3
YOLOv3:增量改进
YOLO v3 是官方 YOLO 系列的最后一个版本。遵循 YOLO v2 的传统,YOLO v3 从以前的研究中借鉴了更多的想法,得到了一个像怪物一样令人难以置信的强大的一级探测器。YOLO v3 很好地平衡了速度、准确性和实现复杂性。由于速度快、组件简单,它在业界非常受欢迎。如果你感兴趣,我在之前的文章《深入了解 YOLO v3:初学者指南》中对 YOLO v3 的工作原理做了非常详细的解释。
来自“深入 YOLO v3:初学者指南”
来自“深入 YOLO v3:初学者指南”
简单地说,YOLO v3 的成功来自其更强大的骨干特征提取器和一个类似 RetinaNet 的 FPN 颈检测头。新的主干网络 Darknet-53 利用 ResNet 的 skip 连接实现了与 ResNet-50 相当但更快的精度。此外,YOLO v3 抛弃了 v2 的穿越层,完全接受了 FPN 的多尺度预测设计。自此,YOLO v3 终于扭转了人们对其处理小物件时性能不佳的印象。
此外,还有一些关于 YOLO v3 的有趣事实。它剖析了 COCO mAP 0.5:0.95 度量,并且还证明了当使用条件密集预测时焦点损失的无用性。作者约瑟夫甚至决定一年后退出整个计算机视觉研究,因为他担心军事用途。
2019:以物为点
尽管近年来图像分类领域变得不那么活跃,但目标检测的研究还远未成熟。2018 年,一篇名为“CornerNet:将物体检测为成对关键点”的论文为检测器训练提供了一个新的视角。既然准备锚箱目标是一件相当繁琐的工作,那么真的有必要用它作为先验吗?这种抛弃锚箱的新趋势被称为“无锚”物体检测。
受沙漏网络中热图用于人体姿态估计的启发,CornerNet 使用由盒角生成的热图来监督包围盒回归。要了解更多关于如何在沙漏网络中使用热图,你可以阅读我以前的文章“使用堆叠沙漏网络和张量流进行人体姿态估计”。
从 的物体为点
作为点的对象,又名 CenterNet,更进了一步。它使用热图峰值来表示对象中心,网络将直接从这些盒中心回归盒宽度和高度。本质上,CenterNet 使用每个像素作为网格单元。利用高斯分布热图,与先前试图直接回归边界框大小的尝试相比,训练也更容易收敛。
去除锚箱还有另一个有益的副作用。之前我们是靠主播框和地面真相框之间的 IOU(比如> 0.7)来分配训练目标的。通过这样做,几个相邻的锚可能都被分配了同一对象的正目标。网络也将学习预测同一物体的多个阳性框。解决这个问题的常用方法是使用一种称为非最大抑制(NMS)的技术。这是一种贪婪的算法,用来过滤掉靠得太近的盒子。现在锚点已经消失了,我们在热图中每个物体只有一个峰值,没有必要再使用 NMS 了。由于 NMS 有时难以实现且运行缓慢,所以对于在各种资源有限的环境中运行的应用程序来说,摆脱 NMS 是一个很大的好处。
2019 年:效率检测
EfficientDet:可扩展且高效的对象检测
出自"【Efficient det:可扩展且高效的对象检测 "
在最近的 CVPR 20 中,EfficientDet 向我们展示了对象检测领域的一些更令人兴奋的进展。FPN 结构已被证明是提高不同尺度目标检测网络性能的有力技术。著名的检测网络,如 RetinaNet 和 YOLO v3,都在盒回归和分类之前采用了 FPN 颈。后来,NAS-FPN 和 PANet(请参阅阅读更多章节)都证明了一个普通的多层 FPN 结构可能受益于更多的设计优化。EfficientDet 继续在这个方向上探索,最终创造了一种叫做 BiFPN 的新颈。基本上,BiFPN 的特点是额外的跨层连接,以鼓励特性的来回聚合。为了证明网络的效率部分,这个 BiFPN 还从最初的 PANet 设计中删除了一些不太有用的连接。对 FPN 结构的另一个创新改进是权重特征融合。BiFPN 为特征聚合添加了额外的可学习权重,以便网络可以学习不同分支的重要性。
出自“【Efficient det:可扩展且高效的对象检测”
此外,就像我们在图像分类网络 EfficientNet 中看到的一样,EfficientDet 也引入了一种扩展对象检测网络的原则方法。上式中的φ参数控制 BiFPN 颈部和探测头的宽度(通道)和深度(层数)。
出自“:Efficient det:可扩展且高效的对象检测”
这个新参数导致从 D0 到 D7 的 8 个不同的 EfficientDet 变量。轻型 D0 变体可以实现与 YOLO v3 类似的精度,同时具有少得多的触发器。一个负载沉重的 D7 变体,具有可怕的 1536x1536 输入,在 COCO 上甚至可以达到 53.7 AP,让所有其他竞争者相形见绌。
阅读更多
从 R-CNN,YOLO 到最近的 CenterNet 和 EfficientDet,我们见证了深度学习时代对象检测研究的大多数重大创新。除了上面的论文,我还提供了一个附加论文的列表,供你继续阅读以获得更深入的理解。它们或者为目标检测提供了不同的视角,或者用更强大的功能扩展了这一领域。
2009 年:DPM
基于模型的有区别训练的物体检测
通过为每个可变形部分匹配许多 HOG 特征,DPM 是深度学习时代之前最有效的对象检测模型之一。以行人检测为例,它采用星型结构,先识别出一般的人模式,再用不同的子滤波器识别出部分,计算出一个总得分。即使在今天,在我们从 HOG 特征切换到 CNN 特征之后,识别具有可变形部分的物体的想法仍然很受欢迎。
2012 年:选择性搜索
目标识别的选择性搜索
和 DPM 一样,选择性搜索也不是深度学习时代的产物。然而,这种方法结合了许多经典的计算机视觉方法,也用于早期的 R-CNN 检测器。选择性搜索的核心思想受到语义分割的启发,语义分割是通过相似性对像素进行分组。选择性搜索使用不同的相似性标准,如颜色空间和基于 SIFT 的纹理,以迭代方式将相似区域合并在一起。并且这些合并的区域充当前景预测,随后是用于对象识别的 SVM 分类器。
2016 年:FCN
R-FCN:基于区域的全卷积网络的目标检测
更快的 R-CNN 最终将 RPN 和 ROI 特征提取结合起来,大大提高了速度。然而,对于每个区域建议,我们仍然需要完全连接的层来分别计算类和边界框。如果我们有 300 个 ROI,我们需要重复 300 次,这也是一级和两级检测器之间主要速度差异的来源。R-FCN 从 FCN 那里借鉴了语义分割的思想,但 R-FCN 计算的不是类别掩码,而是一个积极的敏感得分图。这个图会预测物体在每个位置出现的概率,所有位置会投票(平均)决定最终的类和包围盒。此外,R-FCN 还在其 ResNet 主干中使用了 atrous 卷积,这是最初在 DeepLab 语义分割网络中提出的。要了解什么是 atrous 卷积,请看我之前的文章《见证语义分割的进展:从 V1 到 V3+ 的 DeepLab 系列》。
2017:软-NMS
用一行代码改进对象检测
非最大值抑制(NMS)广泛用于基于锚点的对象检测网络,以减少附近的重复肯定建议。更具体地说,如果候选框具有更高的 IOU,NMS 迭代地消除候选框,并得到更有把握的候选框。当两个具有相同类的对象彼此非常接近时,这可能会导致一些意外的行为。软 NMS 做了一个小的改变,仅用一个参数缩小重叠候选框的置信度得分。当调整本地化性能时,这个缩放参数给我们更多的控制,并且当还需要高召回率时,也导致更好的精度。
2017:级联 R-CNN
级联 R-CNN:探索高质量目标检测
当 FPN 探索如何设计一个更好的 R-CNN 颈以使用骨干功能级联 R-CNN 时,调查了一个重新设计的 R-CNN 分类和回归头。潜在的假设简单而深刻:我们在准备阳性目标时使用的 IOU 标准越高,网络将学习做出的假阳性预测就越少。然而,我们不能简单地将这样的 IOU 阈值从常用的 0.5 提高到更积极的 0.7,因为这也可能导致培训期间出现更多压倒性的负面例子。级联 R-CNN 的解决方案是将多个探测头链接在一起,每个探测头将依赖于来自前一个探测头的包围盒提议。只有第一个检测头将使用原始的 RPN 建议。这有效地模拟了后面磁头的 IOU 阈值的增加。
2017:面具 R-CNN
屏蔽 R-CNN
Mask R-CNN 不是一个典型的对象检测网络。它旨在解决一个具有挑战性的实例分割任务,即,为场景中的每个对象创建一个遮罩。然而,Mask R-CNN 显示了对更快的 R-CNN 框架的巨大扩展,并且也反过来启发了对象检测研究。主要思想是在 ROI 合并之后添加二进制掩模预测分支,以及现有的边界框和分类分支。此外,为了解决原始 ROI 池层的量化误差,Mask R-CNN 还提出了一种新的 ROI Align 层,该层在遮光罩下使用双线性图像重采样。不出所料,多任务训练(分割+检测)和新的 ROI Align 层都有助于对边界框基准进行一些改进。
2018 年:帕内特
用于实例分割的路径聚合网络
实例分割与目标检测有着密切的关系,因此一个新的实例分割网络往往也能间接有利于目标检测的研究。PANet 旨在通过在原来的自上而下路径之后增加一个额外的自下而上路径来促进 R-CNN 面具 FPN 颈部的信息流。为了形象化这种变化,我们在原始的 FPN 颈中有一个↑↓结构,PANet 在汇集来自多个图层的要素之前使它更像一个↑↓结构。此外,PANet 没有为每个要素图层创建单独的池,而是在 Mask R-CNN 的 ROIAlign 之后添加了一个“自适应要素池”图层,以合并(基于元素的最大和)多尺度要素。
2019 年:NAS-FPN
NAS-FPN:学习对象检测的可扩展特征金字塔结构
PANet 在适应 FPN 结构方面的成功引起了一组 NAS 研究人员的注意。他们使用了来自图像分类网络 NASNet 的类似强化学习方法,并专注于搜索合并细胞的最佳组合。在这里,合并像元是将任意两个输入要素图层合并为一个输出要素图层的 FPN 的基本构建块。最终结果证明了 FPN 可以进一步优化的想法,但复杂的计算机搜索结构让人类难以理解。
结论
目标检测仍然是一个活跃的研究领域。尽管像 R-CNN 这样的两级检测器和像 YOLO 这样的一级检测器很好地塑造了该领域的总体前景,但我们最好的检测器仍然远远没有达到基准指标的饱和,并且还会错过复杂背景中的许多目标。与此同时,像 CenterNet 这样的无锚点检测器向我们展示了一个充满希望的未来,其中对象检测网络可以变得像图像分类网络一样简单。物体检测的其他方向,如少拍识别、NAS 等,还处于初级阶段,未来几年的进展如何,我们拭目以待。然而,随着物体探测技术变得越来越成熟,我们需要对其被军队和警察采用非常谨慎。终结者用 YOLO 探测器猎杀人类的反乌托邦是我们一生中最不想看到的。
原载于http://yanjia . Li2020 年 8 月 9 日
参考
- Pierre Sermanet,David Eigen,Xiang Zhang,,Rob Fergus,Yann LeCun, OverFeat:使用卷积网络的综合识别、定位和检测
- Ross Girshick,Jeff Donahue,Trevor Darrell,Jitendra Malik, 基于区域的卷积网络用于精确的对象检测和分割
- 罗斯·吉希克,快速 R-CNN
- 约瑟夫·雷德蒙、桑托什·迪夫瓦拉、罗斯·吉斯克、阿里·法尔哈迪、 你只看一次:统一的、实时的物体检测
- 刘威、德拉戈米尔·安盖洛夫、杜米特鲁尔汉、克里斯蒂安·塞格迪、斯科特·里德、傅成阳、亚历山大·c·伯格、 SSD:单次多盒探测器
- 任,,何,,, 快速 R-CNN:基于区域建议网络的实时目标检测
- 宗-林逸,彼得·多拉尔,罗斯·吉斯克,明凯·何,巴拉思·哈里哈兰,塞尔日·贝隆吉, 特征金字塔网络用于物体检测
- 宗-林逸、普里亚·戈亚尔、罗斯·吉斯克、明凯·何、皮奥特·多拉尔、 密集天体探测焦损失
- 约瑟夫·雷德蒙、阿里·法尔哈迪、YOLO9000:更好、更快、更强
- 约瑟夫·雷德蒙,阿里·法尔哈迪, 约洛夫 3:增量改进
- 李,潜真深入 v3:
- 形意周、、、、物象分、
- 李,人体姿态估计用层叠沙漏网和张量流
- 明凯·何,乔治亚·格基奥萨里,彼得·多拉尔,罗斯·吉斯克, 面具 R-CNN
- 蔡兆伟,努诺, 级联 R-CNN:钻研高质量物体检测
- 谭明星,庞若明,郭诉乐, EfficientDet:可扩展的高效对象检测
- 戴继峰,,,,, R-FCN:基于区域的全卷积网络目标检测
- 李, 见证语义切分的进程:DeepLab 系列从到 V3+
- Golnaz Ghiasi,Tsung-林逸,庞若明,郭诉乐, NAS-FPN:学习用于对象检测的可扩展特征金字塔体系结构
- 、秦、、、、贾亚佳、 路径聚合网络实例分割
- 李, 深度学习时代理解图像分类你应该看的 10 篇论文
数据科学面试的 12 个概率练习题
Clem Onojeghuo 在 Unsplash 拍摄的照片
自信地完成数据科学面试,第 3 部分
在之前的文章中,我已经谈到了机器学习和统计学中需要准备的面试问题:
自信地完成面试
towardsdatascience.com](/20-machine-learning-related-questions-to-prepare-for-interviews-93bcba72f911) [## 为数据科学面试做准备的 22 个统计问题
自信的钉钉数据科学访谈,第 2 部分
towardsdatascience.com](/22-statistics-questions-to-prepare-for-data-science-interviews-d5651a8b3c56)
接下来的文章是关于为数据科学面试准备案例研究和行为问题:
自信地完成数据科学面试,第 4 部分
towardsdatascience.com](/structure-your-answers-for-case-study-questions-during-data-science-interviews-a14a02d21e6c) [## 为数据科学面试准备行为问题
自信地完成数据科学面试,第 5 部分
towardsdatascience.com](/prepare-behavioral-questions-for-data-science-interviews-96e97f13be15)
在这篇文章中,我会列出概率中的 12 个问题供你练习。我将列出四个主题中常见和经典的问题:一般概率、二项分布、条件概率和贝叶斯概率。我在后面提供了我对这些问题的答案,这样你可以将你的答案与我的进行比较。如果您有任何问题、疑问、建议等,请随时联系我。
提问
一般概率
**1、**给定两个公平的骰子,两个骰子总和为 8 的概率是多少?当第一个骰子是 3 时,两个骰子总和为 8 的概率是多少?
**2、**A 人和 B 人在一起射箭。假设他们射向目标的能力完全相同,他们两人击中目标的概率都是 0.5。现在给定 A 发射了 201 支箭,B 发射了 200 支箭,那么 A 比 B 获得更多目标的概率是多少?
**3、**流感季节,对于双亲异性家庭,假设至少一方父母患流感的概率为 17%;父亲患流感的概率是 12%;父母双方都患流感的概率是 6%,母亲患流感的概率是多少?
你有 40 张四种颜色的牌,10 张红色,10 张绿色,10 张蓝色和 10 张黄色。每种颜色都有一个从 1 到 10 的数字。当你挑两张不替换的牌时,两张牌不在同一个颜色,不在同一个号码的概率是多少?
二项式分布
**5、**A 队和 B 队正在进行一场比赛,他们必须在 7 轮比赛中赢下 4 轮才能赢得比赛。A 赢的概率是 p,那么 B 赢的概率是 1-p(没有平手的机会),他们打满七轮的概率是多少?如果主场§和客场(q)A 赢的概率不一样怎么办?
**6、**八个人进入一栋十层楼的电梯。预计停车次数是多少?计算这个期望需要什么假设?
条件概率
一个人一次又一次地投掷一枚无偏的硬币。玩家 A 寻找序列HHT
,玩家 B 寻找序列HTT
。参与人 A 先遇到他们序列的概率是多少?
琼斯先生有两个孩子。大孩子是个女孩。两个孩子都是女孩的概率有多大?史密斯先生有两个孩子。其中至少有一个是男孩。两个孩子都是男孩的概率有多大?
天使给了你三扇门的选择。你只能从这三扇门中选择一扇门。在这三扇门中,有两扇门什么都没有,有一扇门中了头奖。在你选择了其中一扇门后,天使向你展示了另外两扇门中的一扇门,后面什么也没有。天使给了你一个机会去改变门,或者你可以坚持你选择的门。你不知道哪扇门后我们一无所有。你应该换还是无所谓?
贝叶斯概率
有四个盒子:A、B、C、d。约翰在其中一个盒子里随机放了一个球,让大卫猜他把球放在哪一个盒子里。大卫猜测球在盒子 A 里,但是他不确定。约翰给了他一个球不在 b 框的提示,这时,球在 C 框的概率是多少?
**11、**所有接受第一次面试的人,有 50%接受第二次面试;你的朋友中有 95%的人得到了第二次面试机会,他们觉得第一次面试很成功;你的朋友中有 75%没有得到第二次面试机会,他们觉得第一次面试很好。如果你觉得你第一次面试很好,你获得第二次面试的概率有多大?(Q16 摘自本文)
12、假设世界上存在一种非常罕见的疾病。任何人患这种疾病的几率是 0.1%。你想知道你是否被感染,所以你去做了测试,测试结果是阳性。测试的准确性为 99%,这意味着 99%的患病者将测试为阳性,99%的未患病者将测试为阴性(非常感谢 Xavier Lavenir 纠正了问题中的假设)。你被感染的可能性有多大?(感谢丹尼斯·迈斯纳,在这里抓住了曲解的错误)
答案
**1、**掷出两个公平骰子有 36 (6*6)种结果,当两个骰子总和为 8 时的结果为:
(2, 6), (3,5), (4,4), (5,3), (6,2);
两个骰子总和为 8 的概率是 5/36。
对于第二部分,我们计算的是一个条件概率。假设事件 A 是两个骰子,总和为 8,事件 B 是第一个骰子是 3。我们知道事件 B 的结果是:
(3,1), (3,2), (3,3), (3,4), (3,5), (3,6)
而只有(3,5)使事件 A 发生,因此概率是 1/6。
我们也可以使用贝叶斯定理和条件概率来解决这个问题:
P(AB)和 P(A|B)的区别在于:
- P(AB)为 1/36:36 个结果中,只有(3,5)个同时满足事件 A 和事件 B;
- P(A|B)是 1/6:在事件 B 的 6 个结果中,(3,1),(3,2),(3,3),(3,4),(3,5),(3,6),只有一个结果在(3,5)处总计为 8,因此 P(A|B)是 1/6。(也可按 1/36 / 1/6 = 1/6 计算)
201 不是一个偶数,所以让我们先考虑 200 场比赛。假设事件 A 是 A 在 200 场比赛中比 B 向目标射出更多的箭,事件 B 是 B 向目标射出更多的箭,事件 C 是他们向目标射出等量的箭。我们有:
因为 A 和 B 在射箭方面表现相同,所以 200 场比赛,我们有 P(A) = P(B)。因此:
现在来看 A 玩的额外游戏。如果在过去的 200 场比赛中:
- A 比 B 高,那么在这个额外的游戏中,无论 A 是否击中目标,A 仍然比 B 高。
- 如果 A 比 B 低,即使 A 在额外的比赛中向目标开火,我们也会观察到最多 A=B,A 仍然不会超过 B。
- 如果 A=B,如果 A 在额外的游戏中向目标射击,那么 A 将高于 B,任何游戏中 A 向目标射击的概率是 0.5。
因此,A 高于 B 的总概率为:
我们知道 2P(A) + P© = 1,如果我们两边都除以 2,我们将得到:
在 A 玩 201 局,B 玩 200 局的情况下,A 比 B 获得更多目标的概率是 0.5。
**3、**假设父亲患流感的概率为 P(F),母亲患流感的概率为 P(M)。我们知道:
根据概率的一般加法法则:
因此 P(M)=11%。
**4、**我们可以先计算得到两张相同号码牌的概率和得到两张相同颜色牌的概率,然后用一减去两个概率之和。
得到两张号码相同的牌的概率是:
第一次抽奖可以得到任意数字,也没关系。因此第一次抽牌并不影响概率,但是对于第二次抽牌,你只剩下 39 张牌了,你需要抽取与第一次抽牌相同的号码。对于每个数字,有四张不同颜色的相同数字的卡片。因此对于第二次抽牌,你只能从 39 张牌中挑选 3 张。
相同的逻辑得到两张相同颜色的牌:
我们在第一次抽奖中选择任何颜色,并且只能从剩余的 39 张牌中选择 9 张相同颜色的牌。得不到同号同卡的概率是:
P = 1-P(相同数字)-P(相同颜色)= 27/39
**5、**如果两队打满 7 轮,那么前 6 轮,A 和 B 都要赢正好 3 次,最后一轮谁赢我们不在乎。我们可以把每一轮都看作是伯努利试验,那么 A 在前 6 场比赛中获胜的次数遵循二项分布 Bi(n,k,p)其中 n=6,k=3,p=p,A 获胜的概率。根据二项式分布,A 在 6 场比赛中赢 3 次的概率是:
请注意,A 队赢 3 次会自动设置 B 队赢 3 次。
如果两支球队主场和客场的胜率不同,我们可以假设 A 队主场获胜的概率是 p,客场是 q,A 队主场已经赢了 x 场比赛。两个队打完所有 7 轮比赛的概率将是 x、p 和 q 的函数。具体来说,我们知道 A 队和 B 队都必须赢 3 轮,那么 A 队必须在主场赢 x 场比赛,在客场赢 3-x 场比赛;B 队要客场赢 3-x 场(A 队主场是 B 队的客场,A 主场输 B 队客场赢),主场赢 x 轮。打七轮的概率是:
如果我们有更多关于 x 的分布的信息,我们可以得到更多关于概率的信息。
想了解更多关于二项分布的知识,请查看这篇文章。
如果我们将每个乘客关于是否在某个楼层停留的决定视为伯努利试验,我们可以使用二项式分布来处理这个问题。这些假设包括:
- 8 .乘客自主决策;
- 假设每个人都从底层进入,有 10 个选择,从 1 层到 10 层。(如果假设一楼没人停,那么只有 9 个选择)。
总共有八名乘客,对于每个楼层,如果有人想下车,电梯就会停下来。我们可以计算不停止的概率,而不是计算电梯停在某一楼层的概率。对于任何楼层,电梯不在任何楼层停留的概率为:
电梯停在任何楼层的概率是:
为了找到这种情况下的预期停靠次数,定义一个随机变量 X 作为电梯的停靠次数,X 遵循二项式分布:
其中 n=10,p=1-(9/10)⁸.二项分布随机变量的期望值是 np:
**7、**硬币无偏使得 P(H) = P(T) =0.5。让我们假设 HHT 早于 HTT 的事件是事件 E,我们有:
- P(E) = P(E|H)*P(H) + P(E|T)*P(T)
其中 P(E|H)在第一次投掷时得到 H。既然得到一条尾巴对得到 HHT 和 HTT 都没有帮助,因此:
- P(E) = P(E|T) = P(E|TT)=…
插回到前面的等式:
- P(E)= 0.5 * P(E | H)+0.5 * P(E)= > P(E)= P(E | H)
所以我们只需要得到 P(E|H)来求解 P(E):
- P(E | H)= P(E | HH)* P(H)+P(E | HT)* P(T)
无论何时你得到 HH,你肯定会比 HTT 早得到 HHT,因为你只需要得到一个额外的 T 就可以到达 HHT,但是你需要得到两个额外的 T 才能到达 HTT。因此 P(E|HH)是 1:
- P(E|H) = 1*0.5 + P(E|HT)*0.5
出于同样的逻辑:
- P(E | HT)= P(E | HTH)* P(H)+P(E | HTT)* P(T)
P(E|HTT) =0,因为我们已经先到达了 HTT。当看到 HTH 时,前两次投掷可以忽略不计,就像滚动第一个 h 一样。因此:
- P(E|HTH) = P(E|H)
现在我们有:
- P(E | HT)= P(E | HTH)* P(H)+P(E | HTT)* P(T)= P(E | H)* 0.5+0
插回到前面的等式:
- P(E | H)= 1 * 0.5+P(E | HT)* 0.5 = 0.5+P(E | H)* 0.5 * 0.5 = > P(E | H)= 2/3
- P(E) = P(E|H) =2/3
**8、**对于有两个孩子的家庭,性别组合有四种可能:
四种可能性
答:如果我们知道大孩子是女孩,那么只有两种可能:
两种可能性
其中一个有两个女儿。概率是 1/2;
B 部分:对于至少一个孩子是男孩,我们有三种可能性:
三种可能性
其中一个怀了两个男孩。概率是 1/3。
对于练习,可以尝试用条件概率来解决这个问题。
我们有三扇门,一号门、二号门和三号门。他们每个人都有 1/3 的机会拥有后面的头奖。我们需要根据自己当初是否选择正确来决定是否切换,比较切换和不切换的概率。假设事件 A 在第一次尝试中选择正确:
- p(A)= 1/3;p(不是 A)= 2/3;
让事件 B 在切换后获胜:
- P(B|A) = 0:如果你在第一次尝试(事件 A)中选择正确,并且你切换,你将不再获胜;
- p(B |非 A) = 1:如果你在天使移除另一个错门后第一次尝试(事件非 A)选错了,切换后一定会赢。
因此:
P(B)= P(B | A)P(A)+P(B |非 A) P(非 A) = 2/3。
当不切换时,让事件不是最佳获胜:
- p(不是 B|A) = 1:如果你第一次尝试(事件 A)选择正确,并且你切换,你将赢得头奖;
- P(Not B|not A) = 0:如果第一次尝试选错了(event not A),选择不切换就输了。
因此:
P(非 B) = P(非 B|A)*P(A) + P(非 B |非 A)*P(非 A) = 1/3。
比较切换和不切换时的胜算:
P(B) > P(不是 B)
你应该换一下!
**10、**约翰给出暗示后,有三种情况:
- S1: A=1,B=0,C=0,D = 0;
- S2: A=0,B=0,C=1,D = 0;
- S3: A=0,B=0,C=0,D = 1;
将约翰说球不在盒子 B 中的事件定义为事件 B,我们需要计算 P(S2|B)的条件概率。根据贝叶斯定理:
让我们逐个检查这些元素:
- P(S2)是约翰将球放入四个盒子中的盒子 C 的概率。概率应该和他把球放在任何一个盒子里一样。因此:
- P(B|S2)是当约翰将球放入盒子 C 时,在大卫已经选择了盒子 A 的情况下,他给出了球不在盒子 B 中的提示。在大卫选择了 A 之后,只剩下三个盒子供约翰排除,分别是 B,C,D。鉴于球实际上在盒子 C 中,约翰只能通过给他提示来帮助大卫排除 B 或 D。他在两个盒子(B,D)中选择 B 的概率是 1/2:
- 根据贝叶斯公式:
我们知道 P(B|S2)是 1/2,我们可以用同样的逻辑得到 P(B|S1)和 P(B|S3)。当球在盒子 A(S1)时,大卫已经得到了正确的答案。约翰有三个选择来给出提示:不在 B 中,不在 C 中,不在 d 中。因此 P(B|S1)是 1/3。P(B|S3)是 1/2,因为约翰可以说不在 B 中或不在 c 中。将所有信息结合在一起,我们将得到:
因此,我们有:
**外卖:**如果约翰没有给出任何提示,我们知道球在盒子 C 里的概率是 1/4。约翰给出的提示增加了球在盒子 C 中的概率,因为我们在用新的信息更新概率,这是贝叶斯定理的关键。
**11、**解决这类问题的关键是仔细定义事件。假设你的朋友很好地代表了整个人口:
- 让我们把第一次面试感觉良好定义为事件 A,把接受第二次面试定义为事件 B;
- “所有接受第一次面试的人中有 50%接受第二次面试”是指 P(B)=0.5,因此 P(不是 B)是一减去 P(B),也是 0.5;
- “你的朋友中有 95%的人得到了第二次面试,他们觉得第一次面试很好”意味着 P(A | B)= 0.95;
- “75%没有获得复试的朋友认为他们的第一次面试很好”意味着 P(A |不是 B) = 0.75。
- 问题是问给定 P(B),P(A|B),P(A |不是 B),P(B|A)是什么?(如果你觉得你第一次面试很好,你获得第二次面试的概率有多大?)
根据贝叶斯定理:
因此:
**12、**假设事件 A 患病,事件 B 检测呈阳性。根据问题中的信息:
- P(A) = 0.1%,那么 P(不是 A)就是 99.9%;
- P(B|A) = 99%,而测试呈阳性的人中有 1%没有这种疾病,所以 P(B | A)= 1%;
- P(A|B)是什么?
来自贝叶斯定理:
并且:
插件所有号码:
这些都是有解答的问题。希望这篇文章能帮助你练习概率论的技巧。如果你想要更多的练习题,你可以看看这个网站:
简介概率形成了许多重要的数据科学概念的主干,从推断统计到…
www.analyticsvidhya.com](https://www.analyticsvidhya.com/blog/2017/04/40-questions-on-probability-for-all-aspiring-data-scientists/)
感谢您的阅读!这是我所有博客帖子的列表。如果你感兴趣的话,可以去看看!
我快乐的地方
zzhu17.medium.com](https://zzhu17.medium.com/my-blog-posts-gallery-ac6e01fe5cc3) [## 阅读朱(以及媒体上成千上万的其他作家)的每一个故事
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
zzhu17.medium.com](https://zzhu17.medium.com/membership)