如何使用 CSRF 保护来保护您的机器学习应用程序?
机器学习技巧
通过真实示例了解 CSRF 保护的内容和原因。
由 Unsplash 上的 Katarzyna Pe 拍摄
那么你已经训练好了你的 ML/DL 模型,现在考虑在云上部署它。最受欢迎的方法之一是将你的模型包装在 Flask 应用程序中,并使用 REST API 提供服务。但是请稍等,让我们为您的应用程序添加一些安全性。我将借助一个真实世界的例子简要解释代码,以及为什么考虑应用程序的安全性很重要。我将尽可能直截了当地介绍实现部分。但是首先,像任何其他教程一样,让我们了解什么是 CSRF,为什么我们真的需要它?
CSRF 到底是什么?
跨站点请求伪造(CSRF),也称为 XSRF、Sea Surf 或 Session Riding,是一种攻击媒介,它欺骗 web 浏览器在用户登录的应用程序中执行不需要的操作。
那是什么意思?让我用最简单的术语来解释它。
我正在做一个个人深度学习项目,它将一张图像(印度纸币)作为输入,并从 10、20、50、100、200、500、2000 新面值的印度货币中预测图像的类别。
**问题:**我不是一个安全人员,但是在这个项目中,我注意到我的 API 端点现在是公开的。现在的问题是,你为什么要在乎它是否暴露?这对开发者来说意味着什么?
**回答:**以我的情况来说,互联网上的任何人都可以用所需的数据向我的 app 发送合法的 POST 请求,并获得预测。你真的不希望自己处于这样的场景中,你把上传的图像和预测存储在一个 S3 桶中。如果你使用 AWS 的免费层(像我一样!),那么这些坏人可以立即消耗你的免费等级的免费配额,最终会给你这样的账单。
我在亚马逊网络服务上被开了 14k 美元的账单😱(来源:https://dev . to/juanmanuelramallo/I-was-billed-on-Amazon-web-services-17fn)
我试图在我的本地机器上重现这个场景,毫无疑问,我能够在我的终端上得到预测。成功执行该命令后,输入图像和预测也存储在我的 S3 存储桶中。
这种合法但伪造的请求被称为跨站点伪造请求(CSRF)。现在的问题是…
如何为你的应用程序实现 CSRF 保护?
根据文档,如果您使用 FlaskForm 来处理请求,您已经获得了 CSRF 保护。如果您没有使用 FlaskForm 或发出 AJAX 请求,您可能需要使用所提供的扩展显式地添加另一层安全性。
# app.pyfrom flask import Flask
from flask_wtf.csrf import CSRFProtect, CSRFErrorapp = Flask(__name__)
app.config['SECRET_KEY'] = "anything_unique"
app.config['WTF_CSRF_TIME_LIMIT'] = WTF_CSRF_TIME_LIMIT
CSRFProtect(app)
正如您可能已经猜到的,在第一行中,我们正在导入 Flask 类。这个类的一个实例将是我们的 WSGI 应用程序。在第二行,我们从 flask_wtf 模块导入 CSRFProtect 类。
接下来,我们将创建 Flask 类的实例。在接下来的两行中,我们将设置密钥和 CSRF 令牌的到期时间限制。需要注意的是,没有这个密钥,你就不能真正享受 CSRF 的保护。
注意:CSRF 保护需要一个秘密密钥来安全地签署令牌。默认情况下,这将使用 Flask 应用程序的
SECRET_KEY
。如果您想使用单独的令牌,您可以设置WTF_CSRF_SECRET_KEY
。
我强烈建议您将您的密钥存储在.env
文件中或者作为一个环境变量,这样在将您的代码推向生产时就不会被分发。我会在这篇博客的最后部分谈到WTF_CSRF_TIME_LIMIT
。最后一行是奇迹发生的地方!用ProtectCSRF
扩展注册将会为 Flask 应用启用全球 CSRF 保护。
现在,我们将在表单中添加 CSRF 代币的值。
<!-- index.html --><form method="post" >
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
...
...
...
</form>
然而,官方文档建议在 AJAX 请求的头中添加csrf_token
。
你猜怎么着?我们完了!
来源:https://giphy . com/gifs/intuit quickbooks-Danny-devito-quickbooks-intuit-8jw 82 ndayfmnoyaekm
好吧,你不相信我?这就是证据😅
添加代码后,我在我的终端中执行相同的命令,并得到以下响应。
Flask 应用程序在请求体中找不到csrf_token
,因此出现了错误的请求。
用户化
- 您可以使用
WTF_CSRF_TIME_LIMIT
设置 CSRF 令牌的到期时间。这是 CSRF 令牌的最长期限(秒)。默认值为 3600。如果设置为 None,则 CSRF 令牌在会话生命周期内有效。 - 您还可以在 CSRF 令牌丢失/无效的情况下捕捉错误,并在您的应用程序视图中显示出来。阶级
CSRFError
在这里是我们的救援。您只需要在 Flask 应用程序中定义一个简单的路由来捕获 CSRF 令牌异常。
[@app](http://twitter.com/app).errorhandler(CSRFError)
def handle_csrf_error(e):
return jsonify({"error": e.description}), 400
在上面的代码中,我们捕获了 CSRF 可能出现的异常,并以 JSON 格式返回,状态代码为 400(错误请求)。
您可以根据您的应用进行修改。下面是修改 CSRF 令牌后对 POST 请求的响应。
结束注释
本博客中使用的所有代码片段都是我的印度纸币预测项目的一部分。
我非常乐意与你见面。你可以访问我的个人网站 www.rohitswami.com了解我更多。还有,你可以在 LinkedIn 和 GitHub 上找到我🎉
我很想听到你对这篇文章的反馈。请随意在下面的评论区发送垃圾邮件。😊
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
如何在没有机器学习的情况下对客户进行细分
RFM 分析快速指南
让我们听一个故事。
介绍
致谢:亚历克斯·昆切夫斯基来源:滴滴出行
2020 年, Gifty (一家虚构的公司)受到新冠肺炎局势的重创。零售店关门了,顾客被锁在家里,没有人从 Gifty 买任何东西。
作为一家销售圣诞礼物的商店,我们不能破产。送礼的精神必须永存!
圣诞老人博士,吉夫蒂的首席执行官给我的任务是让吉夫蒂活着。这意味着两件事:
- 削减成本
- 增加收入
来源:维基百科
作为首席营销官,我将通过“牛眼计划”拯救 Gifty。正如“牛眼”这个词所暗示的,我们将把精力集中在重新定位我们的客户上。在我们锁定客户之前,我们必须对他们进行细分。
每当我们谈论客户细分时,我们通常会想到机器学习方法,如 K-NN、K-means 或多项式逻辑回归。由于经济衰退和预算限制,我们没有足够的资源用于机器学习。因此,我将依靠 RFM 分析项目牛眼。
简而言之,牛眼项目将:
- 根据客户的 RFM 指标对客户进行细分
- 将他们的 RFM 措施与其对营销提议的回应率联系起来
- 优化我们目前的营销工作。
什么是 RFM?
RFM 代表:
- 顾客最后一次购买是什么时候?这是通过计算自客户上次购买商品以来所经过的时间(天/月/年)来计算的。
- 频率——客户从我们这里购买的频率是多少?这是通过在一定时间范围内购买的总次数来计算的。
- 一元钱——顾客在我们身上花了多少钱?这是通过在一定时间范围内购买的美元价值来计算的。如果时间框架不明确,建议采用平均支出而不是总支出。
来源: SAS
在计算每个客户的 RFM 值后,我们根据他们的 RFM 值对客户进行分类。例如:
- 前 10%的花费者将被分配一个“5”的 M
- 接下来的 10%将被赋予“4”的 M
- 支出最低的 10%将被分配一个“1”的 M
- 对每个 R、F 和 M 重复这一过程
注意箱子的数量完全由你决定。人们通常以 5 人为一组。
然后,客户被分成 125 个组(5 * 5 * 5)。
根据每个客户的 R、F 和 M 值,我们应该能够粗略估计出一个客户对礼物的获利程度。例如,我们最有利可图的客户应该:
- R = 5,表示最近进行了购买
- 有 F = 5,表明经常购买
- 有 M= 5,表明花了很多钱
然后,我们可以精心定制营销工作,以迎合每个群体,这将在稍后进一步讨论。
改进的 RFM 分割
等等,传统的 RFM 分割方法似乎有一个很大的问题。
- 我们客户的 R、F 和 M 指标之间有很高的相关性,其中
- 经常购买的人很可能是最近购买的。
- 因此,我们有大量 R = 5,F = 5 的客户,但是…
- R = 1,F = 5 的零客户。
- 125 组都很参差不齐!
- 这是一场灾难,因为如果我把所有的预算都花在接触如此庞大的客户群上,圣诞老人会杀了我的。
别担心,有一个 RFM 分割的改进版本:
这将确保在我们的 125 个组中的每一组都有相同数量的客户,因为在每个 R = 1,2,3,4,5 中,我们根据他们的 F 和 m 进一步分成 5 个相等的组。
来源: SAS
三步走 RFM
时间不多了。让我们开始吧!
1.创造原始 RFM 价值
首先,我们必须计算每个客户的 R、F 和 M 值。根据您的数据集,您必须设计您的数据以生成值。一个好的做法是创建 3 个不同的函数,每个函数分别计算 R、F 和 M。
别担心,代码在我的 Github repo 上。
RFM 价值观先于宁滨
2.根据 RFM 标准划分
现在我们有了原始的 RFM 值,我们可以开始使用改进的 RFM 分割方法,也称为嵌套宁滨方法来对它们进行分类。
如果我们观察第 11 行和第 17 行,我们可以看到我们是如何嵌套我们的箱的。
宁滨之后的 RFM 集团
3.将 RFM 指标与营销报价的回应率联系起来
情报必须是可操作的。如果我们不能从中获得任何洞察力,那么对我们的客户进行细分就毫无意义。因此,我决定分析每个细分市场对营销提议的回应率。
请随意将其与任何其他可预测的行为联系起来,如交易的可能性、被收购的可能性或实施欺诈的可能性。
优化营销工作
靶心计划最重要的部分来了**。最后一步是开始对我们的分析进行操作。首先,我们放大到排名前五的 RFM 集团。**
- **重新激活休眠群体。**在前 5 组中,我们观察到有些客户的近期价值较低(长时间没有购买)。因为他们是我们最有利可图的客户,我们应该找出他们停止从 Gifty 购买的原因,并重新激活他们。Gifty 可以利用个性化的营销信息与他们建立关系。
- 奖励顶级 RFM 团体。 Gifty 可以通过免费会员、折扣或免费送货来奖励这些团体,试图让他们购买更多。
- 推出转诊计划。如果顾客向他们的朋友或家人推荐礼物,可以获得奖励。
- 追加销售顶级消费者。Gifty 可以推荐相关产品或新产品,试图向他们追加销售。
我们永远不应该把太多的注意力放在我们的顶级支出者身上。底层消费者也应该得到一些关注。
- **停止联系下 RFM 团体。**下 RFM 群体中的许多客户对营销工作根本没有反应。Gifty 应该停止向他们发送邮件或目录来浪费资源。
- 向顶级 RFM 集团输送资源。节省下来的资源可以用于顶级 RFM 集团或其他地方。例如,资金可以用于设计新的方式来接触底层 RFm 群体,如使用社交媒体广告或病毒式营销活动。
- **增加与随机 RFM 群体的接触。**对于 Gifty 来说,接触随机的 RFM 群体同样重要。Gifty 应定量地、持续地跟踪其核心指标的变化,如一段时间内的销售额,以确定他们对这些群体的营销工作的有效性。
结论
通过“牛眼计划”,我们观察了如何利用简单的 RFM 分析来优化 Gifty 的营销工作。
每个数据科学家都必须确保他们的数据能够讲述一个故事。数据可以帮助我们。数据中隐藏着大量的信息。我们剩下要做的就是把它挖出来。
参考
代码:https://github . com/bensjx/RFM-Analysis/blob/master/RFM . ipynb
如何选择正确的机器学习算法
Denys Nevozhai 在 Unsplash 上拍摄的照片
机器学习
实施算法时要考虑的七个关键因素
对于任何给定的机器学习问题,可以应用许多算法,并且可以生成多个模型。例如,垃圾邮件检测分类问题,可以使用各种模型来解决,包括朴素贝叶斯、逻辑回归和深度学习技术,如 BiLSTMs。
拥有丰富的选择是好的,但是决定在生产中实现哪种模型是至关重要的。尽管我们有许多性能指标来评估一个模型,但是为每个问题实现每个算法是不明智的。这需要大量的时间和工作。因此,了解如何为特定任务选择正确的算法非常重要。
在本文中,我们将研究可以帮助您选择最适合您的项目和特定业务需求的算法的因素。我们将通过查看各种因素来帮助您完善您的选择。理解这些因素将帮助您理解您的模型将执行的任务以及您的问题的复杂性。
以下是实现算法时要考虑的因素列表:
- 可解释性
- 数据点和特征的数量
- 数据格式
- 数据的线性
- 训练时间
- 预测时间
- 内存要求
下面我们来仔细看看!
可解释性
当我们谈论算法的可解释性时,我们谈论的是它解释其预测的能力。缺乏这种解释的算法被称为黑盒算法。
像 k-最近邻(KNN)这样的算法通过特征重要性具有很高的可解释性。像线性模型这样的算法通过赋予特征的权重具有可解释性。当考虑你的机器学习模型最终会做什么时,知道算法的可解释性变得很重要。
对于分类问题,如检测癌细胞或判断住房贷款的信用风险,必须了解系统结果背后的原因。仅仅得到一个预测是不够的,因为我们需要能够评估它。即使预测是准确的,我们也必须理解导致这些预测的过程。
如果理解您的结果背后的原因是您的问题的要求,那么需要相应地选择合适的算法。
数据点和特征的数量
在选择合适的机器学习算法时,数据点和特征的数量起着至关重要的作用。根据使用情况,机器学习模型将与各种不同的数据集一起工作,这些数据集在其数据点和特征方面会有所不同。在某些情况下,选择模型归结为理解模型如何处理不同大小的数据集。
像神经网络这样的算法可以很好地处理海量数据和大量特征。但是一些算法,如支持向量机(SVM),只能处理有限数量的特征。选择算法时,一定要考虑数据的大小和特征的数量。
数据格式
数据通常来自开源和定制数据源的混合,因此它也可以是各种不同的格式。最常见的数据格式是分类数据和数字数据。任何给定的数据集可能只包含分类数据、数值数据或两者的组合。
算法只能处理数值数据,因此如果您的数据是分类的或者格式上是非数值的,那么您将需要考虑一个将其转换为数值数据的过程。
数据的线性
在选择模型之前,了解数据的线性是一个必要的步骤。确定数据的线性有助于确定决策边界或回归线的形状,这反过来又会引导我们使用模型。
一些关系,如身高体重,可以用线性函数来表示,这意味着一个增加,另一个通常以相同的值增加。这种关系可以用线性模型来表示。
通过散点图了解数据的线性度(图片由作者创建)
了解这一点有助于你选择合适的机器学习算法。如果数据几乎是线性可分的,或者可以用线性模型表示,那么像 SVM、线性回归或逻辑回归这样的算法是不错的选择。否则,可以使用深度神经网络或集成模型。
训练时间
训练时间是算法学习和创建模型所花费的时间。对于像向特定用户推荐电影这样的用例,用户每次登录时都需要训练数据。但是对于像股票预测这样的用例,模型需要每秒训练一次。所以考虑训练模型所花费的时间是必不可少的。
众所周知,神经网络需要大量时间来训练模型。像 K-最近邻和逻辑回归这样的传统机器算法花费的时间要少得多。有些算法,如随机森林,根据所使用的 CPU 内核需要不同的训练时间。
预测时间
预测时间是模型进行预测所需的时间。对于产品通常是搜索引擎或在线零售店的互联网公司来说,快速的预测时间是平滑用户体验的关键。在这种情况下,因为速度非常重要,如果预测速度太慢,即使结果很好的算法也没有用。
然而,值得注意的是,在一些业务需求中,准确性比预测时间更重要。在我们前面提到的癌细胞例子中,或者在检测欺诈性交易时,情况确实如此。
像 SVM、线性回归、逻辑回归和一些类型的神经网络这样的算法可以进行快速预测。然而,像 KNN 和集合模型这样的算法通常需要更多的时间来进行预测。
内存要求
如果您的整个数据集可以加载到服务器或计算机的 RAM 中,您就可以应用大量的算法。然而,当这不可能时,你可能需要采用增量学习算法。
增量学习是一种机器学习方法,其中输入数据被连续地用于扩展现有模型的知识,即进一步训练模型。增量学习算法旨在适应新数据而不忘记现有知识,因此您不需要重新训练模型。
最后
在为机器学习任务选择算法时,性能似乎是最明显的指标。然而,性能本身并不足以帮助您为工作选择最佳算法。您的模型需要满足其他标准,如内存要求、训练和预测时间、可解释性和数据格式。通过纳入更广泛的因素,你可以做出更有信心的决定。
如果您很难在几个选定的模型中为您的数据选择最佳算法,一种流行的模型选择方法是在验证数据集上测试它们。这将为您提供衡量标准,您可以通过这些标准来比较每个模型并做出最终决定。
当决定实现一个机器学习模型时,选择正确的模型意味着分析你的需求和预期结果。虽然这可能会花费一些额外的时间和精力,但回报是更高的准确性和改进的性能。
谢谢你的阅读。本文原载于 Lionbridge.ai 。我也将在未来写更多初学者友好的帖子。请在媒体上关注我,以便了解他们。我欢迎反馈,可以通过 Twitter ramya_vidiyala 和 LinkedIn RamyaVidiyala 联系我。快乐学习!
如何选择时间序列数据库
物联网分析第 3 部分:时间序列引擎的比较
介绍
一般来说,时间序列用例,尤其是物联网领域,增长如此之快,因此为每个特定用例选择正确的存储至关重要。
如今,所有其他数据库引擎或平台都是以面向时间序列的方式销售的,所以让我们试着更深入地了解一下,找出哪一个最适合每个特定的需求。
问题陈述
为了正式确定引擎选择,让我们明确定义成功的输入和标准。作为一个输入,让我们考虑一个遥测数据集。
作为成功的标准,我们有:
- 功能需求的覆盖范围与不同级别的数据查询/分析相关
- 非功能需求的覆盖范围
让我们更具体地定义它们。
遥测数据集
作为物联网数据分析系列文章的继续,让我们使用健身追踪器用例,它很好地代表了典型的物联网用例。数据集(也称为这里的和这里的)由一组观察值组成,每个观察值包含:
- 由传感器/边缘生成的度量名称,即: 心率、心率、步数
- 与时间点、绑定的传感器产生的度量值,即:(2020–11–12 17:14:07,71bpm)、(2020–11–12 17:14:32,93bpm)等
- 标签或上下文或描述其中给定传感器正在生成数据,即:设备型号、地理位置、用户、活动类型等。
功能需求
围绕数据分析有许多不同的可能性,所以让我们将它们分为初级、中级和高级。
基本级别:简单的数据检索
- **随机数据访问:**为特定时间点返回适当的度量值
- **小范围扫描:**对于特定的时间范围(相当小,根据数据生成的频率,在几分钟或几小时内)返回连续的度量值(即:在其上绘制标准图表)
中级:时间窗归一化
测量事件通常应该在预定义的重复基础上触发,但是数据点定时总是存在偏差。这就是为什么非常需要围绕构建预定义的时间窗口来标准化时间序列数据的能力。
所需的能力包括:
- 构建时间段以正确标准化数据
- 标准化时段上的聚合
- 间隙填充,使用插值在一组离散的已知数据点范围内构建新的数据点。
对于中级容量,值得添加更复杂的诊断分析/特别查询:
- **灵活过滤:**根据标签/上下文属性上的谓词过滤数据点,即:根据某个区域、用户或活动类型过滤数据点
- **灵活聚合:标签/上下文属性或其组合上的分组和聚合,即:按活动类型按区域的最大炉膛率。
高级级别:顺序行模式匹配
最高级将包括检查事件序列 是否与特定模式匹配,以执行自检和高级诊断:
- 在特定事件之前有相似的测量模式吗?;
- 什么样的测量可能表明某个事件的原因,例如失败?
到目前为止,很少有数据库支持这样的特性,但是我相信它们会出现的。
在这里,我们可以区分以下能力:
- 找到一系列连续事件,即:会话定义
- 模式匹配:趋势反转,周期性事件
非功能性需求
除了功能性需求之外,考虑非功能性需求也非常重要,这些需求通常是选择的主要驱动因素:
- **可扩展存储:**处理大数据量的能力
- **可扩展写入:**处理大量并发写入的能力。这与实时数据访问密切相关,即在数据点生成和可供读取之间尽可能缩短延迟的能力。
- **可伸缩读取:**处理大量并发读取的能力
- **高成熟度:**在市场上的存在和社区支持。
市场上的时间序列数据库和平台
让我们回顾一下市场上有什么可以满足我们的严格需求。有多种选择。这真的很难涵盖所有这些,所以我将尝试描述发动机家族。
带有内置分类功能的 NoSQL
BigTable、HBase、Cassandra、DynamoDB、Accumulo 常用于存储时序数据。有大量关于如何在这些存储上实现时序用例的文章;如何避免热点使用盐等?
****优势:非常适合写入。极其高效地执行基本级别的分析。
****弱势:所有其他类型的分析都不受支持且效率低下
NoSQL 特制时间序列数据库
有一些引擎是作为时间序列数据库从头开始设计的。在大多数情况下,他们是 NoSQL。最突出的例子是 InfluxDB ,它位于所有谷歌搜索的首位。
基于时序类固醇的 MPP SQL 引擎
一些成熟的 MPP 分析引擎,如 Vertica 不断增加新的分析功能,包括与时间序列数据处理相关的功能。但缺点是,从设计上来说,它们不是为高效的流数据摄取而创建的。但是如果微批处理是可接受的,它们可能是许多用例的最佳匹配。
****优势:提供最大的分析能力。
****弱方:实时摄取可能很有挑战性,而且效率不高
注意:Oracle 不是传统的 MPP,但是从功能的角度来看,它支持 MATCH_RECOGNIZE 子句,该子句涵盖了复杂的模式匹配特性
内存数据库
SQL 数据库的内存特性提高了它们处理快速数据接收的能力。由时段规范化支持丰富的 SQL 接口,如 SingleStore MemSQL 数据库对于时间序列用例来说看起来非常有吸引力
****优势:提供触达分析能力。
****弱势:读写的可伸缩性通常有限或者非常昂贵
云时序平台
Azure 和 AWS 最近发布了他们的时序数据服务/平台:
- Azure 时序洞察
- 亚马逊时光流
这些平台涵盖了时间序列数据存储、可视化和查询功能的许多方面。它们内置了热存储、热存储和冷存储之间的数据分离,从拥有成本的角度来看,可以很好地平衡数据存储和检索。
****优势:很好地集成到适当的云基础设施中,提供了范围查询功能以及
****弱点:对于某些用例来说,紧密的云集成可能是一个限制;在市场上出现的时间还太短,不能把它们当作成熟的产品。
其他人
也有其他选择和小众玩家。我有机会使用一个叫做 GeoMesa 平台/框架的例子。这是一个基于 Accumulo/Hbase/Cassandra 等 NoSQL 存储的框架,能够为时态和地理时态数据建立特殊索引;它还通过二级索引提供了额外的灵活性。
****优势:高效的基本时序分析以及良好的缩放水平。地理时态查询支持是一项关键功能,也是物联网数据的一大优势。
****弱势:尽管开发社区非常友好且响应迅速,但它的采用率和成熟度都很低。
汇总比较
请使用我们在下面开头定义的标准来查找不同时间序列存储的高级比较:
哪里
作者图片
结论
这个主题非常广泛,值得一本书来详细介绍,但是我希望这篇文章能够帮助您在时序引擎世界中导航,并帮助您为您的特定用例选择正确的方向。
如何用 Python 发送漂亮的电子邮件——基本指南
使用 Python 发送带有附件的风格化电子邮件。给多个收件人。
通过 Python 这样的编程语言发送邮件有很多用例。例如,您可能想要管理一个邮件列表而不支付月费,或者在生产代码中出现问题时使用它来通知您。今天,您将学习如何轻松地向多个收件人发送精美的电子邮件。包括附件。
为此,我们将使用 Python 的smtplib
。SMTP 代表简单邮件传输协议,对于你们这些书呆子来说。这是一个简单的库,允许我们发送电子邮件。我们还将使用email
库进行格式化。两者都内置在 Python 中,所以不需要安装任何东西。
如果你更喜欢视频,我为你准备了一份礼物:
今天的日程如下:
- Gmail 设置
- 发送简单的邮件
- 向多个收件人发送电子邮件
- 发送附件
- 发送 HTML 格式的电子邮件
- 结论
内容太多了,让我们开门见山吧。
Gmail 设置
我假设你的 Gmail 账户已经启用了双重认证。如果没有,你应该。我们必须生成一个密码,Python 脚本将使用该密码登录您的帐户并发送电子邮件。
这是一个简单的步骤。只需点击这个网址,你就会看到这样一个屏幕:
作者图片
但是,您不会看到“Python 电子邮件”行。只需点击选择应用下拉菜单,然后点击其他(自定义名称)。输入一个名称(任意),点击生成按钮。
就是这样!像这样的模态窗口将会弹出:
作者图片
只要把密码保存在安全的地方。
现在,您可以打开代码编辑器(或笔记本)并创建一个 Python 文件。以下是电子邮件和密码的库导入和变量声明:
请记住— EMAIL_ADDRESS
变量应该包含您的实际电子邮件地址,而EMAIL_PASSWORD
应该包含几秒钟前生成的应用程序密码。有一种更健壮、更安全的方法可以做到这一点——使用环境变量,但这超出了本文的范围。
您现在可以发送您的第一封电子邮件了。
发送简单的邮件
这是你期待已久的部分。发送电子邮件之前需要几个步骤,如下所示:
- 创建一个
EmailMessage
类的实例 - 指定从、到的和主题*——你猜哪个是干什么的*
- 设置电子邮件的内容,即邮件本身
- 使用
smtplib
建立安全连接(SSL)并登录您的电子邮件帐户 - 发送电子邮件
听起来工作量很大,但归结起来不到十行代码。以下是片段:
如您所见,我已经将从到到的字段设置为相同的值。这不是你通常会做的事情,但对于测试来说是必不可少的。这是我几秒钟后收到的电子邮件:
作者图片
接下来让我们看看如何向多个收件人发送电子邮件。
向多个收件人发送电子邮件
如果你理解了前一部分,你就会理解这一部分。你只需要改变一件事。
在msg['To']
中,您将不得不指定一个电子邮件列表,而不是指定一个您想要发送到的电子邮件地址(和前面的例子一样)。
代码如下:
你能看出区别吗?发送给多个收件人比预期的要容易,因为你不必手动遍历列表。让我们继续邮件附件。
发送附件
发送附件有点奇怪,直到你掌握了它的要点。你必须用 Python 的with open
语法打开每个附件,并使用EmailMessage
类中的add_attachment
方法来添加附件。
在下面的例子中,这个方法被用来发送一个 PDF 文档。代码如下:
这是我几秒钟后收到的电子邮件:
作者图片
厉害!接下来让我们看看如何创建定制的电子邮件!
发送 HTML 格式的电子邮件
如果你打算发送纯文本的、无风格的或者丑陋的邮件,你可以从你的列表中划掉 inbound。这就是 HTML 和 CSS 发挥作用的地方。
就代码而言,这与上一节中的内容几乎相同。唯一不同的是邮件内容。这次您将使用来自EmailMessage
类的set_content
方法来编写 HTML。CSS 样式是内嵌设置的。
这是我在几分钟内设计出来的:
作者图片
不是很好,但比我们以前的有所改善。这就足够了。让我们在下一部分总结一下。
离别赠言
用 Python 发送电子邮件很容易。Gmail 配置让你可以直接从你的机器上发送邮件,不需要上传任何东西到实时服务器上。如果你问我的话,我觉得这很好。几年前,当我第一次开始通过 PHP 发送电子邮件时,本地主机不是一个选项(根据我的经验)。
你今天已经看到了一堆新概念——从发送电子邮件到前端技术。这仅仅够让你入门,而且网络上有很多更高级的指南。
感谢阅读。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)
原载于 2020 年 11 月 2 日 https://betterdatascience.com。
如何将数据从 Google BigQuery 发送到 Google Sheets 和 Excel
来源:沉积照片
了解如何自动快速地将数据从 Google BigQuery 发送到 Google Sheets 和 Excel
Google BigQuery (GBQ)不需要额外的维护成本,可以在不到一分钟的时间内处理您的数据。在本文中,您可以了解如何使用 BigQuery API 将数据从 CSV 和 JSON 文件上传到 GBQ,或者从其他 Google 服务上传数据。今天,我们将告诉你如何从 BigQuery 上传数据到你的最爱——Google Sheets 和 Excel。
如何将数据从 Google BigQuery 导入到 Google Sheets
将数据加载到 Google Sheets 的简单方法是使用 OWOX BI 的 BigQuery Reports 插件。你可以直接从 Google Sheets 的附加组件菜单免费安装,或者从 Chrome 网上商店下载。
图片由作者提供
2.一旦安装了 OWOX BI BigQuery Reports 插件,就可以从存储中加载数据了。为此,请转到 Google Sheets 中的附加组件菜单,将鼠标悬停在 OWOX BI BigQuery 报告上,然后选择添加新报告。
图片由作者提供
2.在屏幕右侧出现的附加菜单中,指定 GBQ 项目的名称。然后,您可以为选定的项目创建新的 SQL 查询,或者从下拉列表中选择以前使用的查询。
图片由作者提供
- 如有必要,为您的查询定义动态参数。然后点击添加&运行。
- 你的数据准备好了!来自 GBQ 的数据将被上传到 Google Sheets 中的一个新表中。
OWOX BI BigQuery Reports 插件的优势:
- 您可以将数据从 BigQuery 加载到 Google Sheets,反之亦然。
- 您可以控制对数据的访问。
- 您可以从 Google Sheets 中一键与同事共享数据。
- 您可以访问一个简单的查询编辑器。
- 报告会自动更新。
您可以在 OWOX 博客上了解更多关于设置 OWOX BI BigQuery Reports 连接器和在 Google Sheets 中自动生成报告的信息。
如何从 Google BigQuery 导入数据到 Excel
- 要将数据从 Google BigQuery 导入 Excel,首先,您需要一个惟一键来运行对 BigQuery 的查询。您可以随时创建此密钥,但请记住它有一个到期日期。
图片由作者提供
如有必要,您可以随时创建新的密钥。
图片由作者提供
您也可以使用撤销密钥按钮或在您的 Google 档案设置中终止当前密钥。
图片由作者提供
2.在 Excel 中,创建一个新工作表,并在中提供以下信息。下面截图所示的格式:
- 您的项目 ID
- 您的唯一密钥
- 你的疑问
图片由作者提供
请注意,如果您的查询超过 256 个字符,Excel 将不会运行它。在这种情况下,您应该将查询拆分成多个部分,并将它们插入相邻的单元格中。
3.接下来,下载 IQY 文件。
4.在 Excel 的数据选项卡中,选择现有连接。在出现的窗口中,点击浏览更多并选择您刚刚下载的 IQY 文件。
图片由作者提供
5.首次连接时,您需要指定数据的显示位置。在当前工作表中选择一个单元格。
图片由作者提供
6.在以下窗口中,指定包含查询、项目 ID 和连接器关键字的单元格的值。
图片由作者提供
准备好了!您的 BigQuery 数据现在将出现在 Excel 中。
作为连接到 Excel 的另一种方法,您可以使用 Magnitude Simba ODBC 驱动程序进行 BigQuery。详细说明可以在 YouTube 上找到:如何将 Google BigQuery 连接到 Microsoft Excel 。
如何通过电子邮件自动发送 Python 应用程序崩溃通知
如果您在远程服务器上运行 Python 应用程序,您可能会不时遇到应用程序崩溃。并且您希望尽快知道发生了崩溃,以便尽快修复问题。
这个小小的代码片段可以帮助你实现这一点。
- 导入所需的 Python 模块(电子邮件、日志和 io)
- 定义电子邮件处理功能。您只需更新您的电子邮件服务器认证详情。
- 定义 Try/Except 循环,其中“Try”部分将包含您的主代码,“Except”部分将捕获应用程序崩溃,并将详细的崩溃描述发送到您定义的电子邮件地址。
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import logging
from io import StringIO
import smtplibdef send_email_crash_notification(*crash_message*):email = 'your_email@gmail.com'
send_to_email = 'receipent_email@gmail.com'
subject = 'Python application CRASHED!' msg = MIMEMultipart()
msg['From'] = email
msg['To'] = send_to_email
msg['Subject'] = subject
message = *crash_message* msg.attach(MIMEText(message, 'plain')) *# Send the message via SMTP server.* server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login('your_email@gmail.com', 'your_password')
text = msg.as_string()
server.sendmail(email, send_to_email, text)
server.quit()
*print*('email sent to ' + *str*(send_to_email)) return True try:
*#Your main code will be placed here
print*(1+1)except *Exception* as e:
log_stream = StringIO()
logging.basicConfig(*stream*=log_stream, *level*=logging.INFO)
logging.error("Exception occurred", *exc_info*=True)
send_email_crash_notification(log_stream.getvalue())
感谢您的阅读,我期待着阅读您的评论!
如果你觉得特别慷慨,你可以在www.buymeacoffee.com/kingmichael给我买杯咖啡。你的支持将极大地帮助我保持动力,写出你喜欢的文章。
如何使用 TensorFlow 服务不同的模型版本
了解不同的配置设置,以便使用 TensorFlow Serving 管理不同的模型和模型的不同版本
本文解释了如何使用配置文件在 TensorFlow 服务中管理多个模型和同一模型的多个版本,并简要了解批处理。
先决条件:
您拥有不同架构的 TensorFlow 深度学习模型,或者已经使用不同的超参数训练了您的模型,并且希望在本地或生产中测试它们。最简单的方法是使用一个模型服务器配置文件来服务模型。
模型服务器配置文件是一个协议缓冲文件(protobuf ),它是一种与语言无关、与平台无关的可扩展的、简单而快速的序列化结构数据的方法。
如何创建模型配置文件?
下面是一个样本模型配置文件,它将服务于磁盘上所有版本的“MNIST”模型。
**model_config_list {
config {
name: 'mnist'
base_path: '/models/mnist/'
model_platform: 'tensorflow'
model_version_policy: {all: {}}
}
}**
每个 ModelConfig 指定一个模型,该模型使用以下参数。
名字- 一个可服务的模型名
base_path - 指定查找 servable 版本的路径。
模型 _ 平台- 开发模型的平台。
model_version_policy - 模型的版本策略指示加载哪个版本的模型并提供给客户端。默认情况下,将提供模型的最新版本,并且可以通过更改 model_version_policy 字段来覆盖。
如何加载模型配置文件?
点击阅读如何在 Windows 10 上加载 TensorFlow 服务 Docker 容器
**docker run -p 8501:8501 --mount type=bind,source=C:\TF_serv\TF_model,target=/models/mnist -e MODEL_NAME=mnist -t tensorflow/serving**
列出所有正在运行的 Docker 容器
**docker container list**
或者
**docker ps**
以红色突出显示的容器 Id 和容器名称
将 models.config 文件从 Docker 映像的源复制到目标
**docker cp \TF_serv\TF_model\models.config *ba978f5a9475*:/models/mnist**
将文件复制到 docker 容器时,提供容器 Id,如上所示。
使用 Docker 容器名称或容器 Id 停止 Docker 容器
**docker stop *ba978f5a9475***
最后,使用选项加载模型配置文件
**--model_config_file_poll_wait_seconds**
flag 指示服务器每 60 秒在使用**--model_config_file**
指定的路径检查一次新的配置文件。
**docker run
-p 8501:8501
--mount type=bind,source=C:\TF_serv\TF_model,target=/models/mnist
-e MODEL_NAME=mnist
-t tensorflow/serving
--model_config_file_poll_wait_seconds=60
--model_config_file=/models/mnist/models.config**
如何使用 models.config 文件提供的模型使用模型的具体版本进行推理?
使用 REST API 进行推理请求
json_response = requests.post('[**http://localhost:8501/v1/models/mnist/versions/5**:**predict'**](http://localhost:8501/v1/models/mnist/versions/5:predict'), data=data, headers=headers)
因为上面指定的 models.config 文件将加载磁盘上的所有版本;我已经加载了版本 5。
下面显示了调用模型的特定版本进行推理的一般方法。
**/v1/models/*<model name>*/versions/*<version number>***
我如何覆盖并指定一个要加载和服务的模型的特定版本?
您需要使用指定的标签和型号版本政策中的版本号
**model_config_list {
config
{
name: 'mnist'
base_path: '/models/mnist/'
model_platform: 'tensorflow'
model_version_policy{
specific{
versions:2
}
}
}
}**
有了上面的变更 models.config 文件,客户端现在可以只为版本 2 调用模型的 predict 方法。
我可以同时服务同一型号的多个版本吗?
您还可以同时提供同一型号的多个版本。在下面的例子中,我们同时为 MNIST 模型提供版本 2 和版本 3。
**model_config_list {
config
{
name: 'mnist'
base_path: '/models/mnist/'
model_platform: 'tensorflow'
model_version_policy{
specific{
versions:2
versions:3
}
}
}
}**
当您有一个较新版本的模型,并希望将一些用户转移到一个较新的版本,并让大多数客户端使用稳定的较旧版本的模型时,这是很有帮助的。这允许您完成 A/B 测试。
我能否为多个模型提供服务,如定制模型和转移学习模型?
要为多个模型提供服务器,请更新 models.config 文件,如下所示
**model_config_list {
config{
name: 'mnist'
base_path: '/models/mnist/'
model_platform: 'tensorflow'
model_version_policy{
specific{
versions:2
versions:3
}** **}
}
config{
name: 'Inception_1'
base_path: '/models/inception_1/'
model_platform: 'tensorflow'
}
}**
TensorFlow 服务允许批量处理多个请求吗?
TensorFlow 服务允许两种不同形式的批处理。
- 批量处理单个模型推理请求,TensorFlow serving 等待预定时间,然后对该时间段内到达的所有请求进行推理
- 单个客户端可以向 TensorFlow 服务器发送批量请求。
批处理要求所有请求使用相同版本的模型。
批处理允许更高的资源利用率和更高的吞吐量。
要启用批处理,将**--enable_batching**
标志指定为真,并使用**--batching_parameters_file**
标志设置包含批处理参数的配置文件。
**docker run -p 8501:8501 --mount type=bind,source=C:\TF_serv\TF_model,target=/models/mnist
-e MODEL_NAME=mnist
-t tensorflow/serving
--model_config_file_poll_wait_seconds=60
--model_config_file=/models/mnist/models.config
--enable_batching=true
--batching_parameters_file=/models/mnist/batch.config**
批处理配置文件是一个. protobuf 文件
**max_batch_size { value: 128 }
batch_timeout_micros { value: 0 }
max_enqueued_batches { value: 1000000 }
num_batch_threads { value: 8 }**
max_batch_size :允许您指定任何批次的最大大小。如果您指定一个大于 **max_batch_size,**的批处理,那么您将得到一个错误。该参数决定吞吐量/延迟的权衡,并确保不超过资源限制。
batch_timeout_micros :这是服务器重试批量请求的最大时间。参数值以微秒为单位指定。
num_batch_threads :通过指定要同时处理的最大批处理数量来定义并行度。
max_enqueued_batches :它有助于通过拒绝需要很长时间才能得到服务的请求来限制批处理队列,并避免构建大量积压的请求。
当我在有批处理和没有批处理的情况下运行下面的代码时,批处理让我的结果快了 2 到 3 倍。
**import time**
#Build the batched data for making iferences for 100 images
**data = json.dumps({"signature_name": "serving_default", "instances": test_images[:100].tolist()})**
**st=time.perf_counter()
headers = {"content-type": "application/json"}
json_response = requests.post('**[**http://localhost:8501/v1/models/mnist/labels/2:predict'**](http://localhost:8501/v1/models/mnist/labels/stable:predict')**, data=data, headers=headers)****predictions = json.loads(json_response.text)['predictions']
end_t= time.perf_counter()
print(end_t-st)**
结论:
TensorFlow 服务通过使用模型服务器配置提供服务不同模型或同一模型的不同版本的简单方法,使生产部署变得更加容易。
批处理允许您对同一客户端或不同客户端的多个请求进行批处理,从而优化硬件加速器资源并提供更好的吞吐量。
参考资料:
https://www.tensorflow.org/tfx/serving/serving_config
如何建立雪花数据库
这个平台绝对值得花时间在免费试用期间体验一下
图片由皮克斯拜的 Gerd Altmann 提供
当公司于 9 月 5 日在 T4 上市时,雪花引起了相当大的兴趣。当我最初去 AWS 查看雪花服务时,该服务被认为是一个数据仓库解决方案。通常,“数据仓库”这个术语让我感到厌烦。当我在处理较小的项目和合同时,我喜欢加速和转储数据库和表格,而不太担心基础设施。经过进一步调查,雪花将自己定位为“云数据平台”,提供包括数据科学和数据应用在内的服务。听起来更适合我。我决定冒险使用免费试用版来检验我的高级 SQL 教程的开发平台。这是我的经历。
很容易建立一个帐户
在所有的云平台中,这是最容易建立一个自由层数据库的。输入基本信息,确认你的电子邮件地址,你就可以开始工作了。那非常令人耳目一新。
正如我在回顾经历时所做的那样,除非需要,否则我不会阅读任何文档。除了 SQL 语法之外,我不需要查找任何操作信息(因为 SQL 必须总是不同的,不是吗?)雪花用的是 SQL: ANSI。
创建表
我没有通过 UI 下拉菜单手动命名列,而是使用工作表加载 Create Table SQL。如果不指定字段的长度,它们默认为一些大值。太大。我检查了一下,并在 SQL 中添加了大小。
注意您的插入 SQL —作者截图
数据加载
我使用了与早期文章相同的恶劣天气细节数据源。
恶劣天气数据目录(SWDI)是美国恶劣天气记录的综合数据库。
www.ncdc.noaa.gov](https://www.ncdc.noaa.gov/ncei-severe-weather-data-inventory)
我发现数据加载比其他数据库更繁琐,尽管显式地指定数据长度并非不合理。我使用“加载数据”功能来加载。csv 文件放入表中。加载过程似乎有两个部分,加密和插入行。
最终加载的数据—作者截图
运行查询
查询通过工作表运行。界面熟悉,性能良好。我连接到 AWS 的唯一指示是 URL。
查询结果—作者截图
结论
我喜欢简单的设置和远离基础设施的抽象。我肯定会在我的个人项目中再次使用这个平台。对于这个演示,我使用了经典的控制台,但似乎雪花正在开发一个更干净的应用程序,目前处于预览模式:
雪花 app 预览——作者截图
我真的很喜欢数据市场如此突出。你是否有购买数据的预算,或者根据你的分析,这是否合乎道德,则是另一回事。
雪花数据仓库链接
雪花使每个组织都能够以数据为驱动力,利用您的数据纵向扩展、横向扩展……
www.snowflake.com](https://www.snowflake.com/try-the-cloud-data-platform/?_bt=470247374840&_bk=%2Baws%20%2Bsnowflake&_bm=b&_bn=g&_bg=59115312956&utm_medium=search&utm_source=adwords&utm_campaign=NA%20-%20Branded&utm_adgroup=NA%20-%20Branded%20-%20Snowflake%20-%20AWS&utm_term=%2Baws%20%2Bsnowflake&utm_region=na&gclid=Cj0KCQjwwuD7BRDBARIsAK_5YhX4YUsMYQgfOPMqKcBX8_OBSULUB6iYHZ0tonpMf1i64iDzV1MWuk8aAk_gEALw_wcB)
如何在 Amazon Alexa 中使用 Amazon Cognito OAuth2 授权许可设置帐户链接
亚马逊 ALEXA
使用 Alexa 实现安全的个性化访问
简·安东宁·科拉尔在 Unsplash 上拍摄的照片
A mazon Alexa ,是亚马逊开发的虚拟助理 AI 技术,最初于 2014 年发布。这是亚马逊迄今为止最有创意的设计之一。
Alexa 的表现令人惊叹,如语音交互,音乐播放,制定待办事项,设置闹钟,流媒体播客,提供天气,交通,体育和其他实时信息,如新闻,它还可以控制几个智能设备。
据亚马逊的开发者网站称, Alexa 语音服务(AVS) 生活在云端。亚马逊的 AVS 是一项智能语音识别和自然语言理解(NLU) 服务。Alexa 语音服务(AVS)试图模仿真实的人与人之间的对话。该服务可用于为任何具有麦克风和扬声器的连接设备启用语音功能。Alexa 通过名为“技能”的组件向公众提供服务。
“Alexa 总是通过机器学习的新功能变得越来越聪明,”
-亚马逊的开发者网站上说。
在这篇博文中,我将解释一下 Alexa 账户链接。
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
什么是 Alexa 账户链接
帐户链接支持自定义技能将技能用户的 Amazon 身份与不同系统中的身份连接起来。它还允许您使用服务安全地验证用户的技能。一旦技能和外部用户帐户之间的连接建立,技能就可以代表用户使用该帐户执行操作。
账户链接使用 OAuth 2.0 。OAuth 2.0 服务器支持两种发起安全访问令牌交换的协议:授权码授予和隐式授予。
Amazon Cognito 用户池是如何工作的
来源:链接
Amazon Cognito 用户池包括以下任务流。
- 首先,Alexa 服务在运行时向 Alexa skill 提供当前有效的访问令牌。请注意,Alexa service 负责管理刷新令牌,并在令牌到期时获取新的访问令牌。
- 然后,Alexa 技能代码使用该令牌访问用户池中的用户配置文件。当使用 Alexa 应用程序链接技能时,客户将直接通过 Cognito 用户门户进行身份验证。
Amazon Cognito 账户链接的工作原理
Amazon Cognito 帐户链接过程如下。
- 当客户想要登录系统时,会通过帐户链接发起请求。这里,首先由 app 打开开发者指定的授权链接。这是一个到 Cognito 用户门户的链接。
- 重定向时,客户会与 Cognito 登录页面进行交互。然后,用户可以提供必要的登录信息(用户名和密码)以进行身份验证。
- 当 Cognito 验证客户的凭证时,授权码被提供给应用程序,并被传递给 Alexa 服务。
- 然后,Alexa 服务将代码提供给 Cognito。作为回报,它向 Alexa 服务提供初始访问令牌和刷新令牌。然后用户可以使用 Alexa 技能访问。
使用 Amazon Cognito 逐步链接帐户
为了完整地设置这个示例,您需要一个 AWS 帐户和一个 Amazon 开发人员帐户。可选地,需要一个域,在亚马逊 Route53 托管。
按照以下步骤继续。
步骤 1-创建用户池
I)登录 AWS 管理控制台并导航至 Amazon Cognito 。
- 通过查看 AWS 管理控制台右上角的区域,检查正在使用的 AWS 区域。
- 尽管可以使用 Cognito 支持的任何地区,但 Alexa 建议使用四个地区之一 us-east-1(北弗吉尼亚)、us-west-2(俄勒冈州)、eu-west-1(爱尔兰)和 ap-northeast-1(东京)。
ii)点击管理用户池。
iii)点击创建用户池。
iv)输入一个池名,点击查看默认值。
图 1:创建用户池
v)在左侧菜单中选择属性。
vi)首先,让我们看看如何设置电子邮件认证。因此,首先选择电子邮件地址或电话号码,然后选择允许电子邮件地址。
vii)在**中,您想要要求哪些标准属性?**部分,检查以下内容:
地址、电子邮件、姓、名、电话号码
如果您需要注册页面的更多用户详细信息,您可以相应地添加它们。
图 2:添加属性 I
图 3:添加属性 II
viii)点击下一步。
ix)转到左侧面板中的策略并输入以下配置,然后点击保存。
图 4:添加策略
x)在左侧菜单中选择 MFA 和验证,并设置:
是否要启用多因素认证(MFA) 至关闭和您要验证哪些属性?至电子邮件
图 4:设置 MFA 和验证
xi)点击保存更改,在左侧菜单选择 App 客户端,然后点击添加 App 客户端。
图 5:创建应用程序客户端 I
xii)输入一个**应用客户端名称。在刷新令牌到期(天数)**字段中输入首选周期。
xiii)选中保留生成客户端机密框,其余框未选中。点击创建 App 客户端。
图 6:创建应用程序客户端 II
xiv)在左侧菜单中选择审查,并点击页面底部的创建池。创建完成后,会提示消息说您的用户池已成功创建。
图 7:用户池的回顾
图 8:成功创建的用户池
xv)现在,请注意左侧菜单发生了变化。在左侧菜单中选择通用设置 > App 客户端,选择显示详情。可以看到为 App 生成的 App 客户端 id 和 App 客户端机密。
图 9:查看创建的应用程序客户端细节
十六)在左侧菜单中选择 App 集成 > App 客户端设置。在启用的身份提供者下,选中认知用户池旁边的框。
xvii)接下来,构建回调 URL 列表。将以下 URL 中的占位符值 < VID > 替换为您的开发者帐户的供应商 ID 。要查找您的供应商 ID,请前往 https://developer.amazon.com/settings/console/mycid并根据提示使用您的亚马逊开发者账户登录。
https://alexa.amazon.co.jp/api/skill/link/<VID>
https://layla.amazon.com/api/skill/link/<VID>
https://pitangui.amazon.com/api/skill/link/<VID>
注意这三个 URL 对应的是 Alexa 的三个区域: FE (co.jp)、EU (layla)、NA (pitangui) 。
将它们组合成一个逗号分隔的值,并将逗号分隔的回调 URL 列表复制/粘贴到回调 URL字段中。
图 10:应用程序客户端设置 I
xvii)在 OAuth 2.0 和允许的 OAuth 流程下,勾选授权码授予复选框。在允许的 OAuth 范围下,勾选这些框:
openid,aws.cognito.signin.user.admin,个人资料
Openid——返回客户端可读的 id 令牌中的所有用户属性。
**AWS . cogn ITO . sign in . User . admin-**授予对需要访问令牌的 Amazon Cognito 用户池 API 操作的访问权限。
profile- 授权访问客户端可读的所有用户属性。
点击保存更改。
图 11:应用客户端设置二
步骤 2-设置认知到 OAuth 域
设置 Cognito OAuth 域有两个选项。
**I .使用认知域:**该选项只能用于试验和演示目的。
**二。使用你自己的领域:**如果开发者打算发布一个使用 Cognito 资源库的技能,那么这个选项是必需的。
因为我做这个例子只是为了尝试,所以我将继续使用 Cognito 域。
使用认知域
I)从左侧菜单中选择 App 集成 > 域名。
ii)选择一个域名前缀,并将其输入到域名前缀字段。
iii)点击检查可用性。将提示域前缀是否已经存在。
iv)收到可用的域名前缀后,点击保存更改。
图 12:创建认知域
v)从左侧菜单中选择应用集成。可以看到完整的网址为(https://chathurangis-user portal . auth . us-east-1。亚马逊歌尼图。com) 中的域域。
图 13:在应用集成中查看创建的域
使用您自己的域名
如果 Alexa 开发者有一个由亚马逊路线 53 管理的域名,他们可以选择这个选项。
步骤 3-设置 AWS 身份和访问管理( IAM)
在本节中,我们可以创建一个 AWS IAM 角色(带策略),它将由支持您的技能的 Lambda 函数使用。
- 导航到 AWS IAM 控制台。
- 点击左侧菜单上的策略。
- 点击创建策略按钮。
- 根据您的要求创建一个策略。
- 在左侧菜单中选择角色,点击创建角色按钮。
- 在选择可信实体类型下,选择 AWS 服务。
- 在选择将使用该角色的服务下,选择λ。
- 点击下一步:权限按钮。
- 搜索您之前创建的策略,并选中策略旁边的框。
- 点击下一步:标签按钮,然后点击下一步:查看按钮。
- 输入合适的名称并点击创建角色按钮。
图 14: AWS IAM 创建策略和规则
步骤 4-设置 Alexa 技能
您可以通过您的亚马逊开发者帐户使用 Alexa 技能工具包开发者控制台 创建自己的 Alexa 技能:
创建 AWS Lambda 函数
创建 AWS Lambda 函数。您可以从头开始创建 lambda 函数,或者使用现有的模板,或者从 AWS 无服务器应用程序存储库中部署一个示例 lambda 应用程序。
图 15:创建 AWS Lambda 函数
将技能与 Lambda 函数连接起来
- 复制您从 Amazon 控制台创建的 lambda 函数的 ARN。
图 16:创建的 Lambda 函数
2.现在,导航到 Alexa 开发者控制台中的端点部分,点击AWSλARN并在默认区域下输入复制的 ARN。
图 17:配置端点细节
为技能配置账号链接
- 在 Alexa 开发者控制台中,选择左侧菜单中的账户链接。
- 将以下选项设为“开”。
图 17:配置帐户链接 I
3.接下来,在安全提供者信息下,输入以下配置。
I)将授权码授权设置为授权授权类型。
ii)通过将< example_domain >替换为您的域,将< VID >替换为您的 in vendor ID,设置**授权 URI、**以下 URL:https:///oauth 2/authorize?redirect _ URL = https://pitangui . Amazon . com/API/skill/link/
iii)设置访问令牌 URI ,将< your_domain >替换为以下 URL 中的您的域:https:///oauth 2/Token
iv)根据您在 Cognito 上找到的相应值,设置客户端 ID 和客户端密码。
v)保留客户端验证方案为 HTTP Basic(推荐)。
vi)点击 +添加范围并输入 openid, +添加范围并输入 profile 和 k +添加范围并输入 aws.cognito.signin.user.admin
vii)点击 +添加域名,输入您的域名。请注意,此处应输入域列表值,不包括 https://。
图 18:配置帐户链接 II
图 19:配置帐户链接 III
viii)就这些。点击保存按钮。
步骤 5 —测试
现在,您可以通过 Beta 测试或登录您所在地区的 Alexa 网站来测试该技能。
I - Alexa Beta 测试
- 要进行 Beta 测试,请前往 Alexa 开发者控制台的发行版部分。
- 用您各自的详细信息完成商店预览、隐私&合规性和可用性部分。
- 然后,在“可用性”下,您将被告知您的技能是否可以进行 Beta 测试。
图 20: Alexa 技能测试版测试
同样,您可以根据 Beta 测试的需要添加管理员和测试人员。
II-通过亚马逊进行测试
- 使用你创建技能的同一个亚马逊开发者账号登录 Alexa 网站(alexa.amazon.com)。
- 导航到技能的详细信息页面。点击技能。点击你的技能。点击开发技能标签,找到你的 alexa 技能并点击它。
通过以上两种方式中的任何一种,你都可以在测试模式下使用你的技能。接下来你会被提示启用你的技能。如果已经启用,点击设置,然后点击链接账户。
图 21:账户链接
3.接下来,将打开一个新的浏览器选项卡。点击注册创建用户。填充细节。回想一下,它们是您在创建用户池时启动的变量。接下来点击报名。
图 22:用户登录
4.接下来会出现一个窗口,要求输入验证码。输入您通过电子邮件收到的验证码,然后点击验证。现在,您的用户已被添加到用户池中。您可以通过导航到 Cognito Federated Identities 下常规设置中的用户和组来查看添加的用户。
图 23:在 Cognito 用户池中创建的用户和组
5.然后,再次单击登录,输入您刚才输入的帐户的电子邮件和密码。如果认证成功,你的技能和账号现在就关联了。您将获得以下成功标签。
图 24:成功链接技能和账户
返回亚马逊开发者控制台,导航到测试选项卡。使用你在创造技能时指定的话语来测试你的技能。以下是我的技能通过认证并与我的帐户关联后的快照。您可以在 JSON 编辑器中看到请求和成功的响应。Alexa 模拟器将显示个性化的结果。
图 25:账户链接后在 Alexa 模拟器中的测试技巧
现在,我们已经成功地将技能与用户帐户关联起来。
如果您要使用另一种最常用的验证机制,如移动 OTP,也可以遵循相同的过程。您需要做的唯一修改是在 Cognito 用户池中设置电子邮件地址或电话号码并选择允许 电话号码。然后在标准属性列表中选择 phone_number 。
尽管如此,在使用移动 OTP 时,每个地区都有短信价格限制。但是,对于基于电子邮件的验证,没有此类限制。
希望你通过这篇博文清楚地了解了 Alexa 账户链接是如何工作的。如果你对这篇博文有任何问题或评论,请在下面留下你的评论。
来源:链接
干杯,学习愉快!
参考
[1]https://developer . Amazon . com/en-US/Alexa/Alexa-voice-service/what-is-AVS
https://www.qed42.com/blog/alexa-account-linking
[4]https://www . digital trends . com/home/what-is-amazons-Alexa-and-what-can-it-do/
[5]https://medium . com/@ ankit 81008/Alexa-account linking-cogn ITO-74a 29243 B1 ca
如何设置 AWS MySQL 数据库
一个快速、简单、免费的平台,用于创建 SQL 教程
图片由 Gerd Altmann 从 Pixabay 拍摄
在写一系列关于如何使用 SQL 回答各种业务问题的文章时,我需要找到公共数据集。想要使用真实的数据而不是精选的 Kaggle 数据集,我在各种云平台上设置了我的数据库实例。我正在分享这些数据库设置经验。第一个实现是 AWS MySQL。
为什么选择 AWS MySQL?
我会用“自由层”来开始和结束任何争论
自由层
AWS 显然是一个受欢迎的平台。虽然这次经历很顺利,但并不是每次与 AWS 的互动都是一帆风顺的。
虽然 MySQL 的数据库实例工作正常,但是 MySQL Workbench 还有许多不足之处。我用来构建数据行的 insert SQL 文件一直冻结着我的应用程序。一旦加载了数据,从工作台到 AWS 以及从 AWS 到工作台的查询性能相当快。
MySQL 数据库实例设置
本教程假设您拥有一个 AWS 帐户。如果您是第一次设置您的帐户,有一些免费等级选项。从您的控制台中,搜索 Amazon RDS 服务。这个链接会引导你到 AWS 提供的一个优秀的指南:https://AWS . Amazon . com/getting-started/hands-on/create-MySQL-db/。它将指导您逐步设置自由层实例。
从亚马逊 RDS 服务创建一个数据库——作者截图
挑完配置就上路了——作者截图。
数据
在我的教程中,我将使用一些网上可获得的严重风暴事件信息。我已经在我的工作中使用了这些数据,它足够有趣,可以创建有趣的样本用例。我会将恶劣天气事件的详细信息加载到数据库表中。如果你想看的话,我提供了这些文件的链接。
ftp://ftp.ncdc.noaa.gov/pub/data/swdi/stormevents/csvfiles/
恶劣天气数据目录(SWDI)是美国恶劣天气记录的综合数据库。
www.ncdc.noaa.gov](https://www.ncdc.noaa.gov/ncei-severe-weather-data-inventory)
要将数据加载到表中,需要将其转换为 SQL Insert 语句。总是寻求尝试不同的工具,我用了康伯特(https://numidian.io/convert)。我无法谈论他们的数据安全性,因为我使用的是公共数据集。您上传您的数据文件,它被转换成您的 Create 和 Insert SQL 语句。为了防止 MySQL Workbench 中的错误,我不得不做一些小的改动,但这仍然是值得的。
连接到 AWS 数据库实例
按照说明做了 90%的工作。 MySQL 踢我错误告诉我检查我的密码和访问。我不得不回到我的 AWS VPC,并允许访问。添加 TCP 规则后,我立即可以连接了。
创建表格并添加数据
在我创建的“演示”模式下,我使用了由 konbert 生成的 SQL 文件。我打开 SQL 文件并执行语句。我不得不将一些 varchar(MAX)语句更新为 varchar(##)。我最终加载了两次数据,因为 insert 语句没有显示友好的绿色勾号。我花了几分钟时间在没有副本的情况下复制了这个表,并且准备好了。运行查询的性能优于对大型 Create/Insert SQL 文件进行更改。
结论
我绝对不喜欢 MySQL Workbench 作为我与 AWS 数据库集群交互的应用程序。也许您可以使用一个替代的 GUI 应用程序来与您的数据库进行交互。如果没有更好的工具可以使用,我以后很可能不会选择 AWS 上的 MySQL。
如何建立现代数据分析平台
借助 ELT plus 等易于实施且可扩展的云服务,您可以非常快速地建立数据仓库、湖泊和枢纽。
构建你的数据景观——照片由 Neda Astani 在 Unsplash 上拍摄
通过 ETL 过程和 OLAP 立方体构建一个传统的本地数据仓库经常会导致项目延期、额外的成本和 IT 经理的头痛。新的技术、方法和云让我们有可能减少设置时间,并提供更加灵活和可扩展的解决方案。
云(即插即用)
与亚马逊、谷歌等大型云提供商合作。数据仓库、数据库等 IT 服务都是即插即用的。提供像 Big Query [1]或 Redshift [2]这样的数据仓库服务需要每次点击。公共云也提供了比自托管计算机中心更多的计算能力。
尤其是对于小公司和初创公司来说,这是一个使用这些服务的有趣机会,因为它们具有成本效益并且易于设置。如果您感兴趣,您可以通过大多数大型云提供商提供的免费层轻松测试解决方案。
数据仓库与数据湖
几十年来,数据工程师、软件工程师和数据分析师一直在用 ETL 过程构建数据仓库,并一直专注于实现严格遵循 Star 或 Snowflake 等数据模型的架构。此外,人们通常更关注技术细节,而不是业务需求。在数据湖中,所有数据都存储在临时区域中。之后,数据将被处理到数据仓库(数据仓库是数据湖的一部分的混合模型也很常见)、数据集市或用于分析和报告。这使得数据湖比数据仓库更加灵活。此外,它还支持机器学习等新的用例,并为非结构化数据提供存储功能。
ELT 与 ETL
ETL(提取-转换-加载)过程在将数据加载到数据库之前进行转换,而 ELT(提取-加载-转换)过程首先将数据加载到数据库中,并让数据库执行转换任务。这带来了一些好处:
- 繁重的转换任务不必在 ETL/ELT 工具中进行。这使得数据处理速度更快(业务分析师不再需要等待数小时或数天的数据)
- 实现可以更快地实现,因为数据工程师不再需要担心业务逻辑。相反,他们只是建立从源中提取原始数据的工作。这种转换可以在以后由数据湖中的业务分析师或数据科学家来完成,或者通过 BI 工具来完成。
- 流程中的更改和错误修复可以更快地实现,因为没有转换发生,数据可以很容易地重新加载[3]。
最终,像这样的架构可以成为目标:
在基于云的数据库中进行转换的 ELT 流程—图片由作者提供
敏捷项目管理&数据分析过程
数据项目的目标可以是:
- 数据仓库或湖中的新数据对象
- 报告
- 数据科学模型,例如
实现过程通常如下所示:
大数据和分析流程—按作者分类的图片
在收集、准备和建模数据之后,请求者(通常是产品所有者或业务部门)会对数据进行评估。在所有要求的愿望得到满足之前,可能需要一些时间和调整。因此,迭代方法是解决方案。就我个人而言,我建议使用基于 scrum 的 sprints,产品负责人和业务部门每两周评估一次结果。
自助式商务智能工具与老式 OLAP 立方体
构建数据分析平台的另一个加速是通过自助 BI 工具实现的,如易于使用的 Google Data Studio 和 MS Power BI Desktop 或 Qlik 或 looker 等“重型”解决方案。由于有了这样的工具,业务用户可以通过拖放来构建报告。例如,由工程师构建沉重的 OLAP 立方体现在可以由商业用户使用数据透视表功能来完成。通过这样做,耗时的工作从 IT 部门转移到了业务部门。因此,这也可以被视为一种优势,因为自助 BI 工具将数据带给了最了解业务的人。
结论
在即用型云服务的帮助下,ELT 和自助 BI 工具等新模式以及敏捷方法公司(尤其是中小型公司)可以在更短的时间内构建数据分析平台,从而能够更加专注于业务需求。
资料来源和进一步阅读
[1]谷歌, BigQuery
[2] AWS,亚马逊红移
[3] XPLENTY, ETL 与 ELT
如何设置避鸽系统的数据收集
鸽子回避系统
设置 Raspberry Pi 为深度学习项目收集图像
免责声明:您正在阅读的是描述技术设置的第 2 部分。 第 1 部分 给出了鸽子回避系统的概述 第 3 部分 提供了关于鸽子识别模型的细节。
来源:安迪·霍姆斯在 Unsplash 上拍摄的照片
现在我们已经熟悉了这个问题,让我们设置 Raspberry Pi 来收集图像。在这一部分,我将谈论鸽子回避系统的技术设置。本文由三个部分组成:
- 硬件设置
- 编排软件
- 生产设备
如何为数据收集设置 Raspberry Pi 的一般方法可以适用于您自己的深度学习项目。该部分的所有代码位于 GitHub 的中,可以重复使用。
在我开始之前,我想感谢我的朋友兼同事丹尼尔,他帮助我建立了覆盆子,并在生产中突然出现问题时为我提供技术支持。
硬件设置
回想一下第 1 部分的图表:
图 1:鸽子回避系统架构图
硬件方面,鸽子回避系统包括一个 Raspberry Pi 和三个外部组件:运动传感器、摄像头和步进电机。所有这些都是通过主要的管道来安排的。主管道是我们需要编写的软件中最关键的部分。甚至在我们训练鸽子识别模型之前,我们就需要把它准备好来收集数据。然而,我们首先需要将外部组件连接到 Raspberry Pi。为此,我们将需要使用 GPIO(通用输入/输出)引脚,可以通过 Python 程序访问这些引脚。如图所示,引脚被枚举:
图 2:树莓 Pi GPIO 布局。来源:官方覆盆子文档
任何 GPIO 引脚都可以指定为输入或输出引脚,用途广泛。此外,还有两个 5V 引脚、两个 3.3V 引脚和几个 0V 接地引脚,我们将用来连接外部 Raspberry 元件。
连接运动传感器
应该连接的第一个元件是运动传感器。我用了一个红外运动传感器 HC SR-501 可以检测到人或者动物反射的红外线。传感器的示意图如下所示。
图 3:红外运动传感器 HC SR-501 的示意图。来源:Freenove 文档
当一只鸽子进入传感器的活动区域时,它会向与之相连的 GPIO 引脚输出一个 3.3V 信号。运动检测器的敏感范围在 2 到 7 米之间,可以通过旋转电位计 R2 进行校准。电位计 R1 校准高电平输出之间的时间延迟。还有一个跳线帽(黄色矩形),用作两种触发模式之间的开关:
l:不可重复触发模式。传感器第一次感应到鸽子后会输出高电平。它将继续输出由 R1 配置的高电平延迟。在此期间,感应器无法感应到鸽子。当延迟时间结束时,传感器将输出低电平。
h:可重复触发模式。传感器可以检测到鸽子,直到它离开阳台。在此期间,它输出高电平。鸽子离开后,传感器计时延迟,也是由 R1 配置的,然后输出低电平。
我将传感器设置为可重复触发模式,因为我想激怒鸽子,直到它们最终离开阳台。图 4(红圈)显示了如何将运动传感器连接到树莓。在测试设置时,我使用的是 Raspberry Pi 扩展板。在生产系统中,我将跳线直接放在覆盆子引脚上。
图 4:将外部组件连接到 Raspberry Pi
连接步进电机
步进电机会转动一个吓跑鸽子的装置。我在我的设置中使用了步进电机,因为它可以旋转特定的角度和定义的时间间隔。
步进电机有一个连接到步进电机驱动器的 5 路插座。步进电机驱动器用于将来自树莓的微弱输入信号转换成驱动步进电机的鲁棒控制信号。
图 5:步进电机驱动器原理图。来源:Freenove 文档
步进电机驱动器 IN1-IN4 的输入信号对应于控制步进电机位置的输出信号 A-D。位置控制可以通过编程来完成。步进电机需要一个外部 5V 电源,该电源应与 Raspberry Pi 共享一个公共地。图 4 显示了如何将步进电机与 Raspberry Pi(绿色圆圈)连接。
连接摄像机
连接摄像头是最简单的部分。摄像头端口位于 HDMI 连接器附近。我们只需要把相机的排线绑牢,就万事俱备了。
图 6:树莓 Pi 布局。来源:Freenove 文档
当所有外部组件都连接好后,它看起来就像图片上的混乱:
图 7:连接外部组件的 Raspberry Pi
现在,当所有组件都连接到 Raspberry Pi 时,我们可以编写 python 代码来操作它。
编排软件
我们需要编写 python 代码,以便在检测到运动时触发主管道。Raspberry Pi 已经预装了 python 包 RPi。GPIO 提供了一个类来控制 GPIO。我们需要做的第一件事是设置 GPIO 编号,它定义了在 Raspberry Pi 上寻址 GPIO 引脚的模式。然后,我们设置了一个连接运动传感器的引脚作为输入端口。
设置运动销
之后,我们编写一个事件检测方法。当在 pin_motion 上检测到上升沿时,add_event_detect()将调用 main_pipeline,而不管程序中发生了什么。
运动检测方法
我们需要在无限的 while 循环中运行运动检测方法。这样,程序将一直执行,除非键盘中断结束它。
无限循环中的运动检测方法
现在来看主管道。主管道会调用相机拍照。之后,它会尝试识别图像上有哪些物体:鸽子、人或什么都没有。基于此,它将移动马达,休眠 180 秒,或者什么也不做。
主管道
我们用需要指定的 take_pic()方法拍照。首先,我们配置摄像头模块:
配置摄像头模块
您可能已经注意到,我导入了 config,这是一个配置文件,在其中我指定了外部组件的 GPIO 引脚、图像路径以及图像分类模型的训练数据的路径。
照相
take_pic()在检测到运动时拍照,并将其存储在配置中指定的 img_path 中。如果我们还处于数据收集阶段,那么就要用鸽子火绒手动给图像打标签,把主管道中的条件表达式注释掉,直到我们收集到足够多的图像,训练好模型。
如果在图像上识别出一只鸽子,我们需要通过旋转马达来驱赶它。电机旋转在 rotate_motor 方法中实现。
我们再一次指定了电机所连接的引脚。步进电机有四个引脚,负责旋转角度。
步进电机引脚配置
电机以一定角度旋转(例如从 A 到 B)。
图 8:步进电机图。来源:Freenove 文档
上面代码中指定的管脚:[12,16,20,21]对应的是步进电机的位置:[A,B,C,D]。对于顺时针旋转,我们需要以正向顺序迭代该列表:A→B→C→D→A,等等。从一个状态到另一个状态(例如,从 A 到 B)的每个转换被称为一个步骤。通过控制旋转步数,我们可以控制旋转角度。通过控制两步之间的时间,我们可以控制转速。
首先,让我们实现一个停止电机的方法:
我们对 motor_ports 进行迭代,并将输出级别设置为低。现在,我们可以实现一个具有相同逻辑的旋转函数:在 motor_ports 上逐步迭代,并将输出设置为高。rotate_motor()方法比我们目前所写的稍微复杂一些。
旋转电机
在主管道准备好之后,我们可以测试我们的设置:
鸽子回避系统。测试设置
注意,在这个设置中,我还没有对模型进行训练。因此,每当传感器检测到运动时,电机就会运行。此外,塑料猫不是旨在吓跑鸽子的最终解决方案。它在这里只是为了表明电机运行。
生产设备
现在是时候把树莓派安装到生产环境中了,也就是我的阳台。为了保护硬件免受雨水和鸽子的攻击,我需要防水的塑料盒。我在全球速卖通订购了漂亮的接线盒。然而,根据我过去购买鞋子和手袋的经验,送货可能需要长达四周的时间,我想尽快开始收集数据。因此,我用乐高为摄像头和运动传感器搭建了房子。对于覆盆子本身,我用了一个特百惠盒子,当然,作为一个好主妇,我的厨房里就有这个盒子。
图 9–11:我阳台上的数据收集装置
下一步是让覆盆子通电。最初,它配有一根电源线,长约一米。这远远不够。我在阳台上没有电源插座。因此,我需要从房子里的插座给树莓供电。为此,我焊接了一条 5 米长的新电源线。有了新的电线,我把电源直接给树莓引脚,这通常是不推荐的,但仍然是一种确定。
现在是等待鸽子的时候了。实际上,我需要测试运动检测器对我阳台区域的覆盖情况。因此,我在阳台周围放上燕麦片来吸引鸽子,让它们四处走动。这样,我可以检查运动传感器是否有检测不到鸽子的死角。仅仅几个小时后,我得到了第一张鸽子的照片!
图 12:第一张鸽子图片
看过这张照片的人都注意到了鸽子有多胖。事实上,在杜塞尔多夫我们有非常胖的鸽子。然而,一个非常不幸的惊喜是,运动传感器只检测到正前方的鸽子,而忽略了传感器左侧或右侧的鸽子。因此,我决定安装第二个运动传感器,它将观察垂直方向。这样,我阳台的整个周边都被覆盖了。
图 13:运动传感器设置
运动传感器覆盖了我阳台的两个垂直边缘。在阳台的右边,我有植物。因此鸽子不能在那里着陆。为了简单起见,我用同一根线连接了两个传感器,它在同一个引脚上发送来自两个传感器的信号。在把另一份燕麦片放在我的阳台上后,我意识到现在整个阳台都被覆盖了,我得到了比只有一个传感器更多的鸽子照片。新设置的另一个优点是,我可以将传感器的灵敏度设置为最低,从而减少误报(没有鸽子的图像,由风吹树木引发)。
现在为数据收集建立了鸽子回避系统。每当传感器检测到运动,相机就会拍照并存储在树莓 Pi 上。后来,我用鸽子绒仔细检查了这些照片,并给它们贴上标签,以便进一步训练。
这是第 2 部分的结尾。在“如何利用深度学习把鸽子从阳台上赶走”中,我讲的是如何利用迁移学习的力量进行鸽子检测。保持更新,与此同时,先睹为快从第三部分:如何被当成鸽子?假装你要建一个巢。
图 14:我的手被归类为鸽子。
如果你对这个项目有任何疑问,请随时通过 Linkedin 联系我。
如何在 AWS 上设置深度学习的 Docker
使用 nvidia-docker 访问运行容器中的 GPU
来源:https://blog.pridybailo.com/docker-and-nvidia-gpus/
这篇文章将帮助您在 AWS EC2 实例上设置一个支持 GPU 的 Docker 容器,用于深度学习。我们还将介绍如何从本地机器访问运行在容器内部的 Jupyter 服务器。
为什么?我最喜欢 Docker 的一点是,它允许你在远程机器上轻松地复制本地开发环境。每当你需要在 GPU 上训练一个模型时,这就非常方便了。
本文假设读者对构建 Docker 映像和在 AWS 上启动 EC2 实例有一定的了解。关于 Docker 以及它如何帮助改进您的数据科学工作流的初级读本,请查看这篇精彩的文章。
TL;DR: 使用nvidia/cuda
作为您的基本映像,并在启动容器时传递--gpus all
标志。
步骤 0:您的 Git 存储库
这篇文章的工作目录将是您项目的本地git
库。虽然这不是我们在 AWS 上设置支持 GPU 的 Docker 容器的目标的严格先决条件,但它将使您的生活更加轻松,因为它允许您在 EC2 实例上简单地git clone
GitHub repo。
第一步:Docker 图像
第一步是建立我们训练深度学习模型所需的图像。我们将通过将以下 docker 文件添加到我们的存储库中来实现这一点。
这个 does 文件的关键组件是[nvidia/cuda](https://github.com/NVIDIA/nvidia-docker)
基础映像,它完成了容器访问系统 GPU 所需的所有工作。
你的requirements
文件应该包含你训练你的模型所需要的所有包,并且需要包含Jupyter
以使最后的CMD
工作。如果您有一个训练您的模型的脚本,只需用运行您的脚本的命令替换上面的CMD
。
**奖金👻:**您也可以通过在需求步骤后添加RUN jupyter contrib nbextension install
来启用您最喜欢的 Jupyter 扩展。
步骤 2:启动并连接到 EC2
下一步是启动一个 EC2 实例并ssh
进入其中。您的实例需要安装Docker
和nvidia-docker
。最简单的选择是选择一个 ubuntu 深度学习 AMI,两者都有安装。
一旦你选择了实例的 AMI,选择一个带有 GPU 的实例类型。遗憾的是,它们并不便宜。在我写这篇文章的时候,us-west-2
中的一个p2.xlarge
实例将花费你$0.90/hour
😭。
在启动实例之前的 review 页面,编辑安全组以打开port 8888
,这样我们就可以从本地机器连接到运行在容器内部的 Jupyter 服务器。
检查您的评论页面看起来像这样,并启动您的实例。
记得在 source 下选择 MyIP。
一旦您的实例启动并运行,通过在本地终端上运行以下命令进入它:
% ssh -i <path-to-aws-pem-file> <user>@<ec2-hostname>
您可以通过选择您的实例并单击 AWS 控制台上的Connect
来找到您的user
和ec2-hostname
。如果你选择了一个 Ubuntu 图片,它看起来会像ubuntu@ec2–XXX.us-west-2.compute.amazonaws.com
。
第三步:克隆你的回购协议,建立你的形象
现在我们已经连接到一个正在运行的 EC2 实例,是时候构建我们的 Docker 映像了。在实例的命令行中,克隆 GitHub repo:
$ git clone https://github.com/<username>/<repo>.git
然后cd
进入它并运行这个命令来构建您的 Docker 映像:
$ docker build -t <image-name> .
**奖金👻:**如果你有一个预先构建好的镜像存储在容器注册表中,比如 docker hub ,你可以用docker pull
来拉你的镜像,如果你的镜像需要一些时间来构建的话,这可以节省时间。
步骤 4:启动支持 GPU 的容器
建立了我们的映像后,我们就可以发布我们的容器了🚀。在实例的命令行中,运行:
$ docker run --gpus all -d -p 8888:8888 -v $(pwd):/src <image-name>
关键的一点是--gpus
标志,它允许容器访问实例的 GPU(多亏了nvidia-docker
)。至于其他的,
-d
标志在后台运行容器(分离模式)。-p
标志将容器上的port 8888
绑定到 EC2 实例上的port 8888
(我们之前已经向入站连接开放了该实例)。-v
标志将当前目录(您克隆的存储库)挂载到我们在 Dockerfile 中设置的工作目录(我们称之为/src
)中,这样我们对笔记本所做的更改就会修改磁盘上的文件。
上面的命令既启动了一个容器,又启动了其中的 Jupyter 服务器(感谢我们的Dockerfile
中的最后一个CMD
)。您将看到打印在屏幕上的容器 ID。复制并运行下一个命令来获取 Jupyter 服务器的access token
:
$ docker exec <container-ID> jupyter notebook list
复制打印的access token
并返回到您的本地命令行。
步骤 5:连接到容器的 Jupyter 服务器
恭喜你。您已经完成了在远程 AWS 实例上设置支持 GPU 的容器的所有艰苦工作。最后一步是将您机器上的一个本地端口转发到容器内部运行的 Jupyter 服务器:
% ssh -NfL 8080:localhost:8888 <user>@<ec2-hostname>
上面的命令将机器上的port 8080
转发到 EC2 实例上的localhost:8888
,Jupyter 服务器在 EC2 实例上运行。
由于port 8888
是 Jupyter 的默认端口,我们转发了port 8080
以避免与本地机器上运行的任何笔记本发生冲突。
现在在浏览器中导航到localhost:8080
,粘贴上一步中的 Jupyter access token
。
哒哒🎉!您现在正在与一个运行在远程 EC2 实例上支持 GPU 的 Docker 容器内的 Jupyter 服务器对话。
如果您使用 PyTorch,您可以检查cuda
是否可用:
最后的想法
我希望这篇文章能够帮助你在训练深度学习模型时简化开发工作流程。将 Docker 整合到你的日常工作流程中需要时间,但是它会省去很多麻烦和花费在远程环境中的时间。
感谢阅读!🙏
附注完成后,记得关闭您的p2.xlarge
实例!
如何在 AWS 上设置 MS SQL Server
他们有一个简单的按钮!
图片由皮克斯拜的 Gerd Altmann 提供
正如我在上一篇关于 MySQL 设置的文章中所讨论的,虽然我将设置这些数据库来创建高级 SQL 教程,但我是在分享我的经验。如今的数据库是 AWS Microsoft SQL Server 产品。
为什么选择 Microsoft SQL Server?
SQL Server 是一种非常流行的数据库,尤其是对中小型公司而言。你经常会在 guru.com 和 upwork.com 看到 SQL Server/TSQL 自由职业者的招聘信息。编写或调试 TSQL 查询和存储过程相对容易。
与 MySQL 一样,您可以轻松地建立一个自由层实现。非常适合我的小型用例。
设置
使用 Easy Create,创建数据库和连接非常简单。点击几下,你的数据库就开始运转了。
Easy Create = Easy Button —作者截图
与数据库交互
为了与数据库进行交互,我下载了 18.6 版本的微软 SQL Server Management Studio(SSMS)。这个版本是 2020 年 6 月 22 日刚刚发布的,所以我很乐意去看看。对于使用过老版本的人来说,你会发现界面非常熟悉。
最初,我无法连接到 AWS 数据库实例。记住我必须为 MySQL 实例所做的更改;我编辑了入库规则。
添加 MSSQL 入站规则—作者截图
这似乎不起作用。尽管我使用了 Easy Create,但我必须返回到实例中,修改数据库实例以使其公开。一旦我完成了调试,我的状态就很好了。
连接到数据库
服务器名是您的端点链接,和一个逗号,后跟分配的端口 id。默认是 1433,对我来说很管用。
SSMS 连接数据库——作者截图
加载数据
我使用了与前一篇文章相同的恶劣天气细节数据源。
恶劣天气数据目录(SWDI)是美国恶劣天气记录的综合数据库。
www.ncdc.noaa.gov](https://www.ncdc.noaa.gov/ncei-severe-weather-data-inventory)
由于 1,000 行的插入限制,我无法装载常规的 Insert 语句。对我来说这太弱了。
1000 行限制—作者截图
在设置模式之后,我使用了导入平面文件选项。不需要将信息转换成 SQL 语句。平面文件导入会尝试文件中的数据类型。我不得不修改 varchar 长度,直到进程成功运行。
现在我的数据库已经设置好了,可以开始学习教程了
成功!—作者截图
结论
毫无疑问,SSMS 是比 MySQL Workbench 好得多的工具。我认为可以更好地估计数据类型和长度属性。如果我有一个包含 100 个报价的文件,那就太无聊了。AWS 的设置非常简单。直到我的第一个安全补丁失效,我才看任何手册。AWS 上的 SQLServer 将在我未来产品的候选名单上。
如何组建您的数据科学团队
当您希望将数据科学融入您的组织时,需要注意的事项
越来越多的公司正在建立他们的数据科学团队,希望利用他们拥有的数据。然而,建立一个有效的数据科学团队并不那么简单,因为他们有各种形状和大小。今天,我想分享我在这一领域获得的一些见解,并希望能够帮助您建立适合您的数据科学团队。
招聘前我需要考虑什么?
就像组织中的任何其他团队一样,构建数据科学团队没有放之四海而皆准的解决方案,但这里有一些关键因素可以帮助您做出正确的决定。
我为什么需要数据科学?
数据科学必须由用例驱动,这是您需要开始的地方。一个帮助你改进目标媒体活动的团队和一个帮助你优化核心商业算法的团队看起来会大不相同。虽然雇佣所有人可能很有诱惑力,但我们知道雇佣所有人通常最终都是免费的,这不是组建团队的好方法。如果您不确定一开始可以处理什么用例,寻求外部帮助来支持您首先定义问题可能会有所帮助,因为这应该是设置数据科学功能的先决条件。
我的组织能够采取行动吗?
许多数据科学团队未能带来价值,因为他们无法与组织融合,而高级利益相关者往往低估了使其工作所需的变革水平。组织的规模和成熟度是决定这里需要多少变革管理的关键因素。更常见的情况是,大型和历史悠久的组织更慢,更不愿意改变,但仅仅因为你是一家初创公司,并不意味着你可以迅速改变。数据科学基于测试和学习的基本原则,它要求组织拥有一种愿意改变数据并从中学习的文化。思考你如何能给组织带来改变和你将要带来的实际改变一样重要。因此,当你建立一个数据科学团队时,一定要在组织变革文化上投入同样多的时间和精力。
我如何建立团队结构?
创建一个专注于“转型”和“创新”的独立团队很有诱惑力,但这种方法行不通,因为创新不可能发生在孤立的环境中。另一方面,如果每个职能团队都开始雇佣他们的数据科学家,就不会有共同的标准和效率提升。关于数据科学应该是集中式还是分布式功能的辩论从一开始就一直存在,但我认为正如 Andy Groove 在《高产出管理》中所建议的那样,矩阵管理结构中的双重报告将是解决以任务为导向的团队和职能团队之间紧张关系的不可避免的解决方案。数据科学家应该同时向数据科学领导和与其合作的职能团队领导汇报。当然,这不是灵丹妙药,管理这种结构将使过程变得更加复杂,但如果做得好,收益应该大于成本。
我需要特定领域的知识吗?
虽然拥有领域知识是有益的,但我认为并不严格要求整个团队都有在你的业务领域工作的经验。一个高绩效的团队将不同背景的人聚集在一起,正是这种合作激发了新的想法。所需的领域知识水平将取决于你的领域有多具体,你的领域越具体和技术性越强,你就越需要了解它的人。与零售和银行等行业相比,医药和生物化学等行业可能会从拥有更高比例的领域知识人员中受益。
你应该先雇佣谁?
考虑到所有这些因素,你应该考虑你的第一份工作。成功聘用第一个员工非常重要,因为这将为团队定下基调,她也将证明数据科学在您组织中的价值。虽然有大量的技术问题需要评估和考虑,但我认为下面这些属性经常被忽略。
你不需要“专家”
多面手经常被忽视,因为他们不擅长某个领域,但他们在项目的早期阶段是非常有用的资源。有在这个领域扮演各种角色的经验的人是很好的第一批雇员,因为他们可以很容易地扮演不同的角色,不需要庞大的团队就能让事情发生。您的需求会有所不同,但拥有一个对数据、分析、产品和技术有着良好理解的人将有助于您将难题拼凑起来。
不要低估领导力的价值
第一个雇员不仅要亲自动手处理数据,她也将是建立团队的核心。我见过许多公司招聘技术数据科学家,希望在他们想要扩大规模时过渡到团队领导职位。我认为这种方法行不通,因为技术领导和团队领导是两种完全不同的角色,这种区别很重要。如果团队发起人对数据科学应该是什么样子有很强的理解和远见,并且有能力领导,你也许可以雇佣一个技术资源团队。然而,聘用一位了解技术领域领导力价值的人,并且能够全力以赴领导数据科学团队,会有巨大的好处。领导力不应该是事后才想到的,如果你希望团队成长,你的第一个雇员就应该有领导能力。
分析与工程
在理想的情况下,我们应该让数据科学专注于从数据中获取价值,让数据工程专注于构建可扩展的健壮数据管道,让软件工程师构建系统的其余部分。然而,事情很少是理想的,尤其是在事情刚开始的时候。你的第一个雇员至少需要了解上面提到的所有学科是如何结合在一起的,因为如果没有它们的协同工作,数据的价值就无法实现。如果你已经具备其中一项或多项能力,新员工应该补充缺失的技能,以涵盖所有这些领域。由于数据科学和工程的工作性质,它们之间应该存在一些积极的紧张关系,但是如果这种紧张关系得到很好的利用,您将能够构建健壮且可扩展的创新解决方案。对双方都有很好了解的候选人将有助于保持健康的平衡。
招聘时要注意什么?
数据科学是一个不断发展的领域,但这使得招聘人员非常困难,因为有太多的方法可以实现类似的结果,而且通常没有绝对的对错。然而,这里有一些我从在这个领域工作得很好的人身上看到的特质。
用工具解决问题的技巧胜过专业知识
随着每天开发出许多不同的工具和方法,特定工具的专业知识不再像以前那样有价值。伟大的数据科学家关注的是问题而不是工具,因为这才是数据科学应该关注的。理解和分解问题并提出正确方法的能力是数据科学家应该带来的真正价值。这可以通过要求候选人回顾他过去解决的一个问题,并找出他强调的内容来评估。
丰富的经验/理解力
创新往往来自于从不同的角度看问题。拥有广泛经验的数据科学家将能够从不同的领域和用例中获得知识,并将它们创造性地应用于不同的问题。由于行业的不成熟,这是一个特别难找到的特征,但是,可以通过要求候选人解决一个他以前没有经验的问题,并评估他是否能够逻辑地解决问题并应用他从其他领域学到的知识来测试潜在的技能。
真实世界的体验
现实世界是混乱的,没有什么可以替代实际的动手经验。越来越多的大学和 MOOCs 正在利用数据炒作,并提供教育资源来培训该领域的人才。然而,在学术环境中对先进理论技术的关注远不能应用于商业产生的实际数据。学习在商业环境中应用数据科学所需的技能需要实践、失败和毅力,经验是非常宝贵的。
对学习和实验的热情
实验和学习将“科学”放在数据科学中。要成为数据科学家,我们需要经常不断地实验,并从失败中学习。这个领域正在快速发展,那些能够保持在曲线顶端的人将会带来最大的价值。随着行业向未来发展,对学习和测试新想法充满热情的候选人更有价值。
尊重其他学科
数据科学依赖于许多其他学科才是有用的,伟大的数据科学家将这些团队聚集在一起。跨职能团队正是因为这个原因而成立的,因为正是所有不同组件的组合使得解决方案能够工作。在提供解决方案方面,有着与不同学科和背景的人共事经验的候选人更有效率。我发现理解并欣赏对方技能的人通常效率最高。
建立一个数据科学团队很难,但如果做得正确,它可以为企业带来很多价值。作为一名企业领导者,了解数据如何支持您的愿景并找到合适的人来执行这一愿景非常重要。虽然看起来每个人都在建立一个数据科学团队,但你可能很想加快这个过程。花时间和精力去建立一个合适的团队将会确保你交付你所期望的结果。
如果您喜欢我的内容,请在 https://jchoi.solutions/subscribe注册更多内容
如何成功设置 Python 项目文档🎉
使用 Sphinx 自动化您的文档创建工作流并阅读文档
你做了一个很棒的 Python 软件并向公众发布。太好了!不幸的是,这还不够。️You 需要文件!
良好的文档对采用至关重要。让文档清晰是你能为当前和未来的软件包用户做的最好的事情之一。🎁
文件不会自己写,但你可以通过阅读文件、斯芬克斯和一些眼泪来达到部分目的。😢开个玩笑,可能会有一些并发症,但希望不会有眼泪。
将文档设置为在每个新版本上自动构建可能会令人困惑。在本文中,我将向您展示如何设置您的文档,这样您就可以为您的项目提供最大的成功机会。我们走吧!🚀
斯芬克斯。资料来源:pixabay.com
如果你没有一个基本的 Python 包,请点击这里查看我的制作指南。然后阅读的下一篇文章,学习如何添加测试、Travis、工作服、Black 和 PyUp,这样你就更有信心你的代码不会被破坏。
我将在本文中使用的示例项目是py libraries*,*一个我为 libraries.io API 制作的包装器。您可以使用它来订阅新版本开源包的电子邮件提醒。您还可以使用它来查找关于开源包和库的许多方面的信息。这里的是单据。让我们看看如何建立它们!🚀
步骤 1:设置阅读文档
免费阅读文档 ( RTD )主机开源项目文档!非常酷。🕶
在https://readthedocs.org设置您的 Read the Docs 账户。
然后执行以下操作:
- 如果您在 RTD 上看不到 GitHub 资源库,请手动将其导入。
- 进入 RTD 项目后,输入相关信息并勾选编辑高级项目选项框。
- 在下一个屏幕上,选择 Python 作为你的编程语言。
- 点击完成。然后 Admin 。然后高级设置。
- 选中复选框,使用 setup.py install 在 virtualenv 中安装您的项目,并在需求 文件字段中输入
requirements_dev.txt
(假设这是您的需求文件的名称。保存。或者,您可以创建一个 readthedocs.yml 配置文件,如这里的所述。
6.点击构建选项卡。您应该看到一个构建正在进行或已经完成。
7.构建完成后,点击查看文档。这些文档还没有显示太多关于我们包的信息——我们稍后会处理这个问题。
当你推送 GitHub 时,如果配置了 webhoook,你的文档会自动生成。如果您自动将 repo 连接到 GitHub,您可能不需要为自动构建配置任何其他东西。☝️
如果您手动导入了回购协议,则需要设置一个 webhook。说明可以在这里找到。我对这些文档做了一些小的改进,所以如果你觉得有什么不清楚的地方,用 PR 来改进它们。😄以下是添加网页挂钩的方法:
在你的 GitHub repo 中,进入设置->-web hooks->-添加 webhook 。您应该会看到如下所示的表单。
对于有效载荷 URL ,进入 RTD集成设置并复制 webhook 信息。在前面加上https://
。你可以不去管其他的事情,点击添加 webhook 。或者选择让我选择单个事件如果您想要触发 RTD 文档构建以响应除推送到回购之外的其他 GitHub 事件。仅供参考,我不得不删除我在 RTD 和 GitHub 上的 webhook,并重做重新添加 webhook 使其工作。
下次你把你的代码推给 GitHub,合并 PR,去 RTD 吧。您应该看到您的文档被自动重建!🎉如果你没有马上看到变化,等待几分钟。
酷!现在让我们设置 Sphinx 来为 RTD 生成我们的文档。
步骤 2:安装和配置 Sphinx
Sphinx 号称可以轻松创建智能美观的 Python 文档。我不知道我会说这是一个快照,但斯芬克斯是非常酷的。😉功能包括语法突出显示、主题和简单的文档链接。这里有斯芬克斯入门指南供参考。
将sphinx==3.03
添加到 *requirements_dev.txt 中,*用pip install -r requirements_dev.txt
安装。
其他狮身人面像。资料来源:pixabay.com
在项目目录的顶层创建一个 docs 目录。在那个目录中,从命令行运行sphinx-quickstart
。
会问你几个问题。出现提示时,输入项目名称和作者姓名。通常缺省值是你想要的。
将自动生成以下文件:
- index.rst
- conf.py
- Makefile
conf.py
conf.py 控制构建文档时 Sphinx 如何运行。在其中,您可以配置项目文档设置。让我们对 conf.py 做一些修改,让 Sphinx 创建更好的文档。取消注释并调整该部分,使 abspath 为 ..
import os
import sys
sys.path.insert(0, os.path.abspath('..'))
将以下内容插入扩展名列表:
extensions = [
'sphinx.ext.napoleon',
'sphinx.ext.autodoc',
'sphinx.ext.viewcode',
'sphinx.ext.coverage',
]
我不是雪花石膏模板的粉丝,所以我在我的 requirement_dev.py 文件中添加了sphinx_rtd_theme==0.4.3
并安装了它。
如果你做了同样的事情,将 conf.py 中关于 html_theme 的那一行改为:
html_theme = ‘sphinx_rtd_theme’
制造
Make 是一个构建自动化工具。Sphinx 生成的 Makefile 控制以make
开头的快捷命令如何操作。点击了解更多关于 makefiles 的信息。不用深究 Make,你大概也能过得去。😉
从命令行运行make html
用这个快捷命令创建您的文档。然后,在你的docs->-build_->html目录下你应该会看到index.html。在浏览器中打开该文件,您应该会看到您的基本文档。😄
要检查任何未记录的函数和类,将下面几行添加到您的 Makefile 中。
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -b coverage
附加的行-b coverage
创建了一个覆盖率报告,这样可以告诉你有多少代码被记录。现在,当您运行make html
时, html 文件夹将包含一个名为 python.txt. 的文本文件,该文件将显示您需要一些文档的位置。😀
提交并继续制作您的 doc 文件。
其他文件。资料来源:pixabay.com
第 3 步:创建文档文件
你可以选择是用 Markdown(以下简称 md 还是 reStructuredText(以下简称 rst )来写你的文件。Md 更接近常规散文,学起来更快。但是,rst 允许您使用更多 Sphinx 的强大功能。这里是MD 的 GitHub 指南和rst 的Sphinx 指南。
是否花时间学习 rst 是你的选择。你还可以学习十亿种其他的东西,所以如果它不在你的清单上,我能理解。😉然而,许多项目的文档都是用 rst 写的,所以知道这一点很好。
使用这个在线 pandoc 转换器,你可以在 md 和 rst 的片段之间快速转换。您可以使用它从一种格式复制粘贴到另一种格式。 CloudConvert 对整个文件做同样的处理。CloudConvert 每天使用 25 分钟后开始充电。☝️
如果您走的是 rst 路线,请将您的自述文件扩展名切换到*。rst* 。
另外, setup.py 将需要 README 名称,而long _ description _ content _ type将切换到 rst。
我要用 rst。如果您使用 md,请将下面的文件扩展名更改为 .md.
创建以下文件:
- 行为准则. rst
- 投稿. rst
- 历史. rst
- README.rst
行为准则. rst
这里是 GitHub 信息和行为准则模板。《行为准则》解释了人们在与您的项目合作时应该如何表现,以及如果个人行为不当应该如何处理。在模板有位置的地方添加您的电子邮件。如果想将 GitHub markdown 模板复制到 rst 中,可以使用上面提到的转换器之一。😀
贡献第一
让那些想为你的项目做贡献的人更容易做到。在你的投稿文件里写清楚说明。请随意使用我的文件作为基础。
历史. rst
历史将包含你的变更日志。对套餐用户有帮助。你也可以在 GitHub 上使用你的发布信息中的内容。☝️
在 history.rst 中添加以下内容。
=======
History
=======0.0.1 (2020–05–15)
— — — — — — — — -* First release on PyPI.
将日期更新为适当的日期,并添加任何其他相关的项目符号。当您发布软件包的新版本时,您将附加该文件。
README.rst
您的自述文件应包括安装和基本使用信息。我建议你把用户指向 RTD 的完整文档。👉
您可以将其他文档添加到您的项目中,但是要确保将文件名放在您的 index.rst 的 TOC 中。然后它们会出现并链接到您构建的文档中。😀
现在让我们确保我们的用户能够得到帮助,理解你的函数和类是做什么的。
其他文件。资料来源:pixabay.com
步骤 4:添加文档字符串
文档字符串是一种向用户传达类或函数如何工作的方法。当用户寻求帮助时,文档字符串会出现在他们的代码中。Sphinx 将获取您的文档字符串,并自动使它们在 RTD 上的文档中可用。👍
在你的代码中写下你的文档字符串,紧跟在你的类或函数的第一行之后。文档字符串以三重引号开始,应该包含用户可能需要的任何信息,包括关于参数和返回值的信息。
Python 没有一种显而易见的方式来格式化文档字符串。选择一种方式来编写 docstrings,这样它们看起来很整洁,没有人需要询问或考虑如何做事情。😀
我建议使用谷歌风格——推荐这种风格是为了便于书写和阅读。关于文档字符串格式的详细讨论可以在这里找到。
通过在投稿文件中包含说明,确保让投稿人了解您选择的 docstring 格式。☝️
当您的代码中有文档字符串时,您可以在本地构建您的文档,并在浏览器中查看您的文档字符串。当本地版本看起来不错时,提交、推送并合并您的 PR,以在您的模块页面的 RTD 上查看您的文档字符串。
不带文档的字符串。资料来源:pixabay.com
如果事情没有按预期进行,这里有一些建议可以让你回到正轨:
解决纷争
斯芬克斯和 RTD 可以打破或导致文件看起来不同于预期的许多原因。检查 RTD 的构建日志以查找错误。
常见问题包括:
- 如果您的文档没有构建,而您使用的是 rst 文件,那么可能在某个地方有无效的 rst。要找到无效的 rst,请通过上面提到的 rst 检查器之一运行文件内容。
- 如果你的文档构建好了,但是你的模块没有显示出来,检查一下 RTD 上的原始输出日志。
- 确保您的 setup.py 和 requirements_dev.txt 文件是正确的。
- 如果你需要一个环境变量来运行,在 RTD 设置中添加它。
RTD 和斯芬克斯文档和堆栈溢出是有帮助的,但我发现这种故障排除很麻烦。我能感受到你的痛苦。🙁
现在让我们来看一个更好的话题——通过徽章向潜在用户传达信息。
步骤 5:向自述文件添加徽章
徽章为对您的项目感兴趣的人提供一目了然的信息。徽章可以灌输信心和合法性。以下是可以放在您的自述文件顶部的徽章示例:
在 https://shields.io/和 https://badgen.net/的可以获得许多徽章。我从 shields.io 加了一些我的,要获取徽章代码,不要只复制徽章旁边的网址。点击网址。然后添加您的包名。参见下面的轮徽章示例。
然后从下拉列表中复制 md 或 rst 代码,并将其粘贴到您的自述文件中。
在相关应用程序的网站上可以获得许多徽章。派普,特拉维斯和工作服有你能拿到的徽章代码。对于 PyUp,如果您单击 PyUp 仪表板上的徽章,您将看到可以复制并嵌入到自述文件中的代码。
这里是 RTD 的徽章信息。
酷!我们有徽章。最后,让我们看看如何促进协作。
步骤 6:创建问题和 PR 模板
来自更大社区的帮助对开源项目来说是一个巨大的好处。您希望让您的用户能够轻松地报告 bug 和功能请求以及相关信息。最好的第一步是提供一个清晰的问题模板。
问题模板
在浏览器中,进入 GitHub repo ->设置->选项。在功能下,点击绿色的设置模板按钮。
您可以添加自定义问题模板或使用 GitHub 的默认模板之一。
拉请求模板也同样有用。GitHub 有一个很好的制作指南这里。
现在,您可以更容易地获得开源项目的帮助了!
包装
在本文中,您了解了如何制作自动构建的优秀文档。你也学会了如何用徽章传达信息。最后,您看到了如何吸引合作者。
现在,人们将知道如何使用和贡献你的包。厉害!🎉
我希望这个指南对你有用。如果你有,请分享到你最喜欢的社交媒体渠道,这样其他人也可以找到它。👍
我写关于 Python 、 Docker 、数据科学和其他技术主题的文章。如果你对此感兴趣,请订阅我的 Data Awesome 邮件列表,在这里阅读更多。😀
斯芬克斯。资料来源:pixabay.com
快乐记录!🖋
如何为对象检测模型设置您的系统
你应该从头开始,第一次尝试就把它做好
戴维·克洛德在 Unsplash 上的照片
计算机视觉是当今人工智能的一个热门领域。目标检测是计算机视觉中的一项特殊任务。它帮助机器在没有人眼帮助的情况下识别一组特定的对象。许多应用,如受保护区域中用于监视的人脸检测、商店中的脚步计数、通过跟踪来估计车辆速度的物体检测、制造业中的产品故障检测等。—正在使用物体探测技术。
在不同的社交媒体上,我看到许多机器学习爱好者正在尝试不同的对象检测技术,并分享他们的结果。
不知何故,我对应用这些物体检测技术有点怀疑。我对深度学习算法的基础和一般机器学习问题、NLP 和计算机视觉的方法有一个相当好的想法。我也做过一些基于文本的模型。但是由于一些未知的原因,计算机视觉总是排斥我。
在我的职业生涯中,我一直避免从事与愿景相关的项目。我曾经把它传给我的同事。但我做不了多久。当我不能再避免它的时候,一种情况出现了。我必须做一些与特定上下文相关的对象检测任务。所以我决定试一试。
起初,我不确定从哪里开始。我做了大量的网络搜索和阅读来寻找合适的材料来指导我。我意识到有很多关于物体检测的文章,但是大多数都不完整。由于对我来说这是一个新的领域,而且我有时间限制,我需要关于程序的每一步的详细指导,我还需要一个快速实施模型的策略。
我找到了一些不错的文章——Medium,Analytics Vidya,Machine Learning Mastery 等。但是当我要实现它的时候,我面临着许多与系统设置和模型执行相关的挑战。
我面对不同的错误信息,我无法理解。花了几天时间才找出这些错误的原因。最后,我知道你需要列出一个需求清单,并遵循一个循序渐进的方法来在这个旅程中取得成功。
在本文中,我将讨论首次尝试成功实现对象检测模型所需的策略。
在开始安装之前了解要求
有两种方法来建立对象检测模型。您可以实现现有的模型架构。这需要更少的时间,并且您可以从其他实现中获得指导。此外,您还可以从名为迁移学习的方法中受益,该方法使用以前构建的模型的权重,并根据当前上下文重新训练模型。
另一种方法是从头构建一个模型。训练模型需要更多的时间和资源。但是它给了你更大的控制权。
我决定使用现有的模型架构,并根据我手头的任务对其进行重新训练。我选择了掩膜 RCNN 模型进行物体检测。我在 Medium 和 Machine-Learning-mastering 中找到了一些关于其基本原理和实现的文章。
我有一台装有 Windows 10 和 4GB NVIDIA GEFORCE GTX 1650 GPU 的笔记本电脑。为了训练它完成我的任务,我需要设置 GPU,还需要安装 jupyter notebook 来访问它。
从这里找到一篇关于设置 GPU 的美文。在克服了一些障碍之后,我已经能够做到了。指南有点旧了。一些命令不起作用。我设法把它们换成了新的。
我的下一个任务是实现这个模型。我打算实现一个端到端的现有对象检测模型,这样我就可以快速适应我的新用例。
我跟随文章从来到这里。我做了所有必要的步骤——下载了 Mask RCNN git 存储库(这里是),下载了图像及其注释文件,导入了必要的包,以及所需的文件。但是,当我开始训练给定数据的模型时,我陷入了困境。
我遇到了一个与 TensorFlow 相关的错误—“*ModuleNotFoundError:没有名为‘tensor flow . contrib’*的模块。”我尝试了网络上的不同方法来修复它。但是我不能。他们每个人都把我引向另一个错误。
花了几天时间才明白成功实施的秘密。您需要同步您为对象检测任务安装的软件包和软件的版本。它从设置 GPU 开始,适用于您在整个项目中安装的每个软件包。
是包版本把事情搞砸了。对我来说,它是 TensorFlow 的版本。TensorFlow 的当前版本是 2.3.0。Mask RCNN 模型架构是为 TensorFlow 版本 1.14 或更早版本构建的。没有意识到这一点,我继续安装所有软件包的所有最新版本,包括 TensorFlow,除非特别提到。
意识到(在许多不成功的尝试之后)TensorFlow 版本导致了麻烦,我决定卸载所有东西并重新开始。
我再次从安装 GPU 和适当版本的 TensorFlow 开始。这一次成功了。我仍然面临一些 python 包的问题。但我知道解决方法。我根据发布日期匹配了包的版本。
我再也不用担心兼容性问题了。我可以完全专注于建立我的模型。
在开始构建任何对象检测模型之前,您可以按照以下步骤收集设置系统所需的所有信息。
- 做一些阅读,找出你想要使用哪个模型(深度学习框架)来进行对象检测。在文献中,有大量的标准架构用于对象检测任务。RCNN,更快的 RCNN,掩膜 RCNN,YOLO,RetinaNet 等。是广泛使用的算法。
- 找到您选择的算法的 git 存储库,并找到它的实现。
- 在存储库中搜索实现的系统需求。
- 确定算法支持的 TensorFlow-GPU 版本(如果模型使用 TensorFlow)。
- 有关 TensorFlow 版本,请查看 python 的兼容版本。
- 找到适合 TensorFlow 版本的 CUDA 版本。
- 查找适用于 CUDA 的兼容 Visual Studio 版本
- 找到 CUDA 版本各自的 cuDNN 包。
- 搜索适用于 CUDA 实现的 Visual Studio 版本。
- 搜索其他 python 包的版本,如——numpy、scikit-learn、opencv-python、keras 等。您应该选择存储库中提到的这些包的版本。如果没有特别提到它们,请使用在创建存储库时发布的包版本。
如果你正确地收集了所有这些信息,你就为旅程的第二阶段做好了准备。
遵循安装顺序
如果您已经收集了关于需求的所有信息,您就可以开始一个接一个地安装它们了。设置系统时,请遵循以下顺序。
1.可视化工作室
下载您选择的 CUDA 版本所需的 Visual Studio 版本。对于遮罩 RCNN,我需要 Tensorflow 1.14。与 Tensorflow 1.14 兼容的 CUDA 版本是 CUDA 10。在此链接中找到与 TensorFlow 和 CUDA 版本相关的信息。
现在,CUDA 版本需要特定版本的 Visual Studio 和适当的 Visual C++编译器。我的情况是 Visual Studio 2017 有 Visual C++ 15.0 编译器。使用此链接获得合适的版本。
2.蟒蛇
从这里安装 Python 3.x 版本的 Anaconda。它将帮助您创建一个由 tensorflow-gpu 支持的虚拟环境。在这种环境下,你会推出 jupyter 笔记本。
3.库达
从这里下载安装 CUDA。我不得不下载 CUDA 10(旧版本)。从这里遵循 CUDA 的确切安装程序(除了 CUDA 版本)。CUDA 版本应该与您的 TensorFlow 版本兼容。
4.cuDNN
你的 cuDNN 版本必须符合你的 CUDA 版本。跟随这个链接找到合适的版本。只好下载了 cuDNN 7.4(老版本)。此处给出了 cuDNN 安装和设置环境变量的详细步骤。
5.张量流
您需要使用 Anaconda 提示符创建一个环境来安装 TensorFlow。选择与您的模型兼容的支持 GPU 的 TensorFlow。从这里的开始按照步骤进行操作。
安装 TensorFlow 后,应该检查一下是否可以访问 GPU。由于版本更改,上面链接中提到的代码片段不起作用。使用以下脚本来检查相同的情况。它将显示可用的计算资源。
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
6.Jupyter 笔记本
是时候在您的环境中安装 jupyter 笔记本了。遵循此处给出的指示。现在,您已经准备好探索对象检测模型了。
7.模型
下载要用于对象检测任务的模型。您需要从 git 存储库中克隆它。我用了面膜 RCNN。所以我使用下面的命令下载并安装了它。你可以在这里找到掩码 RCNN 模型的实现。
# To clone the Model
!git clone https://github.com/matterport/Mask_RCNN.git
# To change directory to the installation folder
cd Mask_RCNN
# To install the model
!python setup.py install
# To confirm the installation
pip show mask-rcnn
8.Python 包
现在,您可以下载构建模型所需的其他 python 包。在 Mask RCNN 库中有一个需求列表。它包含该实现所需的所有必需的包。不过,它没有提到所有软件包的版本。
为了避免进一步的版本冲突,我安装了所有必需的软件包和所需的版本。
pip install scikit-image==0.14.2
pip install Keras==2.2.4
pip install scipy==1.2.1
pip install Pillow==7.2.0
pip install Cython==0.29.6
pip install scikit-image==0.14.2
pip install opencv-python==3.4.5.20
pip install imgaug==0.2.8
pip install h5py==2.10.0
现在,您的 jupyter 笔记本已经准备好进行所有安装。你再也不用考虑兼容性问题了。您可以将全部精力用于训练和推断您想要建立的对象检测模型。
计算机视觉是人工智能的一个专门领域。解决计算机视觉问题的方法与通常的机器学习方法有点不同…我写这篇文章是为了帮助数据科学新手深入研究对象检测模型。这也将有助于像我这样的专业人士,他们以前从未尝试过物体检测任务。我以 Mask RCNN 为例来展示这个过程。我的意图是在开始任何目标探测任务之前,提出一种结构化的方法来配置系统。
附录:(一些问题和有用的链接)
- 如果你用 cudnn64_7.dll 在 Windows 上构建时遇到“导入错误”,请点击此链接。
- 如果您遇到“导入错误:导入 win32api 时 DLL 加载失败:系统找不到指定的文件。”,跟着这个环节。
- 如果你面对“内核错误 win32api”,按照这个链接。
- 你可以在这里找到一个很好的对象检测模型的实现。
5.模型实现的另一个漂亮演示是这里的。
谢谢你的时间。如果你喜欢这篇文章,你可能会喜欢我的其他文章。这是其中之一。
经过检验的快速学习方法
medium.com](https://medium.com/swlh/how-to-learn-new-programming-language-with-no-books-and-tutorials-862e8cf77d8f)