TowardsDataScience 博客中文翻译 2020(三百二十四)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

你知道权重和偏差吗?而不是用梯度下降法计算出来的。

原文:https://towardsdatascience.com/do-you-know-about-the-weights-and-biases-not-the-ones-calculated-using-gradient-descent-b7469b91e61a?source=collection_archive---------51-----------------------

每个数据科学家都应该使用该工具的 6 个理由

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

克里斯·利维拉尼在 Unsplash 上的照片

你知道权重和偏差吗?而不是使用梯度下降计算的权重和偏差。我说的是用于机器学习的权重和偏见开发者工具。

我最近偶然发现了这个非常酷的机器学习工具——权重和偏见,很快我就发现自己在玩它。因此,我决定与数据科学社区分享我对使用这一出色工具的看法。

如果你没有听说过它,那么让我告诉你它提供了什么,如果你是一个机器学习从业者,为什么你应该使用它。如果你已经知道了,请随意评论这篇文章。为了明确起见,我将在本文中把权重和偏差称为 W&B。

1.追踪机器学习实验变得简单多了

您如何跟踪您的模型、它们的超参数和它们的性能?当你继续实验的时候,你会用电子表格或记事本记录你建立的模型的所有细节吗?我经常这样做。有一次,在我的一个课程项目中,我在追求产生可重复的结果和更高的精确度方面更进一步,我发现自己复制了 Jupyter 笔记本,每个实验模型都有一个笔记本。这使我能够快速比较和巩固我的发现。现在,不再有这样的东西了。

现在,您可以专注于调整您的模型,而不必担心记下超参数或结果。让 W&B 为您处理所有这些。

通过向您的程序添加几行代码,W&B 将负责记录您的模型从输入(超参数)到输出(评估指标)的所有细节。稍后,这些记录的细节会以一些非常容易阅读的图形显示给你。您所需要做的就是啜饮您最喜欢的饮料,同时记录详细信息,并观察那些漂亮的度量图在您的模型构建时自动为您生成。

此外,您还将拥有关于您运行的模型或实验的所有必要的(A-Z)细节,所有这些都组织在一个地方,因此您可以随时回来查看。所有这些信息都可以在同一个平台上获得,那就是您的个人仪表盘。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

典型的权重和偏差仪表板。现场演示来源:https://app.wandb.ai/example-team/keras-mnist

2.超参数调谐变得更加容易

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:https://imgur.com/gallery/CAXMU

超参数调整是一件棘手的事情,我希望你们都同意我的观点。当您有几十个可以调整的超参数时,很难注意到调整超参数对优化指标的影响。现在,我们都听说过网格搜索、随机搜索和用于超参数调整的贝叶斯优化,但我们也知道所有这些技术的计算成本都很高。对于神经网络,这些技术都不是有效的。我过去常常根据自己的判断微调超参数,非常努力地注意优化指标的变化。

现在,W&B 的一个很好的功能——超参数扫描可以拯救我们。在这个所谓的超参数扫描中,W&B 创建平行坐标图,从而更容易发现优化指标和特定超参数之间的关系。如果您不熟悉平行坐标图,以下是它在 W&B 仪表板中的样子。你可以查一下住在这里的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

平行坐标图—权重和偏差中的超参数扫描,来源:【https://docs.wandb.com/app/panels/parallel-coordinates

你可以看到,你的模型的不同运行的所有超参数都在一个简洁的图形中。此外,您甚至可以搜索最佳跑步记录。这个图也可以用几行代码添加到您的个人仪表板中!想象一下,在 Jupyter 笔记本上为这样的功能编写代码,而不是用 W&B 编写几行代码。

3.自定义可视化

除了通常的机器学习情节,W&B 还有许多东西可以提供。你基本上可以设计自己的可视化效果,从直方图,散点图,酷三维图,媒体可视化和许多其他先进的可视化。它提供了设计您喜欢的仪表板的灵活性。

在建立一个模型后,我经常做的一件事就是查看错误标注的例子。例如,在处理图像时,我想查看标签不正确的图像。每次实验时,您甚至可以设计自己的自定义可视化来显示来自验证集的那些错误标记的图像。同样,只需几行代码!

以下是训练示例图像和预测图像在您的仪表板上的自定义可视化效果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

添加自定义可视化的示例。现场演示来源:https://app.wandb.ai/sweep/simpsons

这只是你可能做的事情之一,当你把这些自定义的可视化添加到你的仪表板时,你可以变得更有创造性。

4.也要注意你的系统指标

如果你像我一样喜欢在你的模型运行时查看 CPU/GPU 内存的使用量,那么我希望你会喜欢这个很酷的功能。W&B 自动记录有用的系统指标,如 CPU/GPU 利用率、温度、分配的内存。并且,它为你创建了一个漂亮的图表,当你的模型被训练的时候,你可以追踪你的系统是如何应对的。在下图中,您可以看到这些指标是如何呈现在您的仪表板上的。也可以查一下住在这里

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

权重和偏差中的系统度量,来源:【https://app.wandb.ai/sweep/sweeps-tutorial/

所以,所有这些都可以实现——你可以猜到我接下来要说什么,但是——如果你已经在项目中正确加载了 W&B,就不需要额外的代码。它每 2 秒自动记录一次系统指标,平均记录时间为 30 秒。很酷,不是吗?

5。与流行框架集成

无论你来自 PyTorch 社区,还是 Tensorflow,你使用 Colab 或 Jupyter,他们都可以覆盖你。权重和偏差很容易与大多数流行的机器学习框架和工具集成。

您可以查看 Weights and Biases 文档,看看它是否集成了您最喜欢的框架和您最喜欢的工具

6.一个屋檐下的一切

关于 W&B 最好的一点是,每个记录的细节都组织在一个项目下,项目名称是您在项目中加载工具时指定的。它的作用是,为你的项目分配一个工作空间。正如我们在前面的例子中看到的,仪表板是工作区的一部分,当然工作区还提供了其他特性,这超出了本文的范围。但故事的寓意是,你创建的每一个可视化,你为那个项目记录的每一个细节,你所有的实验都可以在这个项目工作区下很好地组织起来——在一个屋檐下。不再疯狂地搜索机器学习实验笔记。

总之,这个工具旨在将所有机械 ML 实验跟踪与需要大脑汁的实际机器学习任务分开并自动化。因此,现在数据科学家可以继续利用他们的大脑汁液来建立有用的机器学习模型,而权重和偏见则完成所有不需要数据科学家关注的繁重工作。

他们的工具正在被包括 OpenAI 和丰田在内的尖端机器学习团队使用?为什么不是你?

另外,对于个人从业者是免费的!

我希望我已经引发了你对使用这个很酷的机器学习实验跟踪工具的足够兴趣。如果你碰巧学会使用这个工具,请在评论中告诉我你最喜欢的功能。请继续关注一篇关于如何开始研究重量和偏差的文章。当我写完这篇文章后,我会编辑它的链接。如果您非常感兴趣,那么您可以随时查看他们的文档(参见参考资料)并立即开始。感谢您的宝贵时间!😃

参考资料:

[1]权重和偏差,权重和偏差文档,https://docs.wandb.com/

[2] Lukas Biewald,机器学习实验跟踪(2020),https://towardsdatascience . com/Machine-Learning-Experiment-Tracking-93b 796 e 501 b 0

你知道 Python 有内置数据库吗?

原文:https://towardsdatascience.com/do-you-know-python-has-a-built-in-database-d553989c87bd?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由麦克默里朱莉Pixabay 拍摄

Python 内置库 sqlite3 简介

如果你是一名软件开发人员,我相信你一定知道甚至使用过一个非常轻量级的数据库——SQLite。它几乎拥有关系数据库所需的所有功能,但所有内容都保存在一个文件中。在官方网站上,这里有一些您可以使用 SQLite 的场景。

  • 嵌入式设备和物联网
  • 数据分析
  • 数据传输
  • 文件存档和/或数据容器
  • 内部或临时数据库
  • 在演示或测试期间替代企业数据库
  • 教育、培训和测试
  • 实验性 SQL 语言扩展

你可能有更多的理由想使用 SQLite,请查阅文档。

[## SQLite 的适当用法

SQLite 不能直接与客户机/服务器 SQL 数据库引擎相提并论,如 MySQL、Oracle、PostgreSQL 或 SQL…

www.sqlite.org](https://www.sqlite.org/whentouse.html)

最重要的是,SQLite 内置于 Python 库中。换句话说,你不需要安装任何服务器端/客户端的软件,也不需要保持某个东西作为服务运行,只要你用 Python 导入了这个库并开始编码,那么你就拥有了一个关系数据库管理系统!

导入和使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由pix abay上的 copyright free pictures 拍摄

当我们说“内置”的时候,意思是你甚至不需要运行pip install来获取库。只需通过以下方式导入即可:

import sqlite3 as sl

创建到数据库的连接

不要为驱动程序、连接字符串等等而烦恼。您可以创建一个 SQLite 数据库并拥有一个简单的连接对象,如下所示:

con = sl.connect('my-test.db')

在我们运行这行代码之后,我们已经创建了数据库,并且已经将它连接到数据库。这是因为我们要求 Python 连接的数据库不存在,所以它自动创建了一个空数据库。否则,我们可以使用相同的代码连接到现有的数据库。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建表格

然后,让我们创建一个表。

with con:
    con.execute("""
        CREATE TABLE USER (
            id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
            name TEXT,
            age INTEGER
        );
    """)

在这个USER表中,我们添加了三列。正如您所看到的,SQLite 确实是轻量级的,但是它支持常规 RDBMS 应该具有的所有基本特性,比如数据类型、可空性、主键和自动增量。

运行这段代码后,我们应该已经创建了一个表,尽管它没有输出任何内容。

插入记录

让我们在刚刚创建的USER表中插入一些记录,这也可以证明我们确实创建了它。

假设我们想一次插入多个条目。Python 中的 SQLite 可以轻松实现这一点。

sql = 'INSERT INTO USER (id, name, age) values(?, ?, ?)'
data = [
    (1, 'Alice', 21),
    (2, 'Bob', 22),
    (3, 'Chris', 23)
]

我们需要用问号?作为占位符来定义 SQL 语句。然后,让我们创建一些要插入的样本数据。使用连接对象,我们可以插入这些样本行。

with con:
    con.executemany(sql, data)

在我们运行代码后,它没有抱怨,所以它是成功的。

查询该表

现在,是时候验证我们所做的一切了。让我们查询该表以获取示例行。

with con:
    data = con.execute("SELECT * FROM USER WHERE age <= 22")
    for row in data:
        print(row)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以看到它是多么简单。

同样,尽管 SQLite 是轻量级的,但作为一个广泛使用的数据库,大多数 SQL 客户端软件都支持消费它。

我用的最多的是 DBeaver,大家看看是什么样子的。

从 SQL 客户端(DBeaver)连接到 SQLite DB

因为我用的是 Google Colab,所以我要把my-test.db文件下载到我的本地机器上。在您的情况下,如果您在本地机器上运行 Python,您可以使用您的 SQL 客户端直接连接到数据库文件。

在 DBeaver 中,创建一个新连接,并选择 SQLite 作为 DB 类型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,浏览数据库文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,您可以在数据库上运行任何 SQL 查询。它与其他常规关系数据库没有什么不同。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

与熊猫无缝集成

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Pixabay 上的图形妈妈团队拍摄

你以为就这些?不会,事实上,作为 Python 的内置特性,SQLite 可以与 Pandas Data Frame 无缝集成。

让我们定义一个数据框。

df_skill = pd.DataFrame({
    'user_id': [1,1,2,2,3,3,3],
    'skill': ['Network Security', 'Algorithm Development', 'Network Security', 'Java', 'Python', 'Data Science', 'Machine Learning']
})

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,我们可以简单地调用to_sql()方法将数据帧保存到数据库中。

df_skill.to_sql('SKILL', con)

就是这样!我们甚至不需要预先创建表,列的数据类型和长度就会被推断出来。当然,如果你愿意,你仍然可以事先定义它。

然后,假设我们想要连接表USERSKILL,并将结果读入熊猫数据框。也是天衣无缝。

df = pd.read_sql('''
    SELECT s.user_id, u.name, u.age, s.skill 
    FROM USER u LEFT JOIN SKILL s ON u.id = s.user_id
''', con)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

超级爽!让我们将结果写入一个名为USER_SKILL的新表中。

df.to_sql('USER_SKILL', con)

然后,我们还可以使用我们的 SQL 客户机来检索该表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

摘要

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由monar _ CGI _ ArtisPixabay 上拍摄

的确,Python 中隐藏着很多惊喜。它们并不意味着被隐藏,只是因为 Python 中存在太多现成的特性,人们无法发现所有这些特性。

在本文中,我介绍了如何使用 Python 内置库sqlite3在 SQLite DB 中创建和操作表。当然,它也支持更新和删除,但我认为你会尝试自己在这之后。

最重要的是,我们可以很容易地将一个表从 SQLite 数据库读入 Pandas 数据框,反之亦然。这允许我们更容易地与轻量级关系数据库进行交互。

您可能会注意到 SQLite 没有身份验证,这是它的设计行为,因为所有东西都需要是轻量级的。去发现 Python 中更多令人惊讶的特性吧,尽情享受吧!

本文中的所有代码都可以在我的 Google Colab 笔记本中找到。

[## SQLite 熊猫示例

创建数据库、创建表、检索和连接

colab.research.google.com](https://colab.research.google.com/drive/1Nq6VjezN4Djx5smI0esP8VJ8QCWr73DR?usp=sharing) [## 通过我的推荐链接加入 Medium 克里斯托弗·陶

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@qiuyujx/membership)

如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和其他成千上万的作者!(点击上面的链接)

了解通用建模框架是所有数据科学家的必备技能

原文:https://towardsdatascience.com/do-you-know-the-general-modeling-framework-c422f866a2dc?source=collection_archive---------89-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Wokandapix 来自 Pixabay

统计模型的基础

当涉及到建立统计模型时,我们这样做的目的是为了理解或近似我们世界的某个方面。

通用模型的概念在 g 框架中很好地分解了我们可能用来产生所述理解的目的和方法。

一般的建模框架是什么?

看看下面公式描述的一般建模框架:

y = f(x) + e

  • y:结果变量/我们试图更好理解的任何东西
  • x:自变量或任何我们用来解释 y 的东西
  • f():应用于 x 时近似于 y 值的函数
  • e:我们通过 X 的函数对 Y 的解释与实际 Y 之间的误差或距离。例如:我们不能通过 f(X)解释的一切

这里有几个要点。组成 y 的,是我们对 y 的理解,它是 x 的函数,上面有误差。我们努力确定这个功能就是建模的目的。如果你听说过信号&噪声,功能是信号、符号、指示器,噪声是误差、变化等。

这一框架的应用

让我们来看两个目的或方法,您可以结合这个框架来利用它们来指导您的建模过程。

至于建模机制,它的大部分将保持不变。这里的核心区别是指导你的过程的哲学。

解释或预测

为解释而建模

当谈到为解释而建模时,驱动力是我们试图理解哪些变量可能导致一个结果或与之相关

以此为序,让我们进入一些探索性的数据分析,开始我们的解释建模过程。

预测建模

一旦我们对 F 有了理解,一旦你梳理出了对(X 的)函数的解释,你就可以把它应用到其他数据(另一个 X)来产生预测。

虽然我们从事的 EDA 在很大程度上是相同的,但目的/用途可能会有所不同。同样,使用 X 和 y 之间的历史关系生成预测的意图突出了这种差异。

在为预测建模时,我们仍然发现自己处于不知道函数或误差的困境中,这仍然需要分开来理解。

更重要的是,当为了解释而建模时,我们非常关心函数的形式,而当为了预测而建模时,我们就不那么关心了。在这种情况下,我们关心的是我们的预测是否准确,因此得名…预测建模。

探索性数据分析

无论是为了解释或预测而建模,我们仍然会经历探索性数据分析的过程。这个过程会给我们正确的信息,指引我们理解 X 的功能的方向。

让我们从探索性数据分析(或者我们在商业中称之为 EDA) ).EDA 的目的是让我们在建模过程之前进行一系列的活动,这些活动有助于更好地理解我们试图建模的每个自变量和因变量,并在较高层次上理解它们之间的关系。

我从 kaggle 下载了一份房价数据。你可以在这里找到:https://www.kaggle.com/shree1992/housedata/data

让我们来看看住房数据

我们通常会用一系列函数来启动这个过程,这些函数可以让我们快速了解数据。

一瞥或一串

glimpse 和 str 都将为您提供字段、它们的数据类型、维度和样本的视图。

glimpse(housing)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

str(housing)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们现在来看看 head,看看数据集的前几行。

head(housing)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们可视化变量分布

我们将加载ggplot2并制作一个直方图来查看其中的一些变量

library(ggplot2)ggplot(housing, aes(x = bathrooms)) +
  geom_histogram(binwidth = 1)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过geom_histogram,我们可以看到属于每个数字类别的房屋数量。我们可以看到最多的家庭有 2.5 个浴室。

为了举例,让我们对更多的变量做同样的事情。

下面你会看到平方英尺的分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到稍微偏右的分布。

让我们想象一下房价。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如你所看到的,由于一些极端价格的房屋,这有点偏右。

可视化扭曲的数据

在可视化分布时需要记住的一件事是,可视化变量的 log10 分布。

记录日志的好处在于它保留了值的顺序。

让我们快速浏览一下!

我们看到平方英尺居住分布有些右偏,让我们来想象一下。

housing %>%
  mutate(sqft_living_log = log10(sqft_living))%>%
  ggplot(aes(x = sqft_living_log)) +
  geom_histogram()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如我们在上面看到的,我们有一个平方英尺的正态分布的对数值。这使得比较这些较低的值和那些存在于右尾较大的极端值变得更容易。

让我们可视化变量组合

现在让我们来看一个涉及多个变量的类似过程。这将让我们了解这些变量之间的关系。

我们将首先从 sqft & price 开始。

housing %>%
  ggplot(aes(x = sqft_living, y = price)) +
  geom_point()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这两个变量具有线性关系,相关系数为 0.43

现在我们知道这两个变量都是右偏的,让我们在将它们转换成它们的 log10 自我后再一次可视化它们。

housing %>%
  mutate(sqft_living_log = log10(sqft_living),
         price_log = log10(price))%>%
  ggplot(aes(x = sqft_living_log, y = price_log)) +
  geom_point()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为解释和预测重新建模

现在,我们已经经历了一些 EDA,让我们重温一下建模的概念。目的是了解哪些因素解释了 y,或者当它与住房数据相关时,变量(平方英尺、浴室数量等)如何。)或许可以解释 y。

当谈到预测建模时,我们的目的是估算房价。我们不一定关心什么变量对我们的函数有贡献,也不关心函数实际上由什么组成……我们真正关心的是我们的模型有多接近现实。一个很好的例子是 Zillow &他们的 zestimate。他们绝对关心他们当前的模型所产生的结果的准确性。

建模时,要记住的一点是,我们不会了解误差是如何产生的……这里的目的是通过评估 X 和 y 之间的关系来推导函数。我们之前提到的函数是信号,因此建模是我们分离信号和噪声的过程。

结论

希望对通用建模框架的介绍能让你对如何思考建模有所了解。

祝数据科学快乐!

你认识这朵花吗?使用 PyTorch 的图像分类器

原文:https://towardsdatascience.com/do-you-know-this-flower-image-classifier-using-pytorch-1d45c3a3df1c?source=collection_archive---------50-----------------------

Udacity 数据科学家纳米学位计划项目

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://en.wikipedia.org/wiki/Oenothera_speciosa

这个项目是数据科学家纳米学位项目 Udacity 的一部分:图像分类器项目,目标是应用深度学习技术来训练图像分类器,以识别不同的花卉品种

让我们从使用 CRISP-DM 流程(数据挖掘的跨行业流程)开始:

  1. 业务理解
  2. 数据理解
  3. 准备数据
  4. 数据建模
  5. 评估结果
  6. 部署

业务理解

图像分类是当今非常常见的任务,它包括将图像和一些类别作为输入,并输出输入图像属于一个或多个给定类别的概率。关于这一点,我想推荐安妮·邦纳的这个令人敬畏的故事。总之,这个项目的目标是建立一个应用程序,可以对任何一组标记图像进行训练,以对给定的输入进行预测。由uda city提供的具体数据集是关于花的

数据理解

该数据集包含属于 102 个不同类别的花的图像。这些图像是通过搜索网页和拍照获得的。这些图像具有很大的比例、姿态和光线变化。此外,有些类别在类别内有很大的差异,还有几个非常相似的类别。更多信息请参见 M. Nilsback、A. Zisserman 撰写的本文

准备数据和数据建模

Udacity 在 json 文件 cat_to_name.json 中提供了图像的标签以及类别名称和标签之间的映射

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

类别名称和标签之间的映射

Udacity 还在一个有组织的目录树中提供了所有数据集:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据目录树

在每个文件夹中,都有一个以类别标签命名的文件夹,我们可以在其中找到图像。该类别的 jpeg 格式

该项目分为多个步骤:

  • 加载并预处理图像数据集
  • 在数据集上训练图像分类器
  • 使用训练好的分类器来预测图像内容

评估结果

应用程序使用的默认网络是由牛津大学的 K. Simonyan 和 A. Zisserman 在论文“Vvery Deep 卷积网络用于大规模图像识别中提出的卷积神经网络模型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://neurohive.io/en/popular-networks/vgg16/

为了使用该网络,我们将图像的大小调整为 224x224 像素,因为 cov1 层的输入是固定大小的 224 x 224 RGB 图像。Udacity 通过一个 Jupyter 笔记本为这个项目的开发提供了指导,所以很多步骤都非常简单。为了帮助网络泛化以获得更好的性能,我们将应用随机缩放、裁剪和翻转等变换

您将使用的预训练网络是在 ImageNet 数据集上训练的,其中每个颜色通道都是单独标准化的。对于所有三组图像,您需要将图像的平均值和标准偏差归一化到网络预期的值。平均值为[0.485, 0.456, 0.406],标准偏差为[0.229, 0.224, 0.225],从 ImageNet 图像中计算得出。这些值将使每个颜色通道以 0 为中心移动,范围从-1 到 1

现在我们有了预训练网络,我们必须:

  • 使用 ReLU 激活和退出,定义一个新的、未经训练的前馈网络作为分类器
  • 使用预先训练的网络,使用反向传播来训练分类器层,以获得特征
  • 跟踪验证集的损失和准确性,以确定最佳超参数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

网络安装程序

默认情况下,如果通过勾选torch.cuda.is_available()GPU 可用,则使用 GPU 完成训练

torch.cuda增加了对 CUDA 张量类型的支持,实现了与 CPU 张量相同的功能,但是它们利用 GPU 进行计算。更多信息点击此处

使用 10 个时期,我们在训练数据集上获得了 0.8944 的准确度

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

培训结果

在验证数据集上,我们获得了 0.8563 的准确度

展开

一个破折号的应用程序已经开发出来作为用户界面:可以上传一张图片进行分类。当没有图像被上传时,应用程序显示关于训练数据集的一些信息的概述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Dash web 应用程序主页

当提供一幅图像并按下分类按钮时,应用程序显示该图像的分类概率分布,并与相应类别的训练数据集中的图像进行比较

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图像分类

在所示的例子中,我在 Google image 上搜索了花朵粉色樱草花**,并将其作为输入来检查我的分类器的输出**

你可以在我的网站上的这个页面中尝试一下

有趣的事实

我尝试对我的个人资料图片进行分类,显然我是一个剑百合****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我的个人资料图片分类

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://www . gardenia . net/storage/app/public/uploads/images/detail/216420% 20g ladiolus % 20 adrenaline optimized . jpg

****注意:代码可以在这个 github 仓库中找到

你现在可以从谷歌研究院获得 5779 份出版物。

原文:https://towardsdatascience.com/do-you-know-you-can-have-access-to-5779-publications-from-google-research-right-now-b42b2313c325?source=collection_archive---------49-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由晨酿Unsplash 拍摄

如果你正在为你的下一个研究或人工智能项目寻找灵感,这里你可以找到一个可以游泳的大湖:谷歌研究!

谷歌研究是谷歌的一个部门,专注于稍微远一点的项目或需要特定类型领域专业知识的项目,他们经常推出让世界变得更美好的产品。

我们可以将研究项目分为两类——短期的,如改进某些现有产品的性能;与长期相比,他们正在创建一个全新的产品/框架,如 TensorFlow 或自动驾驶汽车。

谷歌研究解决了定义今天和明天的技术的挑战,你可以在他们发表研究成果时获得。确切地说,您可以访问所有 5779 种可用出版物(2019 年只有 793 种),从中获得灵感、获得信息和学习。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:谷歌研究数据库

我正在使用这个令人印象深刻的研究数据库来支持我的新书的写作:用人工智能解决最大的全球挑战,我计划在明年 3 月推出。我正在写人工智能如何支持团队、公司和组织应对全球性挑战,如人工智能伦理、更准确的洪水预测、野生动物研究和儿童扫盲的工具等,并获得一些灵感和支持我对研究进展的理解。

我发现这个数据库是一个方便的温度计,特别是在量子算法和硬件的进步,新的机器学习算法和 AutoML 的改进等方面…

Google Research 的目标是创造一个充满产品影响机会的研究环境,建立一个积极受益于研究的生产环境,并为我们的员工提供自由,以解决与直接产品需求无关的重大研究问题。

研究领域

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:谷歌研究数据库

从进行基础研究到影响产品开发,谷歌研究团队每天都在影响着数十亿人使用的技术。

正如他们网站上所描述的,谷歌研究团队渴望做出影响每个人的发现,我们方法的核心是分享我们的研究和工具,以推动该领域的进步。我们的研究人员定期在学术期刊上发表文章,以开源方式发布项目,并将研究成果应用于谷歌产品。

如果你愿意,你可以从总共 5779 份出版物中获得谷歌研究自 1998 年以来的所有出版物。

链接:谷歌研究数据库

还有一件事…

我刚刚在亚马逊上出版了我的新电子书,并且我已经开始着手在今年出版一些其他的书……保持联系,关注我,让我们一起努力。

[## 2020 年的人工智能:写人工智能的一年

2020 年的人工智能:写人工智能的一年。下载一次,阅读…

www.amazon.com](https://www.amazon.com/dp/B08RSJRNSN/)

你理性地做决定吗?

原文:https://towardsdatascience.com/do-you-make-decisions-rationally-d12a0eb9c89b?source=collection_archive---------12-----------------------

第 1 部分,共 3 部分——来自行为经济学的两个自我测试场景

好奇想知道你是否是一个理性的决策者并且正在进行数据驱动的决策?想象下面的场景,回答选择题就知道了!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片:来源

小赌博游戏

让我们假设我的客厅里有一个装满 90 个高尔夫球的桶,我们要用它来玩一个赌博游戏。(哇哦,你在想,那可是个大水桶。是的,我们正在练习运用我们的想象力。)

你的工作是预先挑选两个潜在赌博游戏的条件。我将抛硬币来决定我们是玩游戏 1 还是游戏 2。

然后我会闭上眼睛,把球彻底打乱,拿出一个球给你看,我们会根据你在这个测验中的选择来看你是否赢了。(你将通过你的屏幕观看我的直播,这样我就不能作弊了)。

我们只玩一个游戏——这意味着你只有一次机会获得 100 美元的奖金,并且不能对冲任何赌注——但在我们开始之前,你不会知道是哪一个游戏,所以我要求你提前选择两种可能性的答案。明白了吗?好了,最重要的事情来了——你有关于水桶的什么信息?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片:来源

桶里的东西

桶里有 30 个白色球60 个黄色或粉色的其他球(你不知道每种有多少)。

现在轮到你选择了。

第一场

你可以选择赌博 A赌博 B :

赌博 A: 如果我抽到一个白色的球,你会得到 100 美元,否则就是 0 美元。

赌博 B: 如果我抽到一个黄色的球,你会得到 100 美元,否则就是 0 美元。

明智地选择,在向下滚动到游戏 2 之前,记下你的选择( A 或 B )。如果你是如此强烈的漠不关心,以至于你很乐意让硬币为你做决定,那就做吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片:来源

提醒: 桶里还有 30 个白色的球和另外 60 个不是
粉色就是黄色的球。

第二场

您可以在赌博 C赌博 D 之间进行选择:

赌博 C: 如果我画一个白色或粉色的球,你会得到 100 美元,如果球是黄色的,你会得到 0 美元。

赌博 D: 如果我画一个粉色或黄色的球,你会得到 100 美元,如果球是白色的,你会得到 0 美元。

记下你的选择( C 或 D ),这样我们就可以开始派对了。和以前一样,如果你真的没有偏好,抛硬币决定。

你理性选择了吗?

我们很快就会知道,但首先你为什么不点击这里看看你的选择与其他人的选择相比如何。这些选项是:

  • 甲&丙
  • A & D
  • B & C
  • B & D

继续,看看其他人选了什么,然后向下滚动查看您的诊断和解释…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片:来源

准备好找出为什么大多数人对这样的决定不理智了吗?在此继续第 2 部分

喜欢作者?与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 TwitterYouTubeSubstackLinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。

你真的有数据策略吗?

原文:https://towardsdatascience.com/do-you-really-have-a-data-strategy-ff08795f10ce?source=collection_archive---------34-----------------------

许多公司声称拥有数据战略。让我们看看是什么让这成为现实。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

玛丽·莱扎瓦Unsplash 上拍摄的照片

我读到了越来越多关于数字化转型和旨在实现业务转型或拥抱数字化之旅的企业的信息。

深入挖掘这些案例,有时你会感到失望。数据重复、角色重叠和代价高昂的数据湖仍然是一些公司面临的现实。

我们如何确定拥有一个健壮的数据策略?

我试着采用汉布里克教授(哥伦比亚大学)和弗雷德里克森教授(德克萨斯大学)提出的战略模型来看看我们如何能容易地检查我们是否在朝着正确的方向前进。你可以在下面的图表中看到这个模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者根据 Hambrick D .,fredrick son j .(2001)“你确定你有策略吗?”《管理行政人员学会》,第 15 卷第 4 期。

  1. 策略是一组选择。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

罗伯特·阿纳施在 Unsplash 上拍摄的照片

定义战略意味着做出清晰可见的决策

如果我们谈论数据,它意味着定义我们需要什么数据,我们有哪些数据以及如何使用它们。在过去的几年里,每个公司的数据量都呈指数级增长。其中大部分存在于 20 多年前的系统中,甚至不是为数据管理而设计的。这显然是一个需要克服的挑战。

如果我们有一个可靠的数据战略,我们就已经决定了我们想要用数据解决什么样的业务需求。我们已经确定了哪些数据我们可以使用,哪些数据我们不能使用(即由于质量差或缺乏数据)。我们已经选择了想要参与竞争的领域,并根据它们对公司整体战略的贡献对它们进行了优先排序。

2。战略需要指明实现目标的途径。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

艾米丽·莫特在 Unsplash 上的照片

颠覆性、数字化、敏捷都是美妙而廉价的口号。

要实现它们,还需要更多的努力。

如果你有一个真正的数据战略,在如何实现数据的价值以促进业务需求上已经做出了选择。您可能会决定在使用数据之前专注于提高数据质量,或者从外部购买相同的数据(即客户信息以获得信用评级风险),从而一次性获得速度和准确性。

您可能已经决定从主数据开始,明确数据的治理和所有权。麦肯锡的一篇文章清楚地阐述了稳健的治理如何成为确保数据质量的关键。但根据我的经验,很明显,数据所有权不能只委托给 it 部门。

它必须靠近那些关心这些数据的人,也就是说职能或业务更受他们的影响。只有这样做,我们才能确保正确执行战略,关注有意义的事情。

这里的挑战是将数据转化为信息。在我看来,要做到这一点,需要三样东西:数据需要可用,质量不错,还需要加入一些情报。

而要做到这三点,你需要知道你的数据背后是什么。

3。选择您的竞争优势。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Joshua Coleman 在 Unsplash 拍摄的照片

这里要回答的问题是我们将如何取胜,什么将使我们成功实施数据战略。每一个数据策略都必须根据业务需求量身定制,并与业务策略紧密相连。

最有可能的是,我们赢得数据战略的方式将依赖于多种因素的组合。

举个例子,以我的经验来看,也许通过在 ERP 之上创建层来收集和汇总数据,比在全球范围内改变所有 ERP 更容易、更便宜,从而克服 ERP 的复杂性。

另一种方法是合理化应用程序,并构建一个包含足够数据的数据湖,以便能够对其进行处理。这可能意味着将预算从应用程序转移到这些层,减少对过时应用程序的投资,或者将它们的使用限制在核心功能上。也就是说,您可以决定使用 SAP 来管理您的财务和物流流程,而将建模、预测和深度数据分析的任务留给其他工具。

“最大的价值来自能够从不同种类的系统中收集和关联信息”—Anil Chakravarthy—Informatica 前首席执行官

4。罗马不是一天建成的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

塔内利·拉蒂宁在 Unsplash 上拍摄的照片

**速度和事件顺序是任何战略的两个组成部分。**你必须有一个清晰的事件/项目顺序,还要定义执行的速度。

根据组织的文化,你可以走得更快,并行或首先创造一种改变的紧迫感。也许在一个业务中试验解决方案,然后在所有其他业务中展示并引起兴趣。

没有明确的顺序就开始执行一个数据项目,整体计划可能会让你付出更大的代价。许多公司在开始数据湖之旅时,并没有明确的目标:这转化为要维护的额外成本&复杂性。

战略的一部分必须是,在我看来,的人的成分。一个强大的数据战略必须使与数据相关的工作专业化:包括数据管家和数据科学家。一个不能离开另一个而存在。你可以拥有公司里最好的数据科学家,但是如果数据管家丢失了,他们不知道他们的数据有什么用,质量仍然不够好,无法进行任何准确的分析。如果你有最好的数据管家,但缺乏数据科学家,你就白白坐在了一座金山上。

5。我能从中得到什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Riccardo AnnandaleUnsplash 上拍摄

这是许多企业领导人在实施数据战略时会问你的典型问题。

虽然为执行数据策略所需的投资定价更容易,但量化其收益可能更困难。

然而,在我看来,这是至关重要的。您必须花时间确定容量释放、资源减少、硬件节省、质量差成本降低、决策速度提高

只要有适当的知识,所有这些方面都可以而且必须量化。通过这种方式,每当你开始一个项目时,你就可以让你的管理层兴奋起来,把你正在推动的节约或复杂性降低摆在桌面上

通过这样做,接受和认同的程度将会提高。

我见过为了把数字这个词放在网站上而采取数字策略的案例。但我也看到了成功的实施以及随之而来的强大的财务价值。

根据我的经验,这五项是验证您的数据策略并了解它是否足以全速前进的良好检查。

“没有数据,你只是另一个有观点的人”——w·爱德华·戴明

Luca Condosta(博士)是一名金融专业人士,拥有跨国企业的全球经验。对数据、领导力、战略和人充满热情。两本书的作者(可持续发展报告Natuzzi——意大利和谐制造者)喜欢寻找和分享故事。

你真的需要一个数据湖吗?

原文:https://towardsdatascience.com/do-you-really-need-a-data-lake-7faccb8c550d?source=collection_archive---------48-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编辑来自 Pixabay 的照片

让我帮你决定。

长期以来,数据湖在业界引起了相当大的轰动,并且通常被认为是所有数据问题的一站式解决方案。围绕数据湖的讨论误导了组织去设计那些对商业没有真正价值的数据湖。此外,多年来,关于数据沼泽的恐怖故事只会鼓励怀疑。如果您正在争论是否有必要建立一个数据湖来加强您的数据策略,那么这篇文章将为您提供一些启示,以便您能够做出决定。

您是否厌倦了从没有逻辑集中存储区域的不同系统中提取数据?

对于大多数处理各种数据源的组织来说,这是一个普遍问题。缺乏用于分析工作负载的集中式数据存储迫使数据消费者创建本地化系统,通常仅限于少数用户进行报告和分析。几个非标准化的流程最终导致数据孤岛的产生,这些数据孤岛有可能滚雪球般变成对数据访问、一致性和准确性的主要担忧。

数据湖架构可以将数据集中在分布式存储上,从而提供可扩展、快速、安全且经济的解决方案。这一点,加上强大的数据治理,最终可以解决数据孤岛问题,并使组织内的数据民主化。这些解决方案可以部署在内部、云中甚至混合基础架构上。

你是否会因为存储旧数据的成本很高而简单地删除它们?

随着数据的增长,数据库管理系统需要更多的计算能力,这导致许多设计决策,如分区和横向扩展,从而进一步增加费用。当成本不断上升时,IT 开始将数据归档,要么作为压缩数据库备份保存到更便宜的存储设备或平面文件中,要么在大多数情况下最终删除这些数据。存档数据或删除数据以降低费用可能会对 数据货币化 机会不利。

可以设计一个数据湖体系结构来实施数据保留策略,从而缓解控制数据增长的压力。借助便宜的 分层 存储,您可以轻松应用精心规划的保留策略并存储大量数据,而不会增加您的预算并大幅降低业务流程的开销。

您是否经常随着数据结构的变化而调整数据库?

如果您使用的是关系数据库,并且源数据的模式一直在变化,那么您要么忽略了正在进行的变化并可能丢失有价值的信息,要么花费资源调整数据库以适应源模式。不管怎样,你都不会赢。

数据湖允许存储原始数据(结构化/非结构化/半结构化),而无需运行任何前期 ETL 过程。您不会丢失正在进行的数据更改,还可以节省调整数据库表结构、ETL 管道等方面的费用。您(或消费者)可以在读取数据时定义数据的结构,而不是在存储数据时定义数据的结构(检查schema-on-read),这使得授权消费者可以以他们喜欢的任何方式读取数据。双赢。

您是否有不同的数据消费者需要相同数据集的不同形式?

并不是组织中的每个人都希望以一种特定的形式或方式消费数据。一些消费者需要符合其部门需求的关系形式的干净、结构化和必要的数据,一些消费者需要原始数据来运行机器学习实验,一些消费者属于受限类别并消费屏蔽数据。在传统平台中解决这些需求变得很麻烦(也很昂贵)。

一旦将原始数据存储在数据湖中,您就可以创建数据的逻辑视图,以便用户以他们想要的形式使用数据。您甚至可以创建流程,将结构化形式的数据存储到数据仓库中,并应用匿名化规则将数据推送给外部消费者。

你理解数据湖的概念吗?

关于数据湖有许多神话,在做出决定之前了解一些事实是很重要的。

  1. **数据湖是一个概念,不是一个产品。**数据湖不是亚马逊 S3 或 Azure 数据湖存储或 Hadoop,而是一种指导如何在对象存储(如亚马逊 S3、ADLS、HDFS)或多个存储组件中存储和组织数据的架构。
  2. 数据湖并不能取代数据仓库。这是关于数据湖最大的困惑。以至于,当你在谷歌上搜索术语*“数据湖”*,你会发现大多数人把数据湖比作数据仓库。数据湖允许数据以原始格式存在,而数据仓库是存储经过处理、清理、结构化和感兴趣的数据的地方。数据湖和数据仓库是相互补充的概念,而不是相互替代的。
  3. 数据湖需要治理。您可以不经任何处理将原始形式的数据接收到数据湖中,但是一旦数据存储到数据湖中,就需要对其进行适当的编目、管理和控制,以确保数据只能被授权用户跟踪、识别和访问。
  4. **数据湖不是一个通用的架构。**数据湖的设计因组织和使用案例而异。一个组织可以决定构建多个数据湖,或者一个数据湖可以服务于多个组织。无论哪种情况,具体的设计决策都是基于业务战略、基础设施、技术选择和人员技能做出的。

最后…

数据湖确实有巨大的好处,对于许多热衷于制定数据战略的组织来说,它可能是一个有吸引力的提议。你必须仔细审查它是否能解决你的业务问题,是否能与你组织中的其他技术平台很好地集成,以及是否能为企业创造真正的价值。做出好的 设计决策 并确保在整个组织中建立数据治理规则以使用数据湖是至关重要的。最重要的是,正是这些人能够让这一切成功,你将不得不支持和培养正确的技能,并鼓励一种 数据驱动的文化

深度学习真的需要 GPU 吗?

原文:https://towardsdatascience.com/do-you-really-need-a-gpu-for-deep-learning-d37c05023226?source=collection_archive---------21-----------------------

意见

获得一个 GPU 是深度学习的必备条件吗?了解 GPU 及其优势,并探索替代方案

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡斯帕·卡米尔·鲁宾在 Unsplash 上的照片

我一直是一个超级游戏迷,也是一个游戏迷。

从小到大,我看到的对显卡的唯一要求就是为了游戏的目的。

我很幸运,在我开始涉足人工智能和数据科学,尤其是深度学习之后,我意识到了显卡的真正潜力。

这几乎就像梦想成真。这就像是一箭双雕,因为我可以利用同一个显卡进行游戏以及学习和研究。

**注意:**GPU 和显卡的意思差不多,在本文中会互换使用。

GPU 针对训练人工智能和深度学习模型进行了优化,因为它们可以同时处理多个计算。它们拥有大量内核,可以更好地计算多个并行进程。

在本文中,我们将了解 GPU 和 CUDA 到底是什么,然后探讨图形处理单元的优势,以及如果您预算紧张,何时应该考虑购买它。最后,我们将讨论替代方案。

事不宜迟,让我们开始理解这些概念。

GPU 到底是什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Nana DuaUnsplash 上拍摄

图形处理单元是一种专用的电子电路,设计用于快速操作和改变存储器,以加速在帧缓冲器中创建图像,用于输出到显示设备。

GPU 是现代计算的关键部分。GPU 计算和高性能网络正在改变计算科学和人工智能。GPU 的进步为今天深度学习的发展做出了巨大贡献。

NVIDIA 提供了一种名为计算统一设备架构(CUDA) 的东西,这对支持各种深度学习应用至关重要。

CUDA 是 Nvidia 创建的并行计算平台和应用编程接口模型。它允许软件开发人员和软件工程师使用支持 CUDA 的图形处理单元(GPU)进行通用处理,这种方法称为 GPGPU。

这些 CUDA 核心在人工智能领域是高度有益和进化的。我们将在下一节进一步讨论这个话题。

GPU 的优势

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Rafael Pol 在 Unsplash 上的照片

如前所述,NVIDIA GPUs 提供了 CUDA 内核的支持。

每种显卡的 CUDA 内核数量各不相同,但可以肯定的是,大多数显卡通常至少有 1000 个以上的内核。

当您使用 TensorFlow 或 Pytorch 等深度学习框架时,与使用 CPU 的相同性能相比,您可以利用这些 CUDA 核心来计算您的深度学习算法,速度要快得多。

虽然 CPU 一次只能执行少量操作,但 GPU 可以一次执行数千次这样的操作。仅举一个假设的例子,在一个质量不错的 GPU 的帮助下,一个需要在 CPU 上训练 2-3 个小时的任务可能在大约 10 分钟内完成。

GPU 是计算机视觉和超级计算的动态资源,具有深度学习和神经网络,可以执行复杂的任务,有时甚至超出人类的想象。

此外,GPU 还有许多其他应用。GPU 在嵌入式系统、移动电话、个人电脑、工作站和游戏控制台中都有应用。

您可以充分利用这些显卡来完成其他任务,如游戏和玩 AAA 游戏(AAA 游戏基本上是一种非正式的分类,用于由中型或大型发行商制作和发行的视频游戏,通常具有较高的开发和营销预算。)或其他需要 GPU 的图形软件用途,以及动画和设计。

GPU 在机器人领域也有巨大的应用范围,使高科技机器人能够通过集成人工智能来感知环境。

汽车行业对基于深度学习的自动驾驶汽车的应用也有很高的需求。为了改变未来,在这些汽车的开发上投入了大量的资金。

最后但同样重要的是,通过将数据用于理想的图像分割任务和其他医疗应用,这些 GPU 还可以在医疗保健和生命科学的医疗领域中找到各种应用。

什么时候应该考虑?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Viacheslav BublykUnsplash 拍摄

显卡挺贵的!

尤其是当你预算紧张的时候,你可能会很难决定是否要买显卡。那么,关于这个问题,你怎么能得出一个合理的结论呢?

我想提供的一个个人建议是,确保你在数据科学领域挖得更深。了解机器学习的概念,对深度学习有基本的概念理解。

如果你非常确定和自信地认为深度学习是你感兴趣的事情,并希望进一步探索这个有趣的话题,那么请放心地为自己购买一个。

如果您想知道在直接投入之前是否有任何替代选择或免费工具来测试该主题,那么您很幸运,因为有许多这些资源可用。

让我们研究一下这些替代办法和其他可行的选择。

可供选择的事物

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尤金尼奥·马佐尼在 Unsplash 上的照片

如果你想测试深度学习,或者你已经得出结论,你不需要显卡,那么你可以选择什么样的替代品来进行深度学习?

首先,如果您想在自己的个人计算机上工作,并且您有一个能够进行一般计算的中等 CPU,那么您可以选择安装 TensorFlow 的 CPU 版本。这个简单的安装可以通过一个简单的 pip 命令来完成,如下所示:

pip install tensorflow

对于简单的深度学习计算,如处理 MNIST 数据集,如果您想利用 CPU 或 GPU 版本,不会有很大的区别。对于初级深度学习项目来说,CPU 版本应该很好。

然而,如果你想要实践经验和使用 GPU 的感觉,那么你可以在谷歌合作实验室谷歌实验室上完全免费地这样做。这是谷歌研究的一个产品。 Colab 允许任何人通过浏览器编写和执行任意 python 代码,特别适合机器学习、数据分析和教育。

在接下来的一周,我将会写两篇关于 Jupyter 笔记本和 Google Colab 的文章。如果你想了解使用它们的详细指南,请继续关注。

其他选择包括创建一个 AWS 云实例或使用 IBM Watson Studio,以及其他一些方法,在这些方法中,您可以为在云上使用 GPU 支付少量费用。

根据我的经验,这些是一些可供选择的方法。如果你有更好的替代建议,请在评论区告诉我。

但是有了这些替代品,你应该很容易就能自己探索深度学习,并对这个主题有一个基本的了解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

约翰·汤纳在 Unsplash 上拍摄的照片

结论

在本文中,我们讨论了 GPU 到底是什么以及它的众多优点。我还建议什么时候是考虑为自己拥有一个 GPU 的最佳时机。我们还检查了各种替代方案,这些方案可以帮助您在学习深度学习基础知识时茁壮成长,即使没有 GPU 也是如此。

所以,要回答“深度学习真的需要 GPU 吗?”简单来说—

如果你是一个初学者,你才刚刚开始,那么绝对不要。但是,如果你更认真,获得了更敏锐的理解和知识,想用深度学习走得更远,那么强烈推荐。

看看我的其他一些文章,你可能会喜欢读!

[## 机器学习和数据科学项目的 10 步终极指南!

详细讨论构建您的机器学习和数据科学项目的最佳方法…

towardsdatascience.com](/10-step-ultimate-guide-for-machine-learning-and-data-science-projects-ed61ae9aa301) [## 分步指南:使用 Python 进行数据科学的比例采样!

了解使用 python 进行数据科学所需的比例采样的概念和实现…

towardsdatascience.com](/step-by-step-guide-proportional-sampling-for-data-science-with-python-8b2871159ae6) [## 2020 年及以后最受欢迎的 10 种编程语言

讨论当今 10 种最流行的编程语言的范围、优缺点

towardsdatascience.com](/10-most-popular-programming-languages-for-2020-and-beyond-67c512eeea73) [## OpenCV:用代码掌握计算机视觉基础的完全初学者指南!

包含代码的教程,用于掌握计算机视觉的所有重要概念,以及如何使用 OpenCV 实现它们

towardsdatascience.com](/opencv-complete-beginners-guide-to-master-the-basics-of-computer-vision-with-code-4a1cd0c687f9)

谢谢你们坚持到最后。我希望你们都喜欢这篇文章。祝大家有美好的一天!

你真的需要垃圾桶吗?

原文:https://towardsdatascience.com/do-you-really-need-trash-cans-6837921d127c?source=collection_archive---------28-----------------------

用机器学习预测下一次投球

2019-2020 MLB 休赛期被休斯顿太空人队在 2017 年世界职业棒球大赛获胜赛季期间窃取对方投手标志的消息所主导。这是通过在球员休息区外观看来自中外场的现场摄像,并通过敲打垃圾桶向击球手传达下一次投球来实现的。这让我想到,“机器学习能预测接下来会是什么样的投球吗?你甚至需要偷窃标志,或者只是一台电脑?”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

莱斯莉·华雷斯在 Unsplash 上的照片

太空人计划

到目前为止,Astros 计划已经被很好地覆盖了。我不会深究他们作弊的细节,但有两件具体的事情与用机器学习预测下一次投球的目标有关。首先,他们似乎只有在下一个球不是快速球的时候才会去砸垃圾桶。这意味着他们没有指定具体的投球类型,而只是在投球速度变慢时进行交流。第二个是来自棒球计划书的 Rob Arthur 确定太空人在 93%的时间里正确地判定了一个非快速球向本垒板飞来。

“总的来说,宇航员们倾向于获得正确的信号,但这并不完美。当他们重击易拉罐时,他们是最准确的:当他们这样做时,一个非快速球在途中的概率为 93%,而他们错误的概率为 7%。…根据亚当斯的数据,太空人经常使用垃圾桶,而且相对准确,敲打时比安静时更准确。"

(来源:https://blogs . fangraphs . com/the-most-important-bangs-of-the-astros-scheme/)

因此,为了让我们的机器学习模型能够与 Astros 的方案相媲美,它必须预测快速球和非快速球之间的投球,并且以相当高的准确度进行预测。

数据

将分析和机器学习应用于棒球的伟大之处在于,有大量的数据可以免费获得并且容易访问。由于我使用的是 Python,所以我选择了使用 pybaseball Python 包,它为 Statcast 数据提供了一个包装器,其中包含了在 MLB 投掷的每一个球的条目,包括游戏状态,比如第几局,谁在垒上,以及当前的计数。还包括投手用什么手投球和击球手的姿势。至关重要的是,Statcast 还提供了投掷的类型及其速度。在此基础上,我创建了一个前一个音高和前一个音高速度列。

一旦数据从 Statcast 中提取出来并稍加处理,我就把它分成一个训练集和一个测试集。在训练过程中出现的一个问题是,棒球的主要投球是快速球,因此投手投快速球的情况比投非快速球的情况多得多。这种不平衡意味着机器学习算法通过预测下一个投球总是会是快速球而获得了非常好的准确性。显然这不是很有帮助,所以为了解决这个问题,我使用了 SMOTE 来创建合成的非快速球训练数据,给我们留下了所有不同类型球场之间的平衡训练数据集。

在这次分析中,我们将使用两个不同的数据集,一个由何塞·贝里奥斯从 2017 赛季开始到 2019 赛季结束的投球组成,另一个由 2019 年 4 月 1 日至 2019 年 4 月 7 日期间 MLB 队每场比赛的所有投球组成。这两个数据集将让我们看到,与全联盟在特定情况下决定投什么球的偏好相比,个人投手的习惯是否更容易预测。

对于这两个不同的数据集,我还创建了每个数据集的一个版本,该版本只包含投球是快速球还是非快速球。对于这个版本的数据,我认为四缝线快速球、两缝线快速球和切球是“快速球”,其他的都是非快速球。我有根据地猜测,这也是太空人认为的快速球。

模特们

我从一些“基本”的机器学习模型开始,如决策树、支持向量机和 k 近邻。这些模型在所有数据集上的准确率都很低(低于 50%)。然后,我决定将数据输入两个不同的神经网络:一个用于数据集的一个版本。

何塞·贝里奥斯模型

这些模型比我们的其他方法实现了更好的准确性,多间距分类器在测试集上实现了 74%的准确性,快速球/非快速球分类器实现了 58%的准确性。我不清楚为什么这两个分类器之间会有这样的差异,但是让我们深入研究它们产生的混淆矩阵。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

何塞·贝里奥斯全音高预测器的混淆矩阵

查看上面的混淆矩阵,我们可以通过查看矩阵的对角线来了解给定类型的音高有多少与预测类型相匹配。例如,该模型正确预测了 52%的弧线球。查看矩阵中的行可以告诉你有多少百分比的真实音高被错误地归类为不同类型的音高。观察曲线球行(标记为“CU”),我们可以看到 52%的模型成功预测,而 20%的时间预测变速球将是下一个投球。第二个被预测最多的是双线快速球,有 18%的几率,接下来是四线快速球,有 10%的几率。如果你把这变成敲打垃圾桶,大约 30%的时间你会是错误的。虽然这个模型的真实精度相当好,但将其预测转化为可操作的结果将是困难的,仍然远远落后于 Astros 的精度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

何塞·贝里奥斯的快速球/非快速球预测者的混淆矩阵

以上是快速球/非快速球分类器的混淆矩阵。如你所见,我们的真实阳性率和真实阴性率非常相似,这使我们的准确率达到了 58%。与多音调分类器不同,结果相对平衡。这是一件好事,因为我们希望减少误报和漏报的数量,但这两个百分比都会给我们的垃圾桶攻击者带来更糟糕的结果:只有大约 60%的时间他们是正确的。也许我们全联盟的数据会更好?

联盟范围内的模型

在测试集上,联盟范围内所有投球的分类器准确率为 88%,但像以前一样,让我们看看下面的混淆矩阵:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

全联盟全音高预测值的混淆矩阵(音高缩写参考:https://www.daktronics.com/support/kb/Pages/DD3312647.aspx

正如你所看到的,与特定于投手的模型相比,在提高垃圾桶爆炸的准确性方面没有太大的改进。该模型正确地预测了四缝线快速球被投出的概率是 43%,而它预测曲球或滑球被投出的概率是 20%。包括一个两缝线快速球的预测让我们正确地预测球会是四缝线快速球或是两缝线快速球的概率只有 51%。显然还不够准确,击球手无法从模型中获得任何好处。也许快速球/非快速球分类器这次会产生更好的结果?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

全联盟快速球/非快速球预测者的混淆矩阵

所以,显然这也不是一个好结果。测试集的准确率为 57%,正如混淆矩阵所示,假阳性的数量非常高。这意味着我们的垃圾桶在 54%的时间里会砰击一个快速球,而它只应该砰击一个非快速球。分类器在预测非快球何时到来方面做得稍好,但仍有 32%的假阴性率。这意味着垃圾桶在 32%的非快速球被投出的时候不会被撞。这个模型对击球手毫无帮助。

结论

在这个项目中,我认为机器学习可能能够以足够高的精度预测下一次投球,这对击球手可能是有益的。显然不是这样的。即使某些模型产生了大于 75%的准确度,假阳性和假阴性率也足够大,以至于没有明显的益处。不同的神经网络架构和围绕每个音高的更多数据可能会产生更好的准确性,但我现在怀疑它是否会有那么大的帮助。然而,就目前而言,知道下一次推销会是什么的最好方法是作弊。

查看这里的代码:https://github . com/Parker Erickson/baseballDataScience/blob/master/next pitch prediction . ipynb

你是否纠结于量子叠加?

原文:https://towardsdatascience.com/do-you-struggle-with-the-quantum-superposition-86d0f2147bfb?source=collection_archive---------35-----------------------

实践量子计算——直观解释

本帖是本书的一部分: 用 Python 动手做量子机器学习

传统位可以是01。相比之下,量子位(称为量子位)可以处于叠加状态。量子叠加是01的线性组合。但是量子位只要你不测量,就只能处于叠加态。一旦你测量了你的量子位,它会立刻坍缩成01。就像古典音乐一样。

在这篇文章中,我们仔细观察了量子叠加,以及它的状态如何决定我们是将量子位测量为0还是1

一个量子位有两种可能的测量方式:01。因此,量子位是一个二维量子系统。每个维度都由一个标准基向量表示。在量子计算中,我们使用狄拉克符号。它表示 ket 旁边的列向量,看起来像“|ψ⟩":”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

量子位的状态由两个维度的叠加来表示。这就是量子位状态向量|ψ⟩(“psi”)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

α和β是|0⟩和|1⟩.状态的概率振幅它们的平方分别表示测量量子位的概率为0(由α^2 给出)或1 (β^2)。

|ψ⟩必须通过以下方式标准化:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们看看下图中量子位态|ψ⟩的图形表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

在此表示中,两个维度都位于垂直轴上,但方向相反。系统的顶部和底部分别对应于标准基矢量|0⟩和|1⟩。

当有两个维度时,通常的做法是把两个维度相互正交。虽然使用一个轴来表示两个维度对于二维系统来说是相当不寻常的表示,但是它非常适合于量子系统。

看看上图中的任意量子比特状态向量|ψ⟩。由于量子位状态向量是归一化的,|ψ⟩起源于中心,大小(长度)为 1/2。圆的直径是 1。由于这个相等的量级,所有的状态向量都在尖圆处结束。|ψ⟩.也是

状态向量|0⟩和|ψ⟩之间的角度称为θ(“theta”),控制向量头到系统顶部和底部的接近度(虚线)。

这些近似表示概率。

  • α^2 是衡量|ψ⟩的概率为0
  • 以及测量它的β^2 为1

接近度α和β位于它们所描述的状态概率
(|ψ⟩)的相反两侧。α是到|1⟩的接近度(或距离),因为随着到|1⟩的距离增加,测量0的概率增加。

因此,通过控制接近度,角度θ也控制了测量处于状态01的量子位的概率。

我们可以指定角度θ,并使用所需的归一化来导出α和β,而不是指定α和β之间的关系,然后对它们的值进行归一化处理。

我们可以推导出α和β的值,从而推导出状态|ψ⟩:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Python 中,双字段数组[cos(theta/2), sin(theta/2)]表示这种状态。

你想推导出这个公式吗?这里有一个小提示:泰勒斯和毕达哥拉斯定理在这里帮助你。

还有一个问题。对于θ∈R,如果π

下图显示了这种情况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

数学上,我们没有问题。因为我们平方α和β,所以它们的符号(+或)与所得概率无关。

但这意味着什么呢?如图所示,α^2 或β^2 怎么会是负数?答案是 I,I 是一个平方为负的复数:i^2=−1.

而如果α和β是复数(α,β∈C),它们的平方可以是负数。

这必然会带来很多后果。这引发了很多问题。现在,我们将垂直轴左侧的所有向量解释为β^2 (β^2<0).)的负值

虽然这样一个值让我们能够区分垂直轴两侧的量子位状态向量,但它对于所得的概率并不重要。

例如,国家

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

产生相同的测量概率01(各 50%)。它位于水平轴。也是如此

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尽管这些状态的概率相同,但它们是不同的。并且角度θ在它们之间是不同的。

θ=π/2 指定|ψ⟩=|0⟩+|1⟩/√2,也称为|+⟩.

θ=3/2 π或θ=,π/2 表示|ψ⟩=|0⟩−|1⟩√2,也称为|−⟩.

上面提到的α^2 或β^2 为负的结果之一是,我们的归一化规则需要一些调整。

我们需要将归一化方程改为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个帖子包含了很多公式。重要的一点是,我们可以指定量子态,这些量子态产生以角度θ测量01的特定概率。它描绘了一幅清晰的画面,有助于理解和记忆。

让我们来看看角度θ在 Python 代码中是如何工作的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

在这段代码中,我们引入了函数getState(第 5 行)。它将theta作为参数,并返回数组[cos(theta/2), sin(theta/2)]。这是我们在上面的等式中指定的向量。这导致有 50%的几率测量出量子位分别是01

结论

量子位及其叠加态很难解释。虽然数学为量子位是什么以及它的行为方式提供了一个清晰的定义,但对我们大多数人来说,光靠公式是不够直观的。在这篇文章中,我们提出了量子位状态的视觉解释,以及它如何决定测量量子位在状态01的概率。

把一个概念的图片放在眼前不仅有助于理解它,还能促进对它的记忆。

本帖是本书的一部分: 用 Python 动手做量子机器学习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里免费获得前三章。

你信任机器为你做决定吗?

原文:https://towardsdatascience.com/do-you-trust-machines-to-make-your-decisions-3dcab11c392c?source=collection_archive---------34-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卢克·切瑟在 Unsplash 上的照片

约翰有了一个主意。他经常有相当好的想法,但这是一个非常好的想法,他对自己非常满意。他发现,由于大多数同事使用的考勤卡系统出现异常,他的公司每个月都浪费了数千个工时。这些过程已经很多年没人看了,也没人记得为什么会有现在的协议,或者它有什么用,但是每个人都同意这是巨大的时间浪费。他决定开发一个简单的系统,在保留其核心功能的同时,将大部分程序自动化。

这是一个非常非常好的主意,正如我所说,他对自己非常满意。他在一个周一自豪地向管理层提交了他的提案,而在接下来的周五,他被召集参加一个会议,他认为这将是一个关于他的计划实施的讨论。相反,他面对的是一个冷漠无情的主管,他直截了当地告诉他这个提议不合适,然后一言不发地离开了房间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

约翰的会面并没有像这样进行(照片由奥斯汀·迪斯特尔Unsplash 上拍摄)

约翰相当恼火。他不明白为什么他的提议被拒绝,而且对主任没有花时间解释原因感到特别恼火。我们大多数人可能想知道为什么我们的推销没有成功,或者我们的应用程序有什么问题。被蒙在鼓里令人沮丧,会破坏我们对决策过程的信任。这对于算法来说更是如此——因为我们倾向于将技术拟人化当一个人工智能似乎将我们排除在外时,人们会变得非常不安。这就是为什么人工智能中的可解释性如此重要的原因之一,因为它进一步嵌入了我们的日常交易,信任变得至关重要。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由穆罕默德·哈桑来自 Pixabay

在任何一天,你或我都可能收集到成千上万个关于我们的数据点。这可能包括网络浏览行为、身体活动或消费模式。在用户的默许下,我们的个人数据被公开编辑和记录,并出售给相关方。对于谁可以购买用于预测我们未来行为和评估我们服务适用性的材料没有限制。

主要的科技公司继续成长,它们对日常生活的影响正在扩大。对于生活在发达国家的人来说,每天都接触不到谷歌、苹果、脸书、亚马逊或微软是极其困难的。软件几乎影响到人类活动的每个方面,因此收集点的范围很广。

企业或组织拥有的关于一个人的数据点越多,他们就能做出越多的决定。例如,银行会使用信用报告来评估申请人是否适合贷款。有完善的法规来管理信用报告中的可用信息、保留时间以及谁可以访问这些信息。但是直到最近,还很少有立法规定如何处理个人的个人数据。GDPR 和加利福尼亚州的 CCPA 隐私法于 2020 年 1 月生效,已经开始制定规则,规定如何以适当的方式对待这种已经变得异常珍贵的商品。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马库斯·斯皮斯克·temporausch.com 摄于派克斯

我曾在其他地方写过关于组织一旦获得这些数据后如何使用的问题。《GDPR 法案》第 22 条规定,任何个人都不能受制于完全自动化的决策过程,该过程不会以任何有意义的方式影响他们。这意味着,例如,乘客分数低的优步乘客不能被自动排除在进一步的乘坐之外。必须有一个人在循环中,以确保优步软件中的算法运行正常,乘客的分数不会因故障、错误或偏见而受到影响。

许多人担心的是这些组织对我们的信任程度。人们担心,当个人试图租车或办理电话合同时,他们可能会受到无法解释的算法的莫名其妙的影响。查理·布洛克的科技讽刺作品黑镜在“急转弯”这一集中很好地说明了这一点,在这一集中,一个角色在一系列不幸的互动后,她的算法计算社交得分大幅下降。因此,她无法在取消的航班上重新预订座位参加婚礼,在经历了几次巨大的压力后,她最终被迫接受一名卡车司机的搭车,在那里她得知司机的丈夫因社会分数低而被拒绝接受救命的医疗服务。

随着私营公司提供的服务进一步融入我们的日常生活,人工智能决策中必须有合法的人类监督。另一种选择可能会把我们引向一个怪诞的卡夫卡式的“计算机说不”的现实,在这个现实中,没有人可以挑战任何决定,没有人可以解释系统是如何工作的,也没有人承担责任。

欧盟立法者的立场是,问责制是消费者信任自动化决策的先决条件。不可否认的是,这个行为的后果是相关的——当谷歌地图选择了一条路线而不是另一条路线让你在晚上回家时,不需要解释。传统人工智能非常适合简单或琐碎的任务宋立科在 Spotify 或语音助手软件上的推荐。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

无人驾驶汽车做出的决定将需要在发生碰撞时得到解释

然而,配备面部识别技术的警方人工智能系统可能会导致错误逮捕(或更糟)。像无人机这样的现代军事系统使用人工智能过程在战场上做出瞬间决定。医疗保健甚至股票交易应用中的诊断人工智能工具,当它们以意想不到的方式运行时,都有可能造成真正的损害。如果人工智能做出的决定不透明或不可解释,那么使用这些决定就很难被证明是正当的。我们如何确定我们可以信任这些系统?我们能确定它们是在没有有偏见的训练数据的情况下开发的,或者它们没有被恶意操纵吗?如果一个封闭的 AI 系统犯了误判、股灾或战争罪,谁能被追究责任?

诸如此类的考虑促使 IBM 和谷歌等大公司开始认真对待可解释的人工智能,尽管该技术的高级应用仍处于起步阶段。任何 XAI 应用中的两个关键因素是可检查性 & 可追溯性:事后调查者必须能够精确地检查在算法中的什么地方做出了决策,以及为什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Gerd AltmannPixabay 拍摄

DARPA(开发供美国军方使用的新兴技术的机构)已经确定,XAI 算法应该产生两种输出:决策和得出决策的模型。分解到基本级别,一个完整的算法由训练数据(输入层)、深度学习过程(隐藏层)和最终产生解决方案的解释界面以及到达那里的步骤(输出层)组成。这将意味着许多现代先进的人工智能技术,就其本质而言,永远无法解释。复杂人工神经网络的“黑匣子”永远无法产生一个如何做出决策的模型。相反,开发人员一直在研究其他可能有助于解释的技术。其中包括:

LRP——逐层相关性传播——可以解释一些机器学习系统如何得出结论的更简单的技术之一。LRP 通过神经网络逆向工作,查看哪些输入与输出最相关。

LIME——本地可解释的模型不可知解释——是一个临时模型,它稍微改变(或干扰)输入,以查看输出如何变化,从而提供关于决策如何做出的见解。

保留 —反向时间注意力模型可用于医疗诊断,并利用注意力机制观察两个可能的神经网络中哪一个对决策影响最大。

最近来自 Venture Radar 的这篇文章更详细地总结了在 XAI 技术领域处于领先地位的公司,包括【DarwinAI】**,**使用了一种被称为“生成合成”的过程,以使开发人员能够理解他们的模型; Flowcast 使用机器学习技术为贷方创建预测性信用风险模型,以及Factmata旨在打击网上假新闻。

所有观点均为我个人观点,不与甲骨文共享。 请随时在 LinkedIn 上联系我

要不要用强化学习训练一辆简化的自动驾驶汽车?

原文:https://towardsdatascience.com/do-you-want-to-train-a-simplified-self-driving-car-with-reinforcement-learning-be1263622e9e?source=collection_archive---------18-----------------------

试试我们新的 LongiControl 环境

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

NeONBRANDUnsplash 上的照片

在这里,我与简·多门和克里斯托夫·弗里贝尔一起展示了这项研究。

动机

近年来,使用强化学习(RL) [1]来解决具有挑战性的游戏和较小的领域问题[2][3][4]的应用成功激增。RL 的这些成功在一定程度上是由于 RL 社区在公共开源环境模拟器(如 OpenAI 的 Gym [5])上的强大协作努力,这些模拟器可以加快开发速度,并在不同的先进策略之间进行有效的比较。

然而,许多现有的环境包含游戏而不是真实世界的问题。只有最近的出版物开始向面向应用的 RL 过渡[6][7]。在这篇文章中,我们的目标是在一个高度相关的问题:自动驾驶车辆的纵向控制中,将现实世界中的激励 RL 与易访问性联系起来。自动驾驶是未来,但在自动驾驶汽车独立地在随机的现实世界中找到自己的路之前,仍然有无数问题需要解决。

强化学习

在我们仔细研究 Longicontrol 环境之前,我们将在下面简要描述一下 RL 的基础知识。如果你熟悉 RL,可以直接跳到纵向控制部分。

强化学习(RL)是一种从与环境的交互中学习以实现既定目标的直接方法。在这种情况下,学习者和决策者被称为代理,而与之交互的部分被称为环境。交互以连续的形式进行,因此代理在每个时间步 t 选择动作,环境对它们做出响应,并以状态 Sₜ₊₁ 的形式向代理呈现新的情况。响应代理的反馈,环境以数字标量值的形式返回奖励 Rₜ₊₁ 。代理人寻求随着时间的推移回报最大化[1]。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:强化学习互动[1]

介绍了 RL 的概念后,下面是对某些术语的简要解释。详细介绍请参考[1]。

政策。政策是代理行为的特征。更正式地说,政策是从状态到行动的映射。

**目标和奖励。**在强化学习中,智能体的目标以一种称为奖励的特殊信号的形式形式化,这种信号在每个时间步从环境转移到智能体。基本上,代理人的目标是最大化其获得的标量报酬的总量,导致最大化的不是眼前的报酬,而是长期的累积报酬,也称为回报。

**探索与剥削。**强化学习的一个主要挑战是探索和利用的平衡。为了获得高回报,代理人必须选择在过去被证明特别有回报的行动。为了首先发现这种行为,必须测试新的行为。这意味着代理人必须利用已经学到的知识来获得奖励,同时探索其他行动以在未来拥有更好的策略[1]。

**问学。**很多流行的强化学习算法都是基于 Q 值的直接学习。其中最简单的是 Q 学习。更新规则如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当在状态 s 中选择一个动作 a 并遵循该动作的策略时,Q 对应于预期的未来回报。交互的回报表示为 r。Q 函数的自适应由学习速率和折扣因子控制。该策略隐含在 Q 值中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**深度确定性政策梯度(DDPG)。**寻找最佳行动需要对 Q 函数进行有效评估。虽然这对于离散的和小的动作空间是简单的(计算所有的动作,并选择具有最高值的动作),但是如果动作空间是连续的,问题就变得无法解决。然而,在许多应用中,如机器人和能源管理,离散化是不可取的,因为它们对解决方案的质量有负面影响,同时在精细离散化的情况下需要大量的存储器和计算能力。Lillicrap 等人[8]提出了一种称为 DDPG 的算法,它能够通过深度强化学习来解决连续问题。与 Q-Learning 相反,使用了演员-评论家架构。详细的描述可以在[8]中找到。

纵向控制

在纵向控制领域中,目标是车辆在给定时间内尽可能节能地完成单车道路线,而不造成事故。总之,这对应于在从 t₀T 的间隔中使用的总能量 E 的最小化,作为功率 p 的函数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据外部要求,如其他道路使用者或速度限制,必须同时满足以下边界条件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 v 为速度, a 为加速度,a_dot 为急动度,()ₗᵢₘ,ₘᵢₙ和()ₗᵢₘ,ₘₐₓ分别代表下限和上限。

规划方法

在这一点上,可能会出现这样的问题通常是如何解决的。一种可能性是规划方法。对于这些,假设路线是完全已知的,没有其他道路使用者,并且也知道驾驶员将如何使用辅助消耗装置。下图显示了一个示例性的解决方案。动态规划计算已知路线的两个速度限制之间的最有效速度轨迹。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:使用动态规划的给定路线的示例性解决方案[9]

如果路线不确定,尤其是在你前方有其他道路使用者的情况下,你可能想知道该采取哪种方法。一方面,速度限制大多是已知的,另一方面,其他道路使用者的行为是非常随机的。这通常是不可预见的。因此,不同的方法是必要的。由于强化学习能够解决随机问题,这是一个有前途的方法来解决这个问题。由于在真实交通中直接训练自动驾驶汽车太危险和低效,模拟提供了一种解决方案。可以安全地开发和测试这些算法。因此,我们将处于我们的新 RL 环境中,这将在下面介绍。

远程控制环境

正如我们之前看到的,RL 设置由两部分组成:代理和环境。我们将仔细观察环境。它独立于代理。这意味着您可以为代理测试任何算法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3:long control 可视化

环境由两部分组成。车辆和驾驶环境。首先,重点应该放在车辆上。

车辆的运动被简化为匀加速模型。模拟基于 t = 0.1 s 的时间离散化。当前速度 vₜ 和位置 xₜ 计算如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

车辆的加速度由当前车辆状态和代理选择的发动机功率产生,因此是环境的作用。由于只考虑纵向控制,所以轨道可以模拟为单车道。因此,在这一点上,一维速度 vₜ 和位置 xₜ 就足够了。

为了确定车辆的能耗,我们从真实的电动车辆中创建了一个黑盒模型。当前速度和加速度是输入变量,能量消耗是输出变量。了解了车辆模型之后,接下来的话题就是车辆行驶的景观。

图 3 示出了模拟中的轨迹实现的例子。驾驶环境以这样的方式建模,即距离是任意长的,并且任意定位的速度限制指定了任意的允许速度。这可以被认为等同于随机模拟的交通。最多提前 150 米,车辆驾驶员接收关于即将到来的速度限制的信息,从而基本上可以进行前瞻性驾驶。结果是一个持续控制问题的环境。下面列出了国家的各个组成部分。

状态 s

国家由五部分组成:

  • 速度
  • 先前加速度
  • 当前速度限制
  • 未来速度限制
  • 未来限速距离

现在的速度和限速很直观。保持最后一次加速的状态,可能不是每个人都能马上看出来的。这是计算加加速度所需要的。描述车辆加速平稳程度的大小。

行动 a

代理在值范围[-1,1]内选择一个操作。因此,代理可以在取决于状态的车辆最大和最小加速度之间进行选择。这种类型的建模导致代理只能选择有效的动作。

奖励 r

奖励函数定义了代理人对每个行为的反馈,并且是控制代理人行为的唯一方法。它是 RL 环境中最重要和最具挑战性的组件之一。在这里介绍的环境中,这尤其具有挑战性,因为它不能简单地用一个标量来表示。如果只奖励(惩罚)能源消耗,车辆将简单地静止不动。代理将了解到,从能量消耗的角度来看,简单地不驾驶是最有效的。虽然这是事实,我们都应该更经常地使用我们的自行车,但我们仍然希望代理在我们的环境中驾驶。所以我们需要一个奖励,让驾驶对代理人更有吸引力。通过比较不同的方法,当前速度和当前速度限制之间的差异被证明是特别合适的。通过最小化这种差异,代理会自动启动自己。为了仍然将能量消耗考虑在内,奖励成分与能量消耗一起维持。第三个奖励因素是由颠簸引起的。这是因为我们的自动驾驶汽车也应该能够舒适地行驶。最后,为了惩罚违反速度限制的行为,增加了第四个奖励部分。

由于 RL 是为标量奖励设计的,所以有必要对这四个部分进行加权。合适的加权并不是微不足道的,而是一个巨大的挑战。为了让您更容易开始,我们已经预先配置了适当的权重。在本文的下一部分,我们将向您展示不同权重的效果的一些例子。但是,欢迎您自己探索更好的权重。

为了能够评估不同权重的效果,有效的 RL 学习过程是必要的。这是接下来要考虑的。

示例性学习过程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4:学习过程的开始

在第一个示例中,我们看到了代理在培训开始时的动作。是的,你没看错,代理不动。所以我们让他训练一下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5:经过一些学习过程后

开了一段时间后,他开始开车,但无视限速。这是不可取的。因此,我们让他训练更长时间:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6:在较长的训练过程之后

通过让代理训练更长时间,他也开始尊重速度限制。曲线还不完美。如果你喜欢它,只要在一个更长的学习过程后尝试一下它会是什么样子。

**可以总结一下。**代理学习舒适驾驶,甚至遵守速度限制。值得注意的是,它能够在未来正确地使用速度限制。这不是明确的编程,但他自己学会了。令人印象深刻。

多目标优化

如前所述,这个问题有几个相互依赖的目标。因此也可以进行多目标调查。为了更好地理解,我们举了三个例子。

**赏例 1。**如果只应用了移动奖励(与允许速度的偏差):代理违反了速度限制。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7:奖励权重[1,0,0,0]

**奖励例 2。**在第二个例子中,增加了对超速的处罚。这导致代理实际上保持限制。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8:奖励权重[1,0,0,1]

奖励例 3。在第三个例子中,我们添加了能量和挺举奖励。这导致代理驱动更节能,也选择更平稳的加速。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9:奖励权重[1,0.5,1,1]

这只是理解的一个例子。因此,该环境为研究多目标算法提供了良好的基础。

摘要

在本文的最后,我们将总结最重要的几点。

通过所提出的适用于 OpenAI Gym 标准化的 RL 环境,我们展示了原型化和实现最先进的 RL 算法是容易的。此外,LongiControl 环境适用于各种检查。除了 RL 算法的比较和安全算法的评估,在多目标强化学习领域的研究也是可能的。其他可能的研究目标是与已知路线的规划算法进行比较,调查模型不确定性的影响,以及考虑非常长期的目标,如在特定时间到达。

LongiControl 旨在使社区能够利用强化学习的最新策略来解决自动驾驶领域的现实世界和高影响问题。

这里有 GitHub 链接报纸和我的 LinkedIn 简介

享受使用它😉

参考

[1] R .萨顿和 a .巴尔托,强化学习简介 (1988),麻省理工学院出版社

[2] V. Mnih 和 K. Kavukcuoglu 和 D. Silver 和 A. Graves 和 I. Antonoglou 和 D. Wierstra 和 M. A. Riedmiller,用深度强化学习玩雅达利 (2013),CoRR

[3] D. Silver 和 J. Schrittwieser 和 K. Simonyan K 和 I. Antonoglou 和 A. Huang 和 A. Guez 和 T. Hubert 和 L. Baker 和 M. Lai 和 A. Bolton 等人掌握没有人类知识的围棋游戏 (2017),《自然

[4] R. Liessner 和 C. Schroer 以及 A. Dietermann 和 b . bker,混合动力电动汽车高级能源管理的深度强化学习 (2018),ICAART

[5] G .布罗克曼和 v .张和 l .彼得森和 j .施耐德和 j .舒尔曼和 j .唐和 w .扎伦巴,开放健身房。CoRR,2016。

[6] M. Andrychowicz,B. Baker,M. Chociej,R. Jozefowicz 等人学习灵巧手操作。CoRR,2018。

[7] F. Richter,R. K. Orosco,M. C. Yip,外科机器人的开源强化学习环境,CoRR,2019。

[8] T. P. Lillicrap 等人,深度强化学习连续控制 (2015),CoRR

[9] S. Uebel, 高效纵向混合动力汽车的能源管理策略(2018),TU Dresden

Docker 101:你想知道的关于 Docker 的一切

原文:https://towardsdatascience.com/docker-101-all-you-wanted-to-know-about-docker-2dd0cb476f03?source=collection_archive---------23-----------------------

Docker 入门

绝对初学者的 Docker

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

拍摄的照片谁是德尼罗? on Unsplash

你有没有被 Docker 的花哨名字吓倒过,想知道它是什么?—太好了,这篇文章是写给你的。

在这篇文章中,我们将会介绍这个魔鬼到底是什么以及它做了什么。

首先,Docker 是什么?🧐

Docker 是一个开源的容器化工具,主要用于跨不同平台快速运输和运行应用程序。Docker 快速运输和部署代码的方式大大减少了编写代码和在生产中运行代码之间的延迟。它是使用 GO 开发的,于 2013 年首次发布。

为什么是 Docker?

Docker 有一系列的优点使它变得非常有用。其中一些是:

  1. 隔离

它帮助我们创建一个与环境无关的系统。您的应用程序可以在不同的平台上顺利运行。这基本上是使用容器实现的。

便携性

因为所有的依赖项都在同一个容器中,所以很容易从一个地方转移到另一个地方,这赋予了 Docker 可移植性。

**3。轻量级

作为系统上的另一个应用程序运行,而不是消耗系统的全部资源。

**4。鲁棒性

与虚拟机相比,对硬件的要求较低,需要的内存也很少,因此提供了高效的隔离级别,不仅有助于节省成本,还有助于节省时间。

在我们深入研究之前,我们为什么需要 Docker?我们没有足够的工具吗?🤨

是的,我们有。很多,但是 Docker 不一样。这让我们的生活更轻松。我会告诉你怎么做——继续读下去。

请允许我给你一些背景资料!

背景

从前,我们习惯于在操作系统上安装软件,而操作系统安装在一组特定的硬件上——CPU、内存和磁盘。让我们快进一点,虚拟化时代已经到来。在同一个操作系统中运行多个操作系统,允许一定程度的硬件隔离。比如——用 VirtualBox 在 Windows 上运行 Ubuntu。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

容器 vs 虚拟机(图片来源:Docker.com[1])

你会发现这很酷,但是在敏捷时代,时间就是金钱,你需要持续地交付,并在每个冲刺阶段结束时提交可交付成果,追赶 IT 部门(如运营)以获得不同故事的不同开发环境(例如,需要更多内存/磁盘的资源密集型流程)可能会令人望而生畏,而且非常耗时。

别担心,码头工人来救你了。它有适合你的东西,一个名为 docker 的产品,它不仅提供了轻量级的虚拟化,还提供了基于开源 Linux 的软件,可以在任何支持 docker 实例的硬件上运行,如 Windows 或 OSX。Docker 通过使用容器实现了这种程度的虚拟化。这是一个比喻,因为它的工作方式和普通容器一样。它确实在里面储存东西。

容器是一个标准的软件单元,它将代码及其所有依赖项捆绑在一起,因此应用程序可以平稳快速地运行,而不受计算环境的影响。老实说,容器只不过是一个正在运行的进程,应用了一些额外的封装特性来保持它与主机和其他容器的隔离。[1]

你说轻巧?

Docker 容器作为可执行文件运行,与占用大量系统资源的虚拟化不同,容器就像另一个可执行的应用程序,它提供类似级别的虚拟化,但以资源高效和更安全的方式提供。由于 Docker 容器共享相同的系统资源,这使得它们很有效率。例如,在一个需要运行虚拟机的系统中,用户可以拥有不同的 Docker 容器,并拥有虚拟机中通常拥有的某种隔离级别。

容器隔离的一个最重要的方面是每个容器与其私有文件系统进行交互;这个文件系统是由 Docker 映像提供的。这实质上意味着需要更少的资源,从而降低成本。

酷,什么是形象?

不是你想的那样。它更像一台复印机。你可以用图像制作容器,就像你可以用复印机复印一样。它只不过是一个模板,包含一个应用程序,以及所有的依赖,需要运行你的应用程序,如你的代码,库,配置文件,环境变量(ex- PATH)等。该映像可以部署到不同的环境中。想知道图像和容器有什么不同吗?容器是一个图像的运行实例。

现在我们对 Docker 有了一些了解,让我们来看看它的架构。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Docker CLI(客户端)| Docker 守护进程(服务器)| Docker Hub(注册表)(图片来源:Docker.com[1])

客户端-服务器架构

Docker 命令行使用 Docker REST API 与 Docker 守护进程进行交互。Docker 客户端是命令行工具,这是用户与 Docker 交互的方式。Docker 守护进程监听 Docker 客户端 API 请求的端口,并管理图像和容器等 Docker 对象。客户端和服务器可以在同一台机器上。注册表是存储 docker 图像的地方。这是一个公共注册表,默认情况下,图像存储在 Docker hub 上。您可以使用自己选择的注册表来存储图像。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

客户端-服务器架构(图片来源:Docker.com[1])

码头枢纽

这是一个官方的在线存储库,所有 docker 图片都存储在这里,它还允许这些图片被分发。如上所述,Docker 使用基于 Linux 的 CLI 工具与 Docker 守护进程进行交互。您可以使用这个 CLI 创建您的映像并将其发布到 Docker Hub。有两种方法可以实现这一点

1.在本地创建一个映像,并将其推送到 Docker Hub。

2.创建一个 docker 文件,并使用 Docker 连续构建系统来构建映像。(首选)

在将图像推送到 Docker hub 之前,你需要一个账户(基本版是免费的,点击这里获取你的)和 Docker hub 桌面应用。这样做的先决条件是你应该在你的系统上安装 Docker(获取 Docker CE(社区版))。通过身份验证后,您可以开始将您的图像推送到 docker hub。

谁需要 Docker?

如果您需要快速一致地交付您的应用程序,您可能需要使用 Docker。主要是软件工程师、开发人员、数据工程师和数据科学家可以从 Docker 中受益。Docker 简化了软件开发生命周期,允许开发人员在标准化的环境中工作,这对于持续集成和持续交付(CI/CD)工作流来说很有吸引力。

结论

在这篇文章中,我们快速浏览了作为容器化工具的 Docker、客户机-服务器架构及其功能。在接下来的文章中,我们将探索 Docker 命令,构建您的映像,运行容器,以及处理故障。

敬请关注😊

很高兴听到你对此的想法!

如果你觉得这很有用,并且知道任何你认为会从中受益的人,请随时发送给他们。

参考资料:

[1]https://docs.docker.com/get-started

数据科学家的 Docker 最佳实践

原文:https://towardsdatascience.com/docker-best-practices-for-data-scientists-2ed7f6876dff?source=collection_archive---------12-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

码头工人…鲸鱼…你懂的。

作为一名数据科学家,我每天都与 Docker 打交道。对我来说,创建图像、旋转容器已经变得和编写 Python 脚本一样普通。这个旅程有它的成就也有它的时刻,“我希望我以前就知道”。

本文讨论了在数据科学项目中使用 Docker 时的一些最佳实践。这绝不是一份详尽的清单。但这涵盖了我作为数据科学家遇到的大多数事情。

本文假设读者对 Docker 有基本到中等程度的了解。例如,你应该知道 Docker 是用来做什么的,应该能够轻松地编写 Docker 文件,并理解 Docker 命令,如RUNCMD等。如果没有,通读这篇来自 Docker 官方网站的文章。你也可以浏览那里收集的文章。

为什么是 Docker?

自从《Docker》发行以来,它风靡了全世界。在 Docker 时代之前,虚拟机曾经填补了这一空白。但是 Docker 提供的不仅仅是虚拟机。

docker 的优势

  • 隔离—隔离的环境,无论底层操作系统/基础架构、安装的软件、更新
  • 轻量级—共享操作系统内核,避免每个容器都有操作系统内核
  • 性能——轻量级允许许多容器在同一个操作系统上同时运行

码头工人入门

Docker 有三个重要的概念。

这是一组可运行的库和二进制文件,代表了一个开发/生产/测试环境。您可以通过以下方式下载/创建映像。

  • 从图像注册表中提取:例如docker pull alpine。这里发生的是,Docker 将在本地计算机中查找名为alpine的图像,如果没有找到,它将在 Dockerhub 中查找
  • 使用 Dockerfile 文件在本地构建映像:例如docker build . -t <image_name>:<image_version>。在这里,您不是在尝试下载/拉取图像,而是在构建您自己的图像。但这并不完全正确,因为一个Dockerfile包含一个以FROM <base-image>开始的行,它寻找一个基础图像作为开始,这个基础图像可能是从 Dockerhub 中提取的。

容器——这是一个图像的运行实例。你可以使用语法``docker container run 建立一个容器,例如从alpine图像使用,docker container run -it alpine /bin/bash`命令创建一个容器。

—卷用于永久/临时存储数据(如日志、下载的数据)供容器使用。此外,卷可以在多个容器之间共享。您可以通过多种方式使用卷。

  • 创建卷:您可以使用docker volume create <volume_name>命令创建卷。请注意,如果该卷被删除,存储在此处的信息/更改将会丢失。
  • 绑定挂载一个卷:您还可以使用-v <source>:<target>语法将现有的卷从主机绑定挂载到您的容器。例如,如果您需要将/my_data卷作为/data卷安装到容器中,您可以执行docker container run -it -v /my_data:/data alpine /bin/bash命令。您在装载点所做的更改将反映在主机上。

1.创建图像

1.保持图像较小,避免缓存

构建图像时,您必须做两件常见的事情,

  • 安装 Linux 软件包
  • 安装 Python 库

当安装这些包和库时,包管理器将缓存数据,这样如果你想再次安装它们,将使用本地数据。但是这不必要地增加了图像尺寸。docker 图像应该是尽可能轻量级的。

当安装 Linux 包时,记得通过添加最后一行到您的apt-get install命令来删除任何缓存的数据。

RUN apt-get update && apt-get install tini && \
 rm -rf /var/lib/apt/lists/*

安装 Python 包时,为了避免缓存,请执行以下操作。

RUN pip3 install <library-1> <library-2> --no-cache-dir`

2.将 Python 库分离到 requirements.txt 中

您看到的最后一个命令将我们带到了下一点。最好将 Python 库分离到一个requirements.txt文件中,并使用下面的语法使用该文件安装库。

RUN pip3 install -r requirements.txt --no-cache-dir

这很好地区分了 Dockerfile 做“Docker 的事情”和不(明确地)担心“Python 的事情”。此外,如果您有多个 docker 文件(例如用于生产/开发/测试),并且它们都希望安装相同的库,您可以轻松地重用该命令。requirements.txt文件只是一堆库名。

numpy==1.18.0
scikit-learn==0.20.2
pandas==0.25.0

3.修复库版本

注意在requirements.txt中我是如何冻结我想要安装的版本的。这一点非常重要。因为否则,每次构建 Docker 映像时,您可能会安装不同东西的不同版本。属地地狱是真实的。

运行容器

1.拥抱非根用户

当您运行容器时,如果您没有指定一个用户来运行,它将假定为root用户。我不想撒谎。我天真的自己曾经喜欢使用sudo 或者root来按照我的方式做事(尤其是绕过许可)。但如果我学到了一件事,那就是拥有不必要的特权是一种恶化的催化剂,会导致更多的问题。

要以非根用户的身份运行容器,只需

  • docker run -it -u <user-id>:<group-id> <image-name> <command>

或者,如果你想跳到一个已存在的容器中去,

  • docker exec -it -u <user-id>:<group-id> <container-id> <command>

例如,您可以通过将<user-id> 指定为$(id -u)并将<group-id>指定为$(id -g)来匹配主机的用户 id 和组 id。

注意不同的操作系统如何分配用户 id 和组 id。例如,您在 MacOS 上的用户 ID /组 ID 可能是 Ubuntu 容器中预先分配/保留的用户 ID/组 ID。

2.创建非特权用户

我们可以以非 root 用户的身份登录我们的主机——远离主机——这太棒了。但是如果你像这样登录,你就是一个没有用户名的用户。因为,显然容器不知道用户 id 来自哪里。每次你想把一个容器或exec变成一个容器时,你需要记住并输入这些用户 id 和组 id。因此,您可以将这个用户/组创建作为Dockerfile的一部分。

ARG UID=1000
ARG GID=1000
  • 首先在Dockerfile上增加ARG UID=1000ARG GID=1000UIDGID是容器中的环境变量,您将在docker build阶段向其传递值(默认为 1000)。
  • 然后使用RUN groupadd -g $GID john-group在映像中添加一个组 ID 为GID的 Linux 组。
  • 接下来,使用useradd -N -l -u $UID -g john-group -G sudo john在映像中添加一个用户 ID 为UID的 Linux 用户。您可以看到,我们正在将john添加到sudo组中。但这是可有可无的事情。如果你 100%确定你不需要sudo的许可,你可以省去它。

然后,在映像构建期间,您可以传递这些参数的值,例如,

  • docker build <build_dir> -t <image>:<image_tag> --build-arg UID=<uid-value> --build-arg GID=<gid-value>

举个例子,

  • docker build . -t docker-tut:latest --build-arg UID=$(id -u) --build-arg GID=$(id -g)

拥有非特权用户有助于您运行不应该拥有 root 权限的进程。例如,当 Python 脚本所做的只是从一个目录(例如数据)读取和向一个目录(例如模型)写入时,为什么要以 root 用户身份运行它呢?还有一个额外的好处,如果您在容器中匹配主机的用户 ID 和组 ID,那么您创建的所有文件都将拥有您的主机用户的所有权。因此,如果您绑定装载这些文件(或创建新文件),它们看起来仍像是您在主机上创建的。

创建卷

1.使用卷分离工件

作为一名数据科学家,很明显你将与各种工件(例如数据、模型和代码)打交道。您可以将代码放在一个卷中(如/app),将数据放在另一个卷中(如/data)。这将为您的 Docker 映像提供一个良好的结构,并消除任何主机级的工件依赖性。

我说的工件依赖是什么意思?假设你在/home/<user>/code/src有代码,在/home/<user>/code/data有数据。如果将/home/<user>/code/src复制/挂载到卷/app并将/home/<user>/code/data复制/挂载到卷/data。如果代码和数据的位置在主机上发生变化,也没有关系。只要您挂载这些工件,它们将总是在 Docker 容器中的相同位置可用。因此,您可以在 Python 脚本中很好地修复这些路径,如下所示。

data_dir = "/data"
model_dir = "/models"
src_dir = "/app"

您可以使用COPY将必要的代码和数据放入图像

COPY test-data /data
COPY test-code /app

注意test-datatest-code是主机上的目录。

2.开发期间绑定安装目录

关于绑定挂载的一个伟大之处在于,无论你在容器中做什么,都会被反射到主机上。当您正在进行开发并且想要调试您的项目时,这非常有用。让我们通过一个例子来看看这一点。

假设您通过运行以下命令创建了 docker 映像:

docker build <build-dir> <image-name>:<image-version>

现在,您可以使用以下方式从该图像中建立一个容器:

docker run -it <image-name>:<image-version> -v /home/<user>/my_code:/code

现在,您可以在容器中运行代码,同时进行调试,对代码的更改将反映在主机上。这又回到了在容器中使用相同的主机用户 ID 和组 ID 的好处。您所做的所有更改,看起来都来自主机上的用户。

3.切勿绑定装载主机的关键目录

有趣的故事!我曾经将我的机器的主目录挂载到一个 Docker 容器中,并设法更改了主目录的权限。不用说,我后来无法登录到系统,花了好几个小时来解决这个问题。因此,只装载需要的东西。

例如,假设您有三个想要在开发期间挂载的目录:

  • /home/<user>/my_data
  • /home/<user>/my_code
  • /home/<user>/my_model

您可能很想用一行代码安装/home/<user>。但是写三行代码来分别挂载这些单独的子目录绝对是值得的,因为这将为您节省几个小时(如果不是几天)的时间。

其他提示

1.知道添加和复制的区别

你可能知道有两个 Docker 命令叫做ADDCOPY。有什么区别?

  • ADD可用于从网址下载文件,使用时如,ADD <url>
  • ADD当给定一个压缩文件(如tar.gz)时,会将文件提取到所提供的位置。
  • COPY将给定的文件/文件夹复制到容器中的指定位置。

2.入口点和 CMD 的区别

我想到的一个很好的类比是,把ENTRYPOINT想象成一辆汽车,把CMD想象成汽车中的控制装置(例如加速器、刹车、方向盘)。它本身什么都不做,它只是一个容器,你可以在里面做你想做的事情。它只是等待您将任何传入的命令推送到容器中。

命令CMD是容器中实际执行的内容。例如,bash会在你的容器中创建一个 shell,这样你就可以像在 Ubuntu 的普通终端上工作一样在容器中工作。

3.将文件复制到现有容器

又来了!我已经创建了这个容器,但忘了将这个文件添加到图像中。建立图像需要很长时间。有没有什么方法可以欺骗我并把它添加到现有的容器中?

是的,有,你可以使用docker cp命令。简单地做,

docker cp <src> <container>:<dest>

下一次你跳进容器时,你会在<dest>看到复制的文件。但是请记住,在构建时实际更改Dockerfile来复制必要的文件。

3.结论

太好了!这是所有的乡亲。我们讨论过,

  • 什么是 Docker 映像/容器/卷?
  • 如何写好 Dockerfile 文件
  • 如何以非根用户的身份启动容器
  • 如何在 Docker 中进行正确的卷安装
  • 以及使用docker cp拯救世界等额外提示

现在你应该有信心看着 Docker 的眼睛说“你吓不倒我”。玩笑归玩笑,知道你在 Docker 上做什么总是值得的。因为如果你不小心的话,你可能会使整个服务器瘫痪,并扰乱在同一台机器上工作的其他人的工作。

如果你喜欢我分享的关于数据科学和机器学习的故事,考虑成为会员吧!

[## 通过我的推荐链接加入媒体

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

thushv89.medium.com](https://thushv89.medium.com/membership)

Docker 撰写

原文:https://towardsdatascience.com/docker-compose-44a8112c850a?source=collection_archive---------31-----------------------

完全指南

在本节中,我们将使用 Docker 开发的名为 Voting App 的示例应用程序来了解 Docker Compose、它的文件和命令。

  1. 简介
  2. Docker 文件
  3. 基本对接命令
  4. 端口和卷映射
  5. Docker 联网
  6. 码头仓库
  7. Docker Compose(你在这里!)
  8. 删除 Docker 实体

投票应用是一个用 Python 写的 Flask 应用,用来在猫和狗之间投票。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Python 中的 Web 应用程序

这个投票然后被传输到 Redis,Redis 在这里充当内存中的 DB。工人应用程序,用。NET,然后处理这个投票并将其插入持久数据库——这里是 Postgres 容器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

投票应用

最后,投票结果通过用 NodeJS 编写的 web 应用程序显示出来。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

NodeJS 中的 Web 应用

我强烈建议您克隆这个应用程序并试用它,即使您对 Docker Compose 一无所知。如果你能意识到这些服务运行在 5 个不同的容器上,你就有动力继续阅读。

git clone git@github.com:dockersamples/example-voting-app.gitcd example-voting-app/docker-compose up

接下来,我们看看 docker-compose 文件。这是一个简单的 YAML 文件,以服务名及其细节开始,包括创建它的映像、要映射的端口、要链接的其他服务等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

简单 Docker 合成文件

这里我们假设每个图像都是预先构建的,并且可以在 Docker 注册中心(在我们的例子中是 Dockerhub)上获得。为了能够在我们的 Docker 主机上构建服务,这就是我们将为投票、结果和工作者图像所做的,我们必须在 docker-compose 文件中用 build 属性替换 image 属性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

简单 Docker 合成文件

由于 docker-compose 文件多年来持续快速的发展,它有几个版本。从版本 1 到版本 2 的变化是将服务移入服务标签,并在第一行添加版本标签。此外,您不再需要链接,因为默认情况下,每个容器都使用桥接网络连接到其他容器。添加 depends_on 是为了支持在依赖关系的情况下,先完成一些容器的构建。对于本教程的有限范围来说,版本 2 和版本 3 基本上是相同的。请记住 Docker Swarm 和其他容器编排软件(如 Kubernetes)的几个特性是在 docker-compose 的第 3 版中添加的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Docker 合成文件的各种版本

如果您希望将面向客户端的应用程序的流量与后端应用程序隔离开来,您可以通过添加两个网络(前端层和后端层)来修改 docker-compose 文件,并说明哪个服务位于哪个网络上。

注意,这不是一个完整的 docker-compose 文件,为了简洁起见,我省略了其他细节。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Docker 用两个网络组成文件

运行这个 docker-compose 文件将产生如下所示的应用程序堆栈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

拥有两个网络的投票应用程序

如果您需要记住任何 docker-compose 命令,那就是 docker-compose up ,正如我们在投票应用程序示例中看到的。我还提供了其他命令的列表作为参考。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Docker 编写命令

总之,使用 docker compose,您可以打包并交付一个多容器应用程序,您的客户端只需一个命令就可以启动它。

在下一节的中,我们将看到如何删除 Docker 的各种实体并回收一些空间。

参考:

[1] Docker,编写命令行参考 (2020),Docker 文档

[2]穆姆沙德·曼南贝斯, Docker for the Absolute 初学者 (2020),KodeKloud.com

BI/数据科学开发的 Docker 示例

原文:https://towardsdatascience.com/docker-example-for-bi-data-science-development-16e305ab70fa?source=collection_archive---------32-----------------------

实践教程

我发现 Docker 对于 BI 和数据科学开发工作流来说都是一个强大的工具。减轻“它在我的机器上工作”的问题本身就是非凡的,那么为什么不从健壮的业务解决方案的开发角度出发呢?在可伸缩性、工作流效率和最小化软件依赖性/共享库冲突之间找到平衡可能是困难的。然而,我发现 Docker 在这方面是一个非常强大的解决方案。通过 Docker,我已经能够利用开发工具、框架和软件语言,而无需安装在主机上。这种方法提供了可复制的环境,包含了独立的过程。能够从特定版本的 Python 或 Julia Docker 映像进行编程和开发,而不用担心我的主机上的实际安装或依赖性兼容性问题,这是一种令人难以置信的体验(更不用说不再需要整合虚拟 Python 环境的管理)。

尽管本文给出了一个简单的例子,展示了将 Docker 集成到 BI/数据科学开发工作流中的强大功能,但它确实需要一些 Python 和 Docker 的基础知识背景。

教程概述

该示例将采用一种简单的交互式动态 ML web 应用程序的方法,该应用程序从外部数据库服务器 MS SQL Server 中提取参数依赖性。要预测的函数是笛卡尔坐标中的对数螺线函数(一个向量值函数),web app 本身会依赖于 Dash 框架(Plotly)。使用 Docker Compose,Docker 可以轻松管理多容器环境。一个容器将专用于运行模拟最终生产环境的开发 MS SQL Server。另一个容器将用于主应用程序(Docker Compose 将处理这两个容器之间的内部网络)。每个容器将引用一个环境文件,用于提供动态和可再现的环境,同时减少在任意文件中存储代码中的静态值。这些值将通过引用 YAML 文件的 Python 脚本进行连接,以确定环境变量值。这种方法可能看起来像是增加了多余的逻辑层,但是我发现这种模板方法最终会使事情变得简单得多(特别是当项目变得复杂时)。

为了管理代码结构,额外的离散 Python 文件将用于运行应用程序、为应用程序提供服务、保持预测功能、在应用程序的 GUI 结构中提供帮助,以及自动化开发数据库的播种/搭建。为了帮助搭建和播种开发数据库,我将提供一种方法,使用 Python 脚本作为该过程的启动程序,该程序调用 bash 文件在两个 SQL 文件的帮助下处理搭建方面。

示例项目要在给定的机器上运行,只需安装 Docker 和 Docker-Compose。要运行实际的 web 应用程序,请在运行 Docker Compose UP 命令之前取消 Docker 文件底部的注释。另一种方法是从正在运行的 web 应用程序容器中执行“pythondash _ app _ server . py”(名称应该是interactive-vector-valued-function-app _ dash-app _ x)。如果 web 应用程序正在运行,它应该可以从端口 8080 访问(如果需要,可以在 Docker Compose 文件中更改)。点击此处获取项目代码的副本:

[## bmurders 2/交互式向量值函数应用程序

通过 Dash 实现的交互式 ML/AI web 应用程序。这个应用程序允许最终用户修改向量的参数…

github.com](https://github.com/bmurders2/Interactive-Vector-Valued-Function-App)

DEV、PRD 和 ENV 缩写将分别用于表示开发、生产和环境的代码中。下面是项目结构的快照:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

项目文件夹概述-按作者分类的图像

主应用程序的 Dockerfile

主应用程序将从 docker 文件中派生出来,用于创建一个可重现的受控应用程序环境(针对开发和 PRD)。从 Python image 3.8.6-slim 开始,项目代码与工作目录的定义一起被复制(或者,这里可以使用 Git 引用,而不是引用项目代码的本地目录)。然后,运行命令用于应用程序预期运行所必需的依赖性和环境配置(例如,包括来自外壳的 sqlcmd )。我注释掉了 Dockerfile 的底部部分,该部分在作为非根用户启动容器时自动运行应用程序,以提升开发和测试环境。

Web 应用程序的 Dockerfile

Docker 撰写设置

除了建立容器编排配置之外,当 docker-compose UP 命令被执行时。将传入包含各自容器使用的环境变量的 env 文件。例如, dev_mssql.env 中的变量‘MSQL _ PID’将决定要启动的 mssql 服务器的类型(在本例中是 Developer)。如果在正式流程的生产环境中,请确保您的组织中存在有效的许可证,除非附加到现有的生产 SQL Server(无论是哪种情况,此示例都会复制生产环境以确保有效的调试和代码开发)。下图显示了的映射。env 文件从 docker-compose.yml 文件中复制到它们对应的 Docker 容器中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

的可视化映射。env 文件及其相应的服务

Web 应用程序文件

有一个主 web 应用程序文件( dash_app.py )用于 web 应用程序的主要功能,包括 dash 和定制包的包导入。在高层次上,应用程序布局是在导入和所需对象的初始实例化之后定义的,这为应用程序布局提供了总体布局和结构。以下是预期的应用程序视觉呈现的概述(简单明了,带有一个图表和一个参数列表,作为其下方预测函数的输入)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Web 应用程序的可视化-作者图片

布局所需的一切都可以在这里内联定义,除了对自定义导入的调用,即预测函数的选项卡式参数列表。水平选项卡列表将是一个数组,因此自定义导入 gui_setup.py 将需要一个匹配这个输入要求的输出。这是为了管理潜在的动态变化,而不需要对主应用程序 Python 文件进行大量维护。对于每个参数选项卡,滑块用于确定相应的参数值。

Web 应用程序布局

由于应用程序用户界面的简单性,Dash 框架只需要两个应用程序回调:一个用于从 GUI 角度更新参数滑块,另一个用于传递预测函数所需的输入值,并返回 plot 对象。更新 GUI 滑块很简单,如下图所示。

滑块参数值的更新功能

用于调用预测函数并返回绘图的第二个回调函数比第一个回调函数稍微复杂一些,因此将预测函数本身包装在一个单独的文件中有助于压缩这里的代码。在将输入参数传递给预测函数之后,预期的输出是一个 Pandas 数据帧,可以通过 JSON 格式使用 Plotly 进行绘制。

实时更新绘图的功能

下面的代码是用来服务应用程序的。在这种情况下,将使用女服务员(Gunicorn 是服务基于烧瓶的应用程序的另一个可靠选择)。

为 Web 应用提供服务的代码

助手类和文件

在尝试播种和搭建开发数据库之前,了解相应数据库的生产环境结构是很重要的。该项目使用一个助手 GUI 文件 gui_setup.py ,用于辅助主要的应用程序功能和呈现,它依赖于 app_config.py 文件。然后, app_config.py 文件依赖于 config.yml 文件来确定检索所需值的环境变量名。为了本文的简洁,没有明确显示所有的项目代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

提供给项目代码的应用程序配置参数概述—图片由作者提供

YAML 配置文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

config.ymlapp_config.py 的可视化关系—图片由作者提供

设定开发数据库服务器的种子

为了设置开发数据库服务器,我们将创建和播种预期的生产数据库、模式和表。这个过程的开始将包含在命令部分下的 docker-compose.yml 文件中(这在容器启动时执行)。这里,将检查一个条件,以确保我们应该通过来自 dev_app_env_vars.env 文件的环境变量继续播种开发数据库。如果这个条件成功,继续调用 Python 生成器文件,MSSQL _ db _ data _ generator . py(文件位置: app/helpers/seed_db )。用于植入/搭建开发数据库的 SQL 文件将要求在调用时传递变量(这些变量在每个文件中显示为“$( <变量>)”。sql 文件)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Docker-Compose 文件的下半部分突出显示了对MSSQL _ db _ data _ generator . py的调用—图片由作者提供

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据生成概述-按作者分类的图像

参考同一个文件MSSQL _ db _ data _ generator . py中的get _ default _ GUI _ cls _ values()函数,下面是为数据库搭建执行MSSQL _ db _ seed _ script . sh(第 26 行)后将生成的数据插入开发数据库的代码。

搭建并播种开发数据库

下面是由*MSSQL _ db _ seed _ script . sh:*调用的 SQL 代码

用于创建开发数据库的 SQL 代码

用于创建开发数据库表的 SQL 代码

预测函数

对于应用程序的预测函数,scikit-learn 的两个离散支持向量回归模型将用于分别预测向量值函数曲线的 x 和 y 分量(对数螺线)。将预测结果作为 Pandas 数据框架进行训练和返回所需的代码非常简单。因为要预测的函数不是标量函数,而是向量值函数(由两个分量参数化的直线曲线),所以务必注意 x 和 y 坐标的曲线步长。

预测功能码

web 应用程序运行的最终结果将如下所示,带有模型的选项卡式交互式参数滑块:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论

这个工作示例演示了在任何运行 Docker 的机器上同时工作的自动化方法中编排多个流程是多么容易。尽管该示例的某些部分对于简单的曲线拟合函数来说可能有些过头,例如当交互式仪表板应用程序本身已经生成值时,使用数据库来保存这些值,但是底层方法展示了在应用于业务解决方案时可伸缩性和敏捷开发的功效。

我想通过一个工作实例来分享利用 Docker 进行 BI/数据科学项目的方法。特别是考虑到 Docker 可以直接用于开发阶段,因为它减少了安装额外的软件工具或调试由于运行时不兼容问题引起的主机问题的需要。个人认为,Docker 是业务创新的有力工具。

数据科学 Docker 逐步指南

原文:https://towardsdatascience.com/docker-for-data-science-a-step-by-step-guide-1e5f7f3baf8e?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卢卡斯·范·奥尔特在 Unsplash 上的照片

在这篇文章的最后,你将通过 Docker 在你的机器上运行一个 ML 工作空间,里面有你需要的 ML 库,VSCode,Jupyter Lab + Hub,以及许多其他好东西。

关于为什么 Docker 可以改善你作为数据科学家的生活,已经有很多 说过了。我和几个朋友正在使用 Fast.ai 做一个(不)酷的深度估计项目,这时我偶然发现了@ Jeremy Howard的这条推文。

开始这篇文章的推文

碰巧我们正在使用 Docker 为项目创建我们的数据科学工作区,所以我认为解决 Jeremy 的问题并与社区分享这些知识是有意义的。

我将非常简要地回顾一下 Docker 的核心概念和优势,然后展示一个使用 Docker 建立整个数据科学工作空间的分步示例。

如果你已经知道 Docker 是什么,为什么它很棒,那么跳到分步教程

Docker 是什么?

Docker 是一个创建和部署隔离环境(即虚拟机)的工具,用于运行具有依赖关系的应用程序。

您应该熟悉的几个术语(为了便于理解,包括一个烘焙类比):

  • Docker 容器 —应用程序的单个实例,它是实时运行的。在我们的比喻中,这是一块饼干。

一块跳舞的饼干。吉菲

  • Docker Image—创建容器的蓝图。图像是不可变的,从同一图像创建的所有容器都是完全一样的。在我们的比喻中,这是千篇一律的模式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

饼干切割器。伊莎贝拉·艾奇逊 / Unsplash

  • Dockerfile —包含创建 Docker 映像时要调用的命令列表的文本文件。在我们的类比中,这是创建千篇一律的模具的指令。

制作饼干切割器。吉菲

(作为一名数据科学家)我为什么要关心?

概括地说,ML 中的 Docker 有两个用例:

  • 只运行 : 只运行容器是指你在本地 IDE 上编辑你的代码,用容器运行它,这样你的代码就在容器里面运行了。这里有一个很好的例子。
  • 端到端平台 : 端到端平台容器是指你有一个 IDE 或者 Jupyter 笔记本/实验室,以及你的整个工作环境,在容器中运行,也在里面运行代码(可以挂载的工作文件系统除外)。

我们将关注第二个用例。

在数据科学项目中使用 Docker 的原因

使用 docker 容器意味着你不必处理“在我的机器上工作”的问题。

一般来说,Docker 提供的主要优势是标准化。这意味着您可以一次定义容器的参数,并在安装 Docker 的任何地方运行它。这反过来提供了两个主要优势:

  1. 再现性: 每个人都有相同的 OS,相同版本的工具等。这意味着你不需要处理“在我的机器上工作”的问题。如果它能在你的机器上工作,它也能在每个人的机器上工作。
  2. 可移植性: 这意味着从本地开发迁移到超算集群很容易。此外,如果你像我们在 DAGsHub 一样从事开源数据科学项目,你可以 为合作者提供一种简单的方法来绕过设置的麻烦

另一个巨大优势——学习使用 Docker 会让你成为一名更好的工程师,或者让你成为一名拥有超能力的数据科学家。许多系统依赖于 Docker,它将帮助您将 ML 项目转化为应用程序,并将模型部署到生产中。

面向数据科学的 docker 容器示例

  • pytorch/pytorch —包含 pytorch 的用例 1 的简单容器
  • jupyter/scipy-notebook —用例 2 的容器,包括作为 UI 的 jupyter,以及许多 python 数据科学模块
  • Dag shub/ml-workspace-minimal—是我将在上面展示逐步指南的容器。该容器是来自 ml-tooling/ml-workspace 存储库的更新版本。原来的已经有 7 个月没有维护了,所以我创建了一个最新的版本。它结合了以下工具:
    -💫Jupyter,JupyterLab
    👾VSCode 基于 web 的 IDE。
    • 🗃 Pytorch、Tensorflow、Sklearn、Pandas 等众多流行的数据科学库&工具。
      -可通过网络浏览器访问的🖥全 Linux 桌面图形用户界面。
      —🎮通过网络浏览器轻松访问终端。
      —🔀针对笔记本电脑优化的无缝 Git 集成。
      —📈集成硬件&通过 Tensorboard & Netdata 进行训练监控。
      —🚪从任何地方通过 Web、SSH 或 VNC 在单个端口下访问。
    • 🎛可通过 SSH 用作远程内核(Jupyter)或远程机器(VSCode)。
      —🐳易于通过 Docker 在 Mac、Linux 和 Windows 上部署。

听起来很棒,对吧?!现在让我们看看如何设置它。

设置您的数据科学 docker 容器—分步指南

安装 Docker

安装 Docker 是容易和免费的。只需根据您的操作系统遵循本指南即可。

建立码头工人形象

将不在本教程中讨论。一旦我们有了想要的图像,我们的重点将是如何运行 Docker 容器。

我们将使用来自Dag shub/ml-workspace-minimal的预构建图像。它是从 GitHub 上的这个中创建的。如果你想建立或修改这张图片或任何其他图片,我推荐杰瑞米·霍华德在他的原始推文中提到的那篇文章。

Docker Run +处理所有特殊修饰符

只需运行以下命令:

docker run -d \
    -v "/${PWD}:/workspace" \
    -p 8080:8080 \
    --name "ml-workspace" \
    --env AUTHENTICATE_VIA_JUPYTER="mytoken" \
    --shm-size 2g \
    --restart always \
    dagshub/ml-workspace:latest

docker run是获取 Docker 映像(cookie cutter)并从中创建容器的命令。在我们的类比中,这是制作饼干的步骤。

这个长命令可能看起来很吓人,但是我们可以把所有这些标志想象成我们的饼干(巧克力片和夏威夷果)的配料😋).以下是对各种标志以及为什么需要它们的解释:

挂载你的工作文件系统 **-v "/${PWD}:/workspace"** 这可能是最重要的标志。它允许您在容器关闭后保留您的工作(文件),并从容器外部访问它们。

它通过将您当前的工作文件夹(在这里您执行docker run命令),表示为/${PWD},映射到容器的虚拟文件系统中的/workspace文件夹。如果你想改变这一点,你可以适当地改变这个论点。

端口转发这个参数暴露了 8080 端口。本质上,这意味着在计算机上运行这个程序后,可以通过http://{computer-ip}:8080访问您的容器。如果您在本地系统上运行这个,那么这个地址将是[http://localhost:8080](http://localhost:8080)。对于更复杂的映像,出于 API 端点等其他原因,您可能需要转发多个端口。在我们的例子中,端口是 UI 端点,它将把您带到 ML-Workspace 的主屏幕:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://localhost:8080—我的 ML-Workspace 主页

命名我们的容器 **--name "dags-workspace"** 这为我们的容器生成了一个惟一的标识符,以供将来参考。顾名思义,这个名称在您的系统中应该是唯一的,所以如果您从同一个映像创建多个容器,您需要为它们定义不同的名称。--name也有助于给我们的容器添加含义。如果不定义名字,会自动为你生成一个没有意义的。

定义环境变量**--env AUTHENTICATE_VIA_JUPYTER="mytoken"** --env标志为你的容器定义环境变量。这在不同的容器之间变化很大,因此很难给出一个通用的用例。

在我们的例子中,我们用它来定义工作区的密码。当有人第一次打开上面的链接时,Jupyter 会要求他们输入这里定义的密码。如果您在共享电脑上工作,这可能会很有用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ML 工作区请求密码

定义共享内存 **--shm-size 2g** 这个标志用来定义你的容器的共享内存(越多越好)。请记住,这与您的常规系统使用相同的 RAM,所以如果您设置得太高,可能会降低您的计算机速度。对于大多数用例来说,一个好的大小应该在2g8g之间。

定义重启策略**--restart always** --restart标志代表容器的重启策略。根据码头文件:

重启策略控制 Docker 守护程序在退出后是否重启容器。

我们使用always选项,这意味着即使系统重启,Docker 也会试图保持容器运行。这对于保持您的项目上下文完整无缺非常有用。

恭喜你!现在你已经有一个完整的 ML 工作空间在你的 docker 上运行,包括你可能需要的所有东西。

如果你想更深入一层,我推荐你去docker run 命令参考查看所有可用的标志。

附加设置

让我们回顾一下我建议你建立一个理想工作空间的几件事情。

在 Docker 中设置 Conda/虚拟环境

我们设置了一个标准化的独立机器来运行我们的 ML。如果你是第一次设置你的项目,你可能会跑去找你的环境管理器conda / pip安装一些很棒的包。

让我打断你一下。

为什么要花这么大力气去创建一个隔离的、可复制的环境,然后去安装一堆没有人知道的不同的包。您应该创建一个 Conda 或虚拟环境来管理您的软件包。如果您决定使用DAGsHub/ml-workspace-minimal容器,您应该这样做:

在 ML 工作区主页中,点击打开工具下拉菜单并选择终端。然后键入以下命令:

# Input your <env-name> and the <python-version> you want
conda create -y --name <env-name> python=<python-version>
# Activate your environment
source activate <env-name># If you have a `requirements.txt` file, you should install those requirements
pip install -U pip setuptools wheel
pip install -r requirements.txt

安装完包之后,如果您想保存项目(希望提交给 Git ),您应该通过运行以下命令来保存包列表:

# This will override your existing `requirements.txt`. 
# If you want to append, use `>>` instead of `>`
pip list --format=freeze > requirements.txt

**注意:**想知道为什么你应该使用这个命令来列出你的需求(而不是pip freeze >> requirements)?阅读本期 GitHub

包装它

现在,你已经用 Docker 建立了一个隔离的、可复制的、可移植的、令人敬畏的 ML 工作空间。我希望这篇文章对你有用,如果你有任何问题或反馈,请通过我们的 DAGsHub Discord Channel 联系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

杰西·贝利 / Unsplash 拍摄的照片

Python-Dash 和 R-Shiny 的 Docker

原文:https://towardsdatascience.com/docker-for-python-dash-r-shiny-6097c8998506?source=collection_archive---------6-----------------------

Docker & docker-compose 快速入门。以及显示新冠肺炎案例编号的仪表板示例。

您想使用 Docker & Docker Compose 部署您的数据驱动型应用程序吗?然后继续读下去,因为这篇文章会让你在几分钟内就开始运行。对于最广泛传播的数据科学/分析堆栈: Python & R

在我最近的媒体报道中,我解释了如何建立一个数据驱动的 web 应用程序,以显示冠状病毒的病例数。我用下面的两个栈创建了完全相同的 web 应用:

在本文中,我将向您展示如何使用 Docker & Compose 部署这些应用。我将首先介绍 Docker,包括 Python 和 R,稍后再介绍 docker-compose。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

托马斯·詹森在 Unsplash 上拍摄的照片

码头工人

装置

在你选择的服务器上安装 Docker 很容易——有大量的说明。例如,如果您有一个运行 Amazon Linux 的 AWS 实例(EC2) ,只需输入:

sudo yum install -y docker  # Install Docker.
sudo service docker start   # Start the service.
sudo usermod -a -G docker ec2-user  # Add ec2-user to Docker group.
sudo chkconfig docker on    # Let docker auto-start.

完美。码头工人准备好了!

Python-Dash 的 docker 文件

首先,我们要创建requirements . txt文件,包括所有必要的库。这可以使用命令来完成

pip freeze > requirements.txt

或者通过手动创建文本文件并输入库的名称。对于提到的 app ,我们需要以下库(顺便说一下, plotly 安装有破折号):

dash
pandas

然后我们准备设置 DOCKERFILE 本身。对于一个简单的 Python-Dash 应用程序,以下代码就足够了:

FROM python:3.8
LABEL maintainer "Meinhard Ploner <[dummy@host.com](mailto:meinhard.ploner@gmail.com)>"WORKDIR /codeCOPY requirements.txt /
RUN pip install -r /requirements.txt
COPY ./ ./EXPOSE 8050CMD ["python", "./app.py"]

单个命令的描述:

  • FROM …:提取标签为 3.8(=版本)的 Python 图像。
  • 标签…:可选。维护者的姓名和电子邮件。
  • WORKDIR …:设置工作目录。
  • 复制需求…:复制需求. txt 文件。
  • 运行 pip …:安装所有列为需求的库。
  • 收到。/ …:将所有文件复制到 Docker 映像。
  • EXPOSE …:设置监听端口。
  • CMD …:设置运行映像时要执行的命令。

完美。如果我们对 R 解决方案不感兴趣,我们可以跳到****docker-compose的定义。否则,请继续…

R-Shiny 的 docker 文件

在 R 上,通常不在需求文件中列出,而是直接成为 DOCKERFILE 代码的一部分。与 Python 类似,我提出了一个 DOCKERFILE,它适用于简单的应用程序,就像我在其他帖子中解释的那样。

该文件比 Python 稍微复杂一些,但仍然很紧凑:

FROM rocker/shiny:3.6.1
LABEL maintainer "Meinhard Ploner <[dummy@host.com](mailto:meinhard.ploner@gmail.com)>"WORKDIR /srv/shiny-serverRUN apt-get update \
    && apt-get install -y libsasl2-dev libssl-devRUN echo \
  'options(repos=list(CRAN="[https://cloud.r-project.org/](https://cloud.r-project.org/)"))' > \
  ".Rprofile"
RUN R -e "install.packages(c('dplyr','tidyr', 'plotly'))"ADD https://raw.githubusercontent.com/rocker-org/shiny/master/shiny-server.sh /usr/bin/COPY ./ ./EXPOSE 3838RUN chmod a+w .
RUN chmod +x /usr/bin/shiny-server.shCMD /usr/bin/shiny-server.sh

单个命令的描述:

  • 来自…:提取标签为 3 . 6 . 1(=版本)的 R-闪亮图像。
  • 标签…:可选。维护者的姓名和电子邮件。
  • WORKDIR …:设置工作目录。
  • 运行 apt-get …:安装 libssl ,这是 plotly 所需要的。在其他 Linux 实例或 Windows 上可能有所不同。
  • 运行 echo …:将 CRAN 库 URL 写入*。Rprofile* ,在后续的 R 调用中使用。
  • 运行 R …:调用 R 来安装各种包。
  • ADD …:下载 shiny-server.sh 文件并将其添加到映像中。
  • 收到。/ …:将所有文件复制到 Docker 映像。
  • EXPOSE …:设置监听端口。
  • 运行 chmod +w…:使镜像的主目录可写。
  • 运行 chmod +x…:使 shiny-server.sh 可执行。
  • CMD …:设置运行映像时要执行的命令。

就是这样。让我们继续进行作曲部分。

Docker 撰写

装置

docker-compose 的安装也很简单。从 GitHub 复制适当的二进制文件,并修复权限:

sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose

你可能想知道 uname 这个命令是干什么用的? uname 返回操作系统的基本信息。在搭载亚马逊 Linux 的 AWS EC2 上,对于“ uname -s ”给出了“ Linux ”,对于“ uname -m ”给出了“ x86_64 ”。

docker-为 Python-Dash & R-Shiny 编写文件

docker-compose . ymlYAML 文件在两个堆栈之间没有区别。但是在创建它之前,先设置一个名为“的环境文件。env "带基本应用信息:

VERSION=1.0.0
TARGET=LIVE

现在创建合成文件,在我们的例子中,它是极简的:

version: "3.7"services:
  app-name:
    build:
      context: .
    image: app-name:$VERSION
    container_name: app-name
    ports:
      - "to:from"
    environment:
      - TARGET=$TARGET
    restart: unless-stopped

将“ 应用名称 ”替换为您选择的应用名称。映像名称将使用版本号,在我们的例子中是“ app-name:1.0.0 ”。

此外,Python-Dash 应用程序通常运行在端口 5050 上,而 R-Shiny 应用程序默认使用端口 3838。因此将端口 ( “至:”)替换为:

  • Python-Dash 为 80:5050
  • 80:3838 代表 R-闪亮

除了端口 80,您还可以使用您想要服务的任何其他端口。将文件另存为 docker-compose.yml,就大功告成了。

构建并运行!

要构建图像,请使用:

docker-compose build

构建完映像后,通过键入以下命令构建并启动容器:

docker-compose up -d

选项*-d "*确保应用程序在后台运行。如果没有该选项,您将直接看到日志,这对测试设置的最初几次运行非常有用。

如果您从 GitHub 下载了应用程序代码并按照说明操作,您的应用程序将在服务器上运行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

否则,您也可以测试运行在 my EC2 实例上的应用程序:

结论

如您所见,部署一个简单的 Dash 或闪亮的应用程序没什么大不了的。即使一个应用变得更加复杂,这些例子也可以作为一个蓝图。

我希望你喜欢这篇文章,它有助于让你自己的应用程序运行起来!

Docker 网络

原文:https://towardsdatascience.com/docker-networking-919461b7f498?source=collection_archive---------19-----------------------

容器是如何与它们的宿主以及彼此通信的!

当你安装 docker 时,它会自动创建三个网络——网桥、主机和无网络。其中,网桥是容器运行时所连接的默认网络。要将容器连接到任何其他网络,您可以使用 run 命令的 - network 标志。

  1. 简介
  2. Docker 文件
  3. 基本对接命令
  4. 端口和卷映射
  5. Docker 联网(你来了!)
  6. 码头仓库
  7. Docker 撰写
  8. 删除 Docker 实体

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Docker 中自动创建的网络

网络将 172.17.x.x 范围内的 IP 分配给其中的容器。要从外部访问这些容器,您需要将这些容器的端口映射到主机上的端口。另一个自动创建的网络是主机。选择主机网络将移除 docker 主机和容器之间的任何网络隔离。例如,如果您在端口 5000 上运行一个容器,它将可以在 docker 主机上的同一个端口上被访问,而不需要任何显式的端口映射。这种方法的唯一缺点是不能对任何容器两次使用同一个端口。最后, None 网络保持容器完全隔离,即它们不连接到任何网络或容器。

这些容器可以使用它们的名字相互联系。这是通过运行在地址 127.0.0.11 上的嵌入式 DNS 实现的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

嵌入式 DNS

默认情况下,容器连接到同一个网络。如果我们希望两个容器在不同的网络上,我们该怎么办?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

默认网络

为此,我们可以使用以下命令定义一个用户定义的网络,并在运行容器时分配该网络。

docker network create \
	--driver bridge \
	--subnet 182.18.0.0/16 \
	user-def

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用户定义的网络

下一节中,我们将了解 Docker 储物件!

参考:

[1]穆姆沙德·曼南贝斯, Docker for the Absolute 初学者 (2020),KodeKloud.com

码头仓库

原文:https://towardsdatascience.com/docker-storage-598e385f4efe?source=collection_archive---------12-----------------------

Docker 数据架构和持久存储

在本节中,我们将讨论 docker 如何在本地文件系统上存储数据,了解哪些层是可写的,并加深我们对容器持久存储的了解。

  1. 简介
  2. Docker 文件
  3. 基本对接命令
  4. 端口和卷映射
  5. Docker 联网
  6. Docker 存储(你在这里!)
  7. Docker 撰写
  8. 删除 Docker 实体

在 linux 系统上,docker 将与映像、容器、卷等相关的数据存储在 /var/lib/docker 下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Linux 系统上 Docker 文件的位置

当我们运行 docker build 命令时,docker 为 docker 文件中的每条指令构建一个层。这些图像图层是只读图层。当我们运行 docker run 命令时,docker 构建容器层,这是读写层。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Docker 层

你可以在容器上创建新的文件,例如,下图中的 temp.txt 。您还可以修改属于容器上图像层的文件,例如,下图中的 app.py 。当您这样做时,会在容器层上创建该文件的本地副本,并且更改只存在于容器中,这称为写入时复制机制。这很重要,因为几个容器和子图像使用相同的图像层。只要容器还活着,容器上的文件就一直存在。当容器被销毁时,其上的文件/修改也被销毁。为了持久化数据,我们可以使用我们在上一节中看到的卷映射技术。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

写入时复制机制

您可以使用 docker volume create 命令创建一个 docker 卷。这个命令将在**/var/lib/docker/volumes**目录中创建一个卷。

docker volume create data_volume

现在,当您运行 docker run 命令时,您可以使用 -v 标志来指定使用哪个卷。这称为卷安装。

docker run -v data_volume:/var/lib/postgres postgres

如果该卷不存在,docker 会为您创建一个。现在,即使容器被销毁,数据也将保留在卷中。

如果希望将数据放在 docker 主机上的特定位置,或者磁盘上已经有数据,也可以将这个位置挂载到容器上。这被称为绑定安装。

docker run -v /data/postgres:/var/lib/postgres postgres

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具有卷映射的持久存储

下一节中,我们将了解 Docker Compose、它的文件和它的命令。

参考:

[1]穆姆沙德·曼南贝斯, Docker for the Absolute 初学者 (2020),KodeKloud.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值