admin管理员组

文章数量:1645532

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

定制您的 ggplot2 条形图——5 种快速改善 R 数据可视化的方法

原文:https://towardsdatascience/customize-your-ggplot2-bar-graph-5-ways-to-instantly-improve-your-r-data-visualizations-f9c11dfe0163

如何抓住读者的注意力并制作出专业的图表

作者图片

条形图是数据可视化的基础。它们对于比较分类数据的值很有用。

  • 在 tidyverse 中,您可以只用两行代码构建下面的条形图。

作者图片

尽管它看起来很简单,但是这个图表告诉了你需要知道的关于数据的一切。如果你只是做一个探索性的数据分析,它适度的外观可能就足够了。然而,如果你计划通过报告或演示文稿来传达你的数据,这可能不足以吸引读者的注意力。自定义图表的美感可以提高其可读性,突出有趣的趋势,并帮助您的可视化看起来更专业。

这里有 5 个快速简单的方法来改善你的图表。

在本教程中,我们将使用与生成上图相同的数据。它包含了在一个假设的商店中销售的每一个计算机配件的利润。您可以使用以下代码生成数据集。

  1. 重新排序因素

作者图片

  • 通过按降序重新排列条形来引起对突出数据点的注意。

  • 对于其他数据集,按地理位置对数据进行分组或按字母顺序进行排序可能也很有用。通过阅读它的文档掌握 fct_reorder,你也可以这样做。

2。添加标签

作者图片

  • 编辑你的标题,x 轴和 y 轴标签,给你的读者上下文,并确保变量易于理解。

3。重新定位刻度标签

作者图片

  • 随着刻度标签数量和长度的增加,它们变得更难阅读。重叠和对齐问题会使它们难以理解。要解决这个问题,你可以稍微旋转它们。

作者图片

  • 或者翻转你的坐标轴。

4。将不太重要的类别重新归类为“其他”

作者图片

  • 通过重新组合最低的数据点来强调最高数据点的极端情况。您可以通过用mutate()创建一个新列来实现这一点。这里,我们使用ifelse将利润低于 3000 美元的所有项目重新分类到others

5。定制您的调色板

作者图片

  • r 有多种内置调色板可供选择。考虑色盲友好的调色板。包viridis 是一个很好的起点。

作者图片

  • 在为工作制作可视化效果时,您可能希望使用公司的调色板。由于profit是连续数据,所以我用了scale_fill_gradient。你可以用highlow来指定渐变的结束颜色。
  • r 还有定制的主题,可以用来即时改变图形的布局和背景颜色。我在这里使用了theme_minimal()来获得一个漂亮干净的外观。

接下来的步骤

不久前,我们推出了theme_minimal,这是 R 的众多theme预设之一,您可以应用它来立即美化您的图形。尝试其他默认主题在这里并考虑探索自定义主题来应用你自己的品牌。

改善你的视觉效果是一项值得你投入时间的任务。根据我的经验,分享像下面这样的高级动画可视化帮助我在科技 Twitter 上建立了一个追随者。深入学习我们之前学过的库和函数,让你的图表更上一层楼。

定制 Scikit-Learn 管道:编写自己的转换器

原文:https://towardsdatascience/customizing-scikit-learn-pipelines-write-your-own-transformer-fdaaefc5e5d7

如何使用管道并将定制的变压器添加到处理流程中

SEO yeon Lee 在 Unsplash 上拍摄的照片

您是否正在寻找一种方法来组织您的 ML 流程,同时保持处理流程的灵活性?想要使用管道,同时将独特的阶段合并到数据处理中吗?本文是一个简单的分步指南,介绍如何使用 Scikit-Learn 管道以及如何向管道添加定制的变压器。

为什么是管道?

如果你作为一名数据科学家工作了足够长的时间,你可能听说过 Skicit-Learn 管道。您可能在从事一个混乱的研究项目,并以一个充满处理步骤和各种转换的巨大笔记本结束时遇到过它们,但不确定在最后的成功尝试中应用了哪些步骤和参数,产生了良好的结果。否则,如果您曾经有机会在生产中部署模型,您一定会遇到它们。

简而言之,管道是为数据科学家制造的对象,他们希望他们的数据处理和建模流程组织良好,并易于应用于新数据。即使是最专业的数据科学家也是人,记忆力有限,组织能力也不完善。幸运的是,我们有管道来帮助我们维持秩序、可复制性和…我们的理智。

这篇文章的第一部分是关于什么是管道以及如何使用管道的简短介绍。如果您已经熟悉管道,请深入研究第二部分,在那里我将讨论管道定制。

管道的简短介绍

管道是顺序转换的列表,后跟 Scikit-Learn 估计器对象(即 ML 模型)。管道为我们提供了一个结构化的框架,用于将转换应用于数据并最终运行我们的模型。它清楚地概述了我们选择应用的处理步骤、它们的顺序以及我们应用的确切参数。它迫使我们对所有现有的数据样本进行完全相同的处理,提供了一个清晰的、可复制的工作流程。重要的是,它使我们以后能够对新样本运行完全相同的处理步骤。每当我们想要将我们的模型应用于新数据时,这最后一点是至关重要的——无论是在使用训练集训练模型之后在测试集上训练我们的模型,还是处理新的数据点并在生产中运行模型。

如何应用管道?

对于这篇文章,我们将遵循一个简单的分类管道的例子:我们希望根据个人和健康相关的信息,确定明年患某种疾病的高风险个人。

我们将使用一个玩具数据集,包括一些相关的功能(这是一个人工数据集,我创建的目的只是为了演示)。

让我们加载数据,看看第一批患者:

import pandas as pdtrain_df = pd.read_csv('toy_data.csv', index_col = 0)
test_df = pd.read_csv('toy_data_test.csv', index_col = 0)train_df.head()

我们的预处理将包括缺失值的插补和标准缩放。接下来,我们将运行一个 RandomForestClassifier 估计器。

下面的代码描述了管道的基本用法。首先,我们导入必要的包。接下来,我们定义管道的步骤:我们通过向管道对象提供一个元组列表来做到这一点,其中每个元组由步骤名称和要应用的转换器/估计器对象组成。

# import relevant packeges
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestClassifier# define our pipeline
pipe = Pipeline([('imputer', SimpleImputer()),('scaler', StandardScaler()), ('RF', RandomForestClassifier())])

然后,我们将管道拟合到训练数据,并预测测试数据的结果。在拟合阶段,保存每个步骤的必要参数,创建一个转换器列表,该列表准确地“记住”要应用的转换和要使用的值,然后是经过训练的模型。

最后,我们使用 predict()方法将整个管道应用于新数据。这将对数据进行转换,并使用估计器预测结果。

X_train = train_df.drop(columns = ['High_risk'])
y_train = train_df['High_risk']# fit and predict
pipe.fit (X_train, y_train)
pipe.predict (X_test)

如果我们希望拟合模型并在一个步骤中获得训练集的预测值,我们也可以使用组合方法:

pipe.fit_predict(X_train, y_train)

通过编写您自己的转换器来定制您的管道

正如我们已经看到的,流水线只是一系列转换器,后跟一个估计器,这意味着我们可以使用内置的 Scikit-Learn 转换器(如 SimpleImputer、StandardScaler 等)混合和匹配各种处理阶段。

但是,如果我们想要添加一个特定的处理步骤,而这个步骤并不是数据处理的常见步骤之一,该怎么办呢?

在这个例子中,我们试图根据个人和健康相关特征来识别在即将到来的一年中患某种疾病的高风险患者。在上一节中,我们创建了一个管道来估算缺失值,缩放数据,最后应用随机森林分类器。

然而,在查看完整数据集后,我们意识到其中一个特征(年龄)具有一些负值或可疑的高值:

经过一些调查,我们发现年龄字段是手动添加的,有时会包含错误。不幸的是,年龄是我们模型中的一个重要特征,所以我们不想忽略它。我们决定(仅在本例中…)用平均年龄值代替不太可能的值。幸运的是,我们可以通过编写一个转换器并将其设置在管道中适当的位置来做到这一点。

这里我们将编写并添加一个定制的 transformer:age imputr。我们的新流水线现在将在估算器和缩放器之前增加一个新步骤:

pipe = Pipeline([('age_imputer', AgeImputer()),('imputer', SimpleImputer()),('scaler', StandardScaler()), ('RF', RandomForestClassifier())])

怎么写变形金刚?

让我们从研究转换器的结构及其方法开始。

transformer 是一个 python 类。对于任何与 Scikit-Learn 兼容的转换器,它都应该包含某些方法:fit()、transform()、fit_transform()、get_params()和 set_params()。方法 fit() 拟合管道; transform() 应用变换;并且组合的 fit_transform() 方法拟合,然后将变换应用于相同的数据集。

Python 类可以方便地从其他类继承功能。更具体地说,我们的转换器可以从其他类继承其中的一些方法,这意味着我们不必自己编写它们。

get_params()和 set_params()方法继承自 BaseEstimator 类。fit_transform()方法继承自 TransformerMixin 类。这使我们的生活变得更容易,因为这意味着我们只需在代码中实现 fit()和 transform()方法,而其余的神奇功能将自行实现。

下面的代码演示了上述新估算转换器的 fit()和 transform()方法的实现。记住,我们希望我们的转换器“记住”年龄平均值,然后用这个值替换不可能的值。init()方法(也称为构造函数)将启动 transformer 的一个实例,使用最大允许年龄作为输入。fit()方法将计算并保存平均年龄值(四舍五入以匹配数据中年龄的整数格式),而 transform()方法将使用保存的平均年龄值对数据进行转换。

# import packages
from sklearn.base import BaseEstimator, TransformerMixin# define the transformer
class AgeImputer(BaseEstimator, TransformerMixin):

    def __init__(self, max_age):
        print('Initialising transformer...')
        self.max_age = max_age

    def fit(self, X, y = None):
        self.mean_age = round(X['Age'].mean())
        return self

    def transform(self, X):
        print ('replacing impossible age values')
        X.loc[(X[‘age’] > self.max_age) 
              |  (X[‘age’] < 0), “age”] = self.mean_age
        return X

如果我们希望看到转换的结果,我们可以应用管道中的这一特定步骤,并查看转换后的数据:

age_scaled = pipe[0].fit_transform(X_train)
age_imputed

不出所料,不可能的值被基于训练集的平均年龄所取代。

一旦我们编写了转换器并将其添加到管道中,我们就可以正常地将整个管道应用到我们的数据中。

pipe.fit(X_train, y_train)
pipe.predict(X_test)

用更复杂的变压器来增加趣味

上面的例子描述了现实的一个简化版本,其中我们只想对现有的管道做一个小的改变。在现实生活中,我们可能想要给我们的管道添加几个阶段,或者有时甚至用定制的预处理转换器替换管道的整个预处理流程。在这种情况下,除了 fit()和 transform()方法之外,我们的新 transformer 类可能还具有用于各种处理阶段的附加方法,这些方法将应用于我们的数据。这些方法将在 fit()和 transform()方法中用于各种计算和数据处理。

但是我们如何决定哪些功能属于 fit()方法,哪些属于 transform()方法呢?

一般来说,fit 方法计算并保存我们进一步计算可能需要的任何信息,而 transform 方法使用这些计算的结果来更改数据。我喜欢一个接一个地检查转换阶段,想象我正在将它们应用到一个新的样本中。我将每个处理阶段添加到转换方法中,然后问自己以下问题:

  1. 这个阶段需要原始数据中的任何信息吗?此类信息的示例包括平均值、标准偏差、列名等。如果答案是肯定的,那么必要的底层计算属于 fit()方法,而处理阶段本身属于 transform()方法。简单的 ImputeAge()转换器就是这种情况,我们在 fit()方法中计算平均值,并使用它来更改 transform()方法中的数据。
  2. 这个处理阶段本身是否是提取后续处理阶段需要的信息所必需的?例如,理论上我可能有一个额外的下游阶段,它需要每个变量的标准差。假设我想计算估算数据的标准偏差,我必须计算并保存转换后的数据帧的标准值。在这种情况下,我将在 transform()方法和 fit()方法中包含处理阶段,但是与 transform()方法不同,fit()方法不会返回转换后的数据。换句话说,如果出于内部目的需要,fit()方法可以对数据应用转换,只要它不返回改变的数据集。

最后,fit()方法将依次执行所有必要的计算并保存结果,transform()方法将依次对数据应用所有处理阶段并返回转换后的数据。

就是这样!

总结一下…

我们从使用现成的变压器应用管道开始。然后,我们讲述了 transformers 的结构,并学习了如何编写一个定制的 transformer 并将其添加到我们的管道中。最后,我们回顾了决定转换器的“fit”和“transform”方法背后的逻辑的基本规则。

如果您还没有开始使用管道,我希望我已经让您相信管道是您的朋友,它们有助于保持您的 ML 项目有组织,不容易出错,可复制,并且易于应用到新数据。

如果你觉得这篇文章有帮助,或者如果你有任何反馈,我很乐意在评论中阅读它!

网络罪犯 vs 机器人

原文:https://towardsdatascience/cyber-criminals-vs-robots-f60b8a86114a

构建网络入侵检测和防御的集成模型

除非另有说明,所有图片均为作者所有

链接 ⁷

介绍

网络罪犯面对机器人会怎样?当他们使用机器人时会发生什么?随着人工智能的不断发展,网络安全的攻防策略将如何演变?人工智能和网络安全都年复一年地登上增长最快行业的排行榜。这两个领域在许多领域有重叠,而且毫无疑问在未来几年还会继续重叠。对于本文,我将范围缩小到一个特定的用例,入侵检测。入侵检测系统(IDS)是一种监控公司网络恶意活动的软件。我深入研究了人工智能在入侵检测系统中的作用,使用机器学习编写了我自己的 IDS 代码,并进一步演示了如何使用它来帮助威胁猎人。

问题定义

最近,不到一半的公司在其入侵检测系统中利用机器学习。最常见的 IDS 仅仅依赖于一种叫做“签名匹配”的技术。基于签名的入侵检测发现“可能匹配特定已知攻击者 IP 地址、文件哈希或恶意域的序列和模式”;然而,它在检测未知攻击方面有很大的局限性。许多网络罪犯了解签名匹配是如何工作的,并将改变他们的行为以避免被发现。虽然签名匹配已被证明是有用的,但在不断变化的网络威胁环境中,它本身并不是一个解决方案。相反,签名匹配必须辅之以适应性更强的解决方案:机器学习。使用来自网络流量的特征,机器学习不仅检测以前发生过的攻击,而且它足够动态以检测全新的攻击。

对于我的入侵检测算法,我想关注的具体问题是优化精度和召回率。在入侵检测环境中,错误会给组织带来巨大的成本。误报可能会导致未被发现的系统漏洞,从而带来潜在的灾难性后果。过多的恶意样本误报警报会降低对系统的信心,并将关键安全人员引向死胡同,导致他们降低优先级,无法缓解实际攻击。量化和优化这种权衡是另一个独立的研究项目,可能因组织而异。在本文中,我假设假阴性比假阳性更糟糕,但尽量减少两者。在评估结果时,我试图根据组织的加权成本来量化这种关系,假设假阴性的成本是假阳性的两倍。

数据

对于这个项目,我使用了⁴的 NSL-KDD 数据集,这是 1999 年 KDD Cup 数据集的改进版本。该数据由模拟美国空军局域网环境的局域网(LAN)中 9 周的原始 tcpdump 流量组成。该数据集中的特征是根据原始 tcpdump 设计的。大多数特性描述可以在这里和这里找到。每行代表给定时间点的网络流量样本,每个网络样本可以标记为“恶意”或“良性”,并分为攻击类别 DoS(拒绝服务)、R2L(远程到本地)、U2R(用户到根)和探测。

NSL-KDD 数据预览

相关著作

这个项目的灵感来自大卫·freeman⁴.的《机器学习安全》一书在网络流量分析一章中,Chio 和 Freeman 探索了一种用于入侵检测的集成方法。最终的结果是一个在召回方面表现很好的系统,但是在 precision⁵.方面却没有达到标准我的系统考虑并实现了他们的许多策略,对它们进行优化以提高精确度和召回率。他们的集合模型的结果,如下图所示,将作为基线。

准确度 : 85%

分类报告:Chio/Freeman 模型

分类报告:Chio/Freeman 模型

方法学

特征选择

  1. 对连续、二元和标称列进行分类
  2. 删除只有 1 个值的所有要素。num_outbound_cmds 只有一个唯一值,所以我将其从数据集中删除。
  3. 根据属性类型验证数据(su_attempted 应该是一个二进制属性,但有 3 个值)
  4. 一次性编码分类变量

重采样

培训:攻击类别分布

为了最大限度地提高召回率,并创建一个适用于不常见和看不见的攻击的模型,我需要确保这些不常见的攻击在训练数据中得到更好的体现。如上所述,尽管恶意和良性标签分布相当均匀,但在我们的训练数据中,攻击类别的分布非常不均匀。为了增加一些少数类的表示并减少一些多数类的表示,我采用了一种结合过采样和 undersampling⁵.的重采样方法

训练:重新采样的攻击类别分布

使用不平衡学习中的 SMOTE ⁰和 RandomUnderSampler 类,我现在有了一个平衡的训练集。

预测攻击类别—多类建模

我专注于入侵检测;但是,识别正确的攻击类别将有助于威胁猎人进行入侵防御。我在训练数据上交叉验证了 4 个分类模型,比较了准确性。

多类别三重交叉验证

树模型的表现比线性模型(逻辑回归)好得多,其中 XGBoost 的结果最好。

在整个训练集上拟合 XGBoost 模型并预测测试结果,我得到以下结果:

准确率 : 79%

XGBoost 多分类器:多类结果

XGBoost 在识别探测和拒绝服务攻击方面做得很好,但在 R2L 和 U2R 方面缺乏召回,这在初始训练集中较少出现。重采样有助于改善这种情况;然而,这些类的训练属性不足以代表测试数据。

将攻击类别分为恶意攻击和良性攻击,以下是二进制结果:

T5 精度 : 81%

分类报告:XGBoost 多分类器

混淆矩阵:XGBoost 多分类器

攻击类别的多类分类在识别攻击类别方面做得不错;然而,它识别恶意样本的召回率太低。我决定将重点更多地放在入侵检测而不是攻击分类上,但在选择算法时仍然重视上面的结果。我将把它作为前进的基线,并把它合并到仪表板中。

入侵检测—二元分类

特征减少

我决定通过 SelectPercentile⁶减少特征的数量,执行 ANOVA 测试并返回特征的 f 值,以确定它们与目标向量的独立相关性。经过一些试验,我决定根据 F 值保留前 33%的特性。

模型选择的指标

因为我计划在入侵检测的上下文中优化精确度和召回率,所以在所有阈值下最大化模型的性能是很重要的。因此,受试者工作特征(ROC)曲线下面积(AUC)是在选择模型时最大化的合适指标。ROC 曲线描绘了真阳性率(TRR)对假阳性率(FPR)。这条曲线下的区域将告诉我们随机选择的恶意示例比随机选择的良性示例得分更高的概率。

在使用 5 重交叉验证比较不同模型的 AUC 后,森林模型优于其他模型,尤其是 XGBoost。

下面我建立了一个管道来标准化这些特性,用 SelectPercentile 减少它们,并使数据适合 XGBoost 分类器。

阈值选择

我将数据分为训练和验证,将模型拟合到训练数据,并绘制验证结果的 ROC 曲线。

受试者工作特征曲线

ROC 曲线(放大)

请记住,我们的目标是最大限度地提高精确度和召回率,重点是召回率。这将最大限度地减少通过检测系统的攻击数量,而不会因为标记太多的误报而牺牲算法的完整性。如上所述,我可以调整阈值来提高真阳性率,而不会显著增加假阳性率。设置真阳性率为 1 的阈值意味着没有假阴性;因此,该模型会标记每一个恶意样本。为此,我选择了最佳阈值 0.0050058886,创建了 100%的验证召回率和 98%的精确度。当预测恶意样本时,这意味着根据模型的预测概率,任何具有至少 0.5%的恶意概率的样本都会被标记为恶意样本。

让我们来看看这个模型的测试结果。

准确率 : 90%

分类报告:带阈值的 XGBoost

混淆矩阵:带阈值的 XGBoost

到目前为止,该模型的准确率比 Chio/Freeman 模型提高了 5%,准确率提高了 16%,召回率降低了 6%。

我想进一步探索在保持高精度的同时提高召回率的方法。想想网络攻击模式,许多攻击者会创建新的恶意软件,这些恶意软件要么与以前的版本略有不同,非常不同,要么是全新的零日漏洞利用。那么,机器学习算法如何标记这些没有在训练数据中表示的实例呢?我转向异常检测。在试验了许多不同的算法之后,我认为集群是最好的方法。

使聚集

我的目标是用聚类模型来补充分类模型。理想情况下,聚类模型应该能够挑选出一些被分类模型错误标记的恶意样本。在这个模型中,更重要的是平衡精确度和召回率,因为只有当聚类的预测足够精确以覆盖分类器的预测时,聚类才能很好地补充分类。为了在这种情况下最大限度地提高精确度和召回率,我求助于 F1 分数。

首先,我在 2D 向量空间中画出了训练集的类。

实际的

乍一看,这些聚类看起来没有很好地定义,但是我可以使用聚类来检测一些明显的异常值。

接下来,我拟合了一个简单的 2-聚类 K-均值模型,使用主成分分析(PCA)来降低维度。

预测:2 类 K 均值模型

双聚类模型在表示实际类方面做得很差。我的下一个方法是试验更多的集群,并优化一个策略,将它们映射回恶意或良性。

在对集群数量和策略参数进行多次迭代后,我拟合了一个 27 集群模型。

预测:27 簇模型

这里的集群看起来比双集群模型更加集中和清晰。那么,我的策略是什么,我如何将这些集群映射到良性和恶意的类别标签?这两个问题只有一个答案:

受 Chio 和 Freeman⁴的启发,这种聚类映射技术包括异常检测和恶意样本的多数类标记。

策略:

  • 如果群集中恶意流量的百分比大于 95%,则群集中的所有实例都会被标记为恶意。
  • 如果相对于总人口的群集大小小于 0.1%,则群集中的所有实例都被标记为恶意实例。

这与 Chio 和 Freeman 的模型不同,因为它细化了群集数量、恶意流量百分比和相对群集大小的参数,以最大化 F1 分数。此外,我的方法只关注于标记恶意实例,而没有在逐簇 basis⁴.上使用机器学习模型

前 6 个集群的集群映射表

来自该策略的每个恶意标签可以追溯到多数恶意聚类或离群点,这将在稍后的模型可解释性中有用。根据该策略映射聚类后,这里是 2D 向量空间中预测值与实际值的并排比较。

k-均值映射预测与实际标签

映射后,预测和标签看起来几乎相同。

创建集成模型:结合分类和聚类

我将 XGBoost 模型与 K-Means 模型相结合的方法是覆盖任何 XGBoost 将样本标记为良性,而 K-Means 方法将样本标记为恶意的情况。

估价

最终模型的结果如下:

准确率 : 90%

分类报告:集合模型

混淆矩阵:集合模型

在 XGBoost 模型中增加聚类功能可以在保持精确度的同时提高恶意流量的召回率。算法以仅误标 5 次的小代价发现了 109 次新的恶意攻击;从而提高分类器性能,而不降低其完整性

在我将这个模型与我讨论过的其他基线模型进行比较之前,定义一个成本函数是很重要的。网络攻击的成本或影响本身是一个完整的研究领域,有许多变量。为了最终在未来扩展这项研究,我在本文中定义的成本函数是一个临时的启发。

基于未被发现的网络攻击比假警报更糟糕的逻辑,我假设假阴性的成本是假阳性的两倍。我假设一个组织的平均假警报成本是 1000 美元;因此,未被发现的网络攻击的平均成本是 2000 美元的两倍。

价值函数

结果

从左到右,很明显,映射到二进制标签的 XGBoost 多类预测器具有 97%的最高精度。不幸的是,这种模式在所有其他领域都表现不佳。将集合模型与 Chio Freeman 模型的主基线进行比较,精度提高了 16%,表明入侵检测系统标记样本的置信度提高了。Chio Freeman 模型仍然以 97%的召回率优于其他模型,我的 ensemble 模型以 92%的召回率紧随其后。我认为这方面仍有改进的余地。整体模型的 F1 分数优于其他模型,阈值化的 XGBoost 模型以 0.91 紧随其后。集合模型比 Chio Freeman 基线高出 0.05。F1 的高分实现了我优化精确度和召回率的目标。整体模型和阈值 XGBoost 模型在准确性上非常相似,二者的舍入准确性都为 90%。最后,ensemble 模型在加权成本方面优于其他模型,比第二好的模型便宜 220,000 美元,比 Chio Freeman 模型便宜 540,000 美元。

讨论

虽然我的模型通过实现最高的 F1 分数优化了精确度和召回率,但是我没有在入侵检测的上下文中优化这些指标的具体测量。请记住,我的成本函数是一个临时的启发。不同的攻击类别、网络架构、系统和组织有不同的成本。这些都应该是建模新成本函数的考虑因素。例如,探测攻击通常不会给组织造成很大损失,因为它们通常用于监视网络而不是破坏网络。此外,一次成功的拒绝服务攻击可能会让脸书损失 300 万美元,而当地一家咖啡连锁店只需 2000 美元。由于并非所有这些数据都是现成的,我的下一步将是研究每种攻击类别的平均成本,并将其包括在计算中。之后,我会调整误报的成本,考虑平均人工成本、错过实际攻击的机会成本,甚至可能是贬值的模型信心的成本。

可解释性

我的系统现在可以很好地识别攻击。下一步是以自动化的方式解释这些预测,帮助网络防御保护他们的基础设施。可解释的入侵检测系统可以为威胁猎人指出正确的方向。

使用 streamlit python 库,我创建了一个概念验证仪表板,展示了入侵检测系统如何通过标记攻击、按风险对攻击进行优先级排序以及向威胁猎人推荐具体的补救路径来充当入侵防御系统。

IDS 仪表板

口译模特

为了解释集成模型的恶意预测,我必须自动解释 XGBoost 分类器和 K-Means 聚类算法。

XGBoost :对于 XGBoost,一种选择是提取特征重要性,并潜在地用线性模型拟合数据,以帮助确定方向性。在像 XGBoost 这样复杂的森林模型中,这不是底层模型的最佳表示。XGBoost 模型的完美解释是绘制决策树森林;然而,绘制一个完整的复杂的森林图是很难的,并且对于需要快速工作的安全团队来说也是不切实际的。我求助于软件包 LIME(本地可解释的模型不可知解释),它近似了特定 instance⁸.附近的模型行为我选择 LIME 是因为它将复杂的模型分解成易于理解的局部近似和估计。

对于我的 IDS,LIME 可以对标记为恶意的样本 XGBoost 给出本地解释。下表显示了标记特定样品时最重要的 10 个特征、特征权重和方向性。

为了预测类别,我使用前面讨论的多类 XGBoost 模型。

K-Means :为了解释 K-Means 模型,我首先识别预测的聚类。接下来,我绘制了每个聚类中心的热图,显示了所有特征的相对值,并突出显示了该样本的聚类。就绝对值而言,聚类中心向量中某个特征的高值被视为重要特征,并包含在特征值表中。

为了预测类别,我采用每个集群中最常见的攻击类别,除非它是一个离群的集群。

风险

我将风险计算为 XGboost 模型预测样本是恶意的概率,标准化为 1 到 10。我根据国家漏洞数据库的 cvss v3.0 版影响严重性 mappings⁹.将这些风险分值映射到严重性

将风险分值映射到测试人群的严重性会产生以下分布。

测试集的严重性分布

这里有许多严重程度标志,低是第二高的。仪表板为威胁猎人提供了按严重性过滤的选项,允许他们优先考虑更高严重性的标志。

补救

将入侵检测系统转变为入侵防御系统的最后一步是为威胁猎人指明正确的方向,并提供补救途径。通过查看条形图或热图中突出显示的重要特征,威胁猎人可能会对攻击是如何被检测到的以及问题的根源有一个大致的了解。除了这些图表之外,仪表板还提供了前 3 个最重要特征的值以及样本可能属于的攻击类别。对于每个攻击类别,我都提供了一个补救途径,这是威胁猎人或安全分析师在验证和补救每个攻击时应该采取的措施的建议。

从开始到结束,仪表板允许任何威胁猎人快速检测攻击,确定它们的优先级,识别要调查的关键特征,预测所述攻击的类别,并为特定攻击提供补救策略。

在这里,我将通过几个例子来演示如何使用仪表板。

例#1

在本例中,威胁猎人希望专注于关键攻击。他将严重性过滤为严重,并选择网络流量的标记样本。该样本的风险分值最高,为 10 分。这很可能是拒绝服务攻击,这对于威胁猎人来说是有意义的,因为他可以看到有 255 个连接到同一个目的 IP 地址(“dst_host_count”)。根据仪表板的建议,威胁猎人调查网络流量日志中的这些连接,确认它们来自已知的僵尸网络,并验证这是一种拒绝服务攻击。他立即通知事件响应和网络安全部门阻止这些连接并转移流量。

例二

在处理完当天的高优先级问题后,安全分析师的任务是调查一些已经在队列中等待了一段时间的低优先级项目。他注意到这个样本是一个异常值,并希望进一步调查。根据仪表板的建议,他调查了哪些功能可能会导致该流量被标记。他认为失败的登录尝试增加了系统的怀疑。他监视该用户的活动,并注意到更多失败的登录尝试,这些尝试通常是在工作时间之外通过远程连接进行的。分析师与系统管理员合作,通过要求通过跳转服务器进行远程连接并添加双因素身份认证来加强服务器的安全性。失败的登录尝试次数在接下来的一周内逐渐减少。

讨论

在指出仪表板和可解释性模型中需要改进的地方时,我想参考风险分值计算、多类别模型、补救路径协调以及构建生产就绪仪表板。

我使用了一种临时的启发式方法来衡量风险。这应根据行业标准进行调整,并根据攻击类别和主机系统进行不同的加权。此外,应该有更好的方法来量化 K 均值预测的风险。

另一个下一步是改进预测攻击类别的多类 XGBoost 模型。我决定更多地关注入侵检测而不是攻击分类,但我最终还是在仪表板中加入了多类模型来帮助威胁猎人。改进模型的一个方法是从训练集中去掉良性样本,只标记恶意样本,因为我已经有了一个 IDS。改进此模型可以以最少的工作获得最大的收益,并增加对仪表板预测类别和补救途径的信心。

说到这里,补救路径应该由主题专家来定义。虽然我尽我所知编写了补救措施,但我希望听取有经验的威胁分析师的意见,以完善建议并提供新的建议。

如果是为组织构建,最后一步是在生产环境中设置仪表板。这将意味着建立一个 ETL 来从系统的网络流量中提取相关的特性,将其流式传输到仪表板,实时更新仪表板,并结合一个反馈回路来重新调整模型。

结论

通过集成模型,我实现了优化精度和召回率的目标。使用结合了 XGBoost 和 K-Means 的高级集成,我能够在许多领域超越他人,包括我定义的加权成本指标。由于一些模型仍然比我的模型有优势,而且加权成本指标是一种主观的启发,我不能客观地声称我的模型整体上优于其他模型。尽管如此,这个模型确实实现了我的既定目标。

我相信这个项目的主要收获是,人工智能是一种有价值的工具,可以在入侵检测方面帮助网络安全团队。机器学习是针对 IDS 规避技术和这一领域中不断发展的威胁因素的强大解决方案。此外,这些模型可以与安全团队相互帮助。它们有能力检测大量人类无法自己模式化的威胁,为威胁猎人指明正确的方向,并融入用户反馈以适应新的场景。

那么当网络罪犯面对机器人时会发生什么?这个问题应该重新定义。人工智能在检测大量威胁的能力方面非常出色,但它也有许多弱点,如模型退化、容易中毒和被黑客攻击,以及无法自动修复复杂或看不见的攻击。人类缺乏实时处理如此大量数据的能力,但拥有追踪和阻止一些最复杂的网络犯罪所需的创造力和商业头脑。机器学习模型可以填补网络响应团队的许多空白,反之亦然。入侵检测系统和威胁猎人相互补充,以创建一个更强大的系统。因此,问题应该是,“当网络罪犯面对电子人时会发生什么?”当人类和人工智能一起抵御网络犯罪时,威胁行为者可能不会喜欢这个答案。

链接到代码

链接到仪表板

我的网站

参考文献

  1. 费尔德曼,莎拉和菲利克斯·里克特。“检测安全入侵是 2018 年最热门的人工智能应用。” Statista 信息图,Statista,2019 年 4 月 5 日,https://www . Statista . com/chart/17630/artificial-intelligence-use-in-business/。
  2. 雷塞克迈克尔。“基于特征和基于行为的入侵检测系统有什么区别?” Accedian ,Accedian,2022 年 6 月 29 日,https://Accedian . com/blog/what-is-the-difference-based-and-behavior-based-ids/。
  3. Mahbod Tavallaee 等人,“KDD 杯 99 数据集的详细分析”,第二届 IEEE 安全和国防应用中的计算智能研讨会会议录(2009):53–58。
  4. 齐奥、克拉伦斯和大卫·弗里曼。机器学习和安全:用数据和算法保护系统。奥莱利媒体公司,2018 年。
  5. 你好,克拉伦斯。“图书资源/NSL-KDD-分类. ipynb at Master Oreilly-ml sec/图书资源.” GitHub ,Oreilly,https://GitHub . com/Oreilly-ml sec/book-resources/blob/master/chapter 5/nsl-KDD-classification . ipynb .
  6. " sk Learn . feature _ selection . select percentile . "sci kit,Scikit-Learn,https://sci kit-Learn . org/stable/modules/generated/sk Learn . feature _ selection . select percentile . html .
  7. https://pix abay . com/插图/科技-科幻-未来派-7111801/
  8. "局部可解释的模型不可知解释(LIME). "本地可解释的与模型无关的解释(Lime) — Lime 0.1 文档,GitHub,https://lime-ml.readthedocs.io/en/latest/.
  9. “漏洞指标。”*https://nvd.nist.gov/vuln-metrics/cvss.*NVDNVD
  10. “击杀。” SMOTE —版本 0.9.1 ,不平衡学习,https://不平衡学习. org/stable/references/generated/imb Learn . over _ sampling . SMOTE . html
  11. “随机抽样器” RandomUnderSampler —版本 0.9.1 ,不平衡学习,https://unbalanced-Learn . org/stable/references/generated/imb Learn . under _ sampling . RandomUnderSampler . html .
  12. 增长最快的工作部门:人工智能、数据科学和网络安全。招聘能力,招聘能力,2020 年 3 月 23 日,https://www . therecruitability . com/ai-data-science-and-cyber security-Americas-fast-growth-jobs-sections/。
  13. “简化文档”细流文档,细流,https://docs.streamlit.io/.
  14. " NSL-KDD 数据集."新不伦瑞克大学 Est.1785 ,https://www.unb.ca/cic/datasets/nsl.html. UNB

犬儒主义:数据科学家的必备

原文:https://towardsdatascience/cynicism-a-must-have-for-data-scientists-729638b2f517

之所以问“为什么?”不会总是产生影响

我在工作中经历过的最令人泄气的事情之一是西西弗螺旋:做复杂、累人的工作,却发现你的待办事项清单不断增加。虽然这种情况可能是所有成年人生活品尝菜单的一部分,但数据科学家似乎吃得太多了。

在希腊神话中,宙斯惩罚西西弗斯两次欺骗死神,强迫他把一块巨大的圆石滚上山,但每次快到山顶时,圆石都会滚下来,如此反复,直到永远。提香在普拉多博物馆的画作,来源:维基百科。

我想邀请你绕一点弯子,在 Twitter 上回答一个投票。结果让你吃惊吗?

推特投票链接。就问题的目的而言,您可以假设:副总裁不是数据科学背景,而经理有技术背景,但不做数据工作。副总裁和经理都擅长他们的工作。

掌控你的命运

在之前的文章中,我们根据数据科学家关心的主要问题讨论了他们职业发展的四个成熟阶段:

阶段 1 — “怎么做?” —关注执行细节
阶段 2— “为什么?” —提问提高自己工作的影响力
阶段 3— “谁?” —成为政治;影响归结到人
阶段 4 — “什么?”

在每一个阶段,你都能更好地控制自己的能力,去做有影响力的项目,跳过那些让你一事无成的令人心碎的东西。每一个阶段都是为了达到逃离西西弗螺旋的速度。许多数据科学家认为,当他们学会问 为什么 时,他们就已经成功了,所以他们永远也过不了第二阶段。

当你从 “为什么?”开始跳跃时,一个最大的增长爆发就发生了 阶段到了 “谁?” 阶段;这也是为热爱真理和数据的人努力塑造更痛苦的性格之一,因为它带来了对 为什么 的答案往往取决于 你问谁

这让我想到了犬儒主义的话题…

为什么数据科学家需要更多的冷嘲热讽?

好吧,也许文章标题有点夸张。(是点击量最高的那些人,还是我自己表现出的愤世嫉俗?)我鼓励数据科学家至少要有更多的 怀疑态度 再加上更敏锐的阅读动机。领导级别越高,他们的责任范围就越广,除了个人利益,他们可能有更多的理由!—告诉您需要听到的任何信息,以便采取有利于整个组织的行动。

换句话说,获得关于 为什么 的明确信号并不像看起来那么简单。如果你不仔细分析 ,你就会误读为什么,然后又滑回推着无用的巨石上坡。

***【why ***上获得明确的信号并不像看起来那么简单。

甚至你的顶头上司也可能有充足的理由让你去做徒劳无功的事情。比如我给大家分享一个很常见的菜谱。

就拿一个在技术工作上才华横溢、但缺乏成熟的人来说吧,他在社交礼仪方面缺乏理性。增加几个可靠的、有能力的、重视工作和生活平衡的团队成员。撒上一点竞争力。彻底搅拌,让它慢慢沸腾。结果呢?非常有可能的是,超额完成者会挫伤团队的积极性,并创造一个整体生产力下降 ,尽管个人带来了超过一个人的价值的胜利。这是导致灾难的原因。**

如果你认为成功所需要的只是才华,请三思!

为了团队的利益,也许是为了防止新的竞争对手获得一个高效的独狼员工,许多经理会倾向于将超额完成任务者转向追求较低的影响。如果你想让他们留在队里,那就是。我的一位导师认为,扼杀生产力的优秀人才不值得努力。他更喜欢移除它们,而不是重新定向/修复它们。哎哟。他并不是唯一一个对高成就者过敏的人——如果你是那种从未学会如何与他人合作的人,至少你可以认为自己受到了警告。(我曾经是一个狂躁的书呆子,直到我长大成人,部分原因是因为这位导师(幸运的是,他不是我的经理)。我记得听到我的倾向被描述为不稳定时的感觉。它刺痛了。)

如果你的老板选择宣布优秀者并把他们留在身边,你可以放心,任何关于 为什么 不会得到真善美所要求的答案的问题。

一个领导人手头的锅越多,隐瞒透明度的动机就越多。

另一个典型情况出现在组织数据科学成熟的早期阶段。许多组织在为数据科学家做好准备之前就雇佣了他们,这意味着他们的工作不太可能立即产生影响,但他们仍然需要在收集数据集、雇佣数据工程师、解决 IT 问题以及最终完成法律审批的过程中保持愉快的忙碌。有时候,声称自己拥有尖端的填入你最喜欢的流行语的能力比那些专家为组织实际生产的任何东西都更有价值,但是祝你好运,让领导直截了当地告诉你,你的职能主要是装饰性的。

既然我们已经看到有充分的理由向你的报告链发出的信号中注入一些噪音,那么是时候进行下一次认识了: 差异来源 。一个领导者越资深(就他们必须激励多少人和多少项目而言,而不是就任期而言),就越有可能信以为真。一个领导者的火气越大,隐瞒透明度的动机就越强烈,尤其是当他们所负责的人之间存在冲突和/或竞争时。

照片由 KS KYUNG 在 Unsplash 上拍摄

让我们再次提起那个调查,稍微改变一下问题的措辞。与其说你应该 相信谁 ,不如让我们来问问哪个信号更干净:经理的反馈还是副总裁的反馈。

增加一个额外的方差源会使信号质量变差。

在其他条件相同的情况下,经理是更干净的反馈来源(假设两人都擅长自己的工作,而且都不是讨厌的鼠辈或病态的骗子)。原因如下。

你的直接经理关心你、他们自己和你的团队。您的副总裁关心以上所有内容…以及他们的整个组织。如果你是一个数据爱好者,你会意识到增加一个额外的方差源会使信号质量更差,而不是更好。(更多关于这个话题的在这里。)

你越早停止相信他们的话,越好。

所以,当高级利益相关者告诉你一些事情的时候,检查它,检查他们,仔细检查情况。你越早停止相信他们的话,越好。在你问 为什么 ,之前,问 …然后从你新的角度再试试为什么。

** https://kozyrkov.medium/is-your-boss-telling-you-the-truth-f03ae554ce4d

例外

例外?也有一些例外。我们在讨论中假设没有关于所涉及的个性的额外信息。但是如果你有一些额外的上下文呢?在本附录的中,我整理了一些修饰语,它们会让你倾向于接受副总裁的反馈,而不是经理的反馈。

感谢阅读!人工智能课程怎么样?

如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

在这里欣赏被分成 120 个单独的一口大小的课程视频的课程播放列表:【bit.ly/machinefriend】T2

https://kozyrkov.medium/membership

又及:你有没有试过在 Medium 上不止一次点击拍手按钮,看看会发生什么? ❤️

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

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

面向绝对初学者的 Cython:通过简单的两步将代码速度提高 30 倍

原文:https://towardsdatascience/cython-for-absolute-beginners-30x-faster-code-in-two-simple-steps-bbb6c10d06ad

为速度惊人的应用程序轻松编译 Python 代码

让我们加速我们的代码(图片由 Abed Ismail 在 Unsplash 上提供)

Python 非常容易使用;清晰的语法、解释器和鸭式输入让你可以快速开发。但也有一些缺点:如果你不必遵守严格的语法,那么 Python 必须做一些额外的工作来让你的代码运行,导致一些函数执行非常慢,因为它必须一次又一次地做所有这些检查。

将 Python 开发的便捷性和速度与 C 语言的速度结合起来:两全其美

在本文中,我们将从一个普通的 Python 项目中提取一个“慢”函数,并使其速度提高 30 倍。我们通过使用一个名为 Cython 的包来做到这一点,该包会将我们的 Python 代码转换为一段经过编译的超高速 C 代码,我们可以再次直接将其导入到我们的项目中。

一个名为 CythonBuilder 的包会在仅仅两步中为我们自动生成 Python 代码。使用 CythonBuilder,我们将 Cythonize 下面定义的示例项目中的一个函数。我们来编码吧!

但是首先…

对于那些不熟悉 Cython 和 CythonBuilder 的人,我们将回答一些探索性的问题。然后我们将定义我们的示例项目。我们将使用命令行,如果您不熟悉,请仔细阅读:

什么是 Cython /为什么使用 Cython?

Cython 将 Python 代码转换成包含 CPU 指令的文件。Python 解释器不再需要对这个文件进行任何检查;它可以运行它。这导致了性能的显著提高。查看下面的文章,了解关于 Python 如何工作以及它与 C 语言相比如何的更多详细信息:

当你把一段代码变成 Cythonize 时,你就给你的代码添加了额外的信息;定义类型,例如,然后编译代码,这样 Python 就不必执行额外的检查。同样,查看上面的文章可以获得更深入的分析。

Cython 是如何工作的

就像你在一个.py文件中写 Python 代码一样,你在一个.pyx 文件中写 Cython 代码。然后,Cython 会将这些文件转换为. so 文件或. pyd 文件(取决于您的操作系统)。这些文件可以再次直接导入到 python 项目中:

Cythonizing 一个 pyx 文件(作者图片)

所有代码都可以通过编译来优化吗?

并不是所有的代码都是编译好的。例如,在 C 包中等待 API 的响应并不会更快。简而言之:我们专注于需要大量计算的 CPU 密集型任务。在下面的文章中阅读更多,以获得更清晰的区别。

CythonBuilder —自动化 Cythonizing

你是如何将你的.pyx文件有效化的?这个过程相当复杂;您必须创建一个setup.py,定义所有的包,然后运行一些命令(参见下面的文章)。相反,我们将使用CythonBuilder:一个为我们自动化一切的包:在一个命令中构建你的.pyx文件!

你的代码经过了两步(图片由 Sammy Wong 上的 Unsplash

示例项目

我们的项目包含一个函数,出于某种原因,计算一些素数。这个函数需要大量的计算,我们可以优化。
首先安装带有pip install cythonbuilder的 cythonbuilder,然后定义常规的质数计算函数

准备-普通 Python 质数计算函数

这个函数非常简单:我们将传递一个数给这个函数,它返回 0 和目标数之间的质数:

这个函数是纯 Python 的。它可以再优化一点,但目标是有一个执行大量计算的函数。让我们来看看这个函数需要多长时间来找到 0 到 100.000 之间的素数:

PurePython: 29.4883812 seconds

第一步。—糖化

在这一部分,我们将介绍 Cython。我们将复制我们函数的代码,并将其保存到一个名为cy_count_primes.pyx的文件中(注意.pyx)。

接下来我们cd projectfolder并调用cythonbuilder build。这将在 projectfolder 中找到所有的 pyx 文件并编译它们。结果是 Windows 上的一个.pyd文件或 Linux 上的一个.so文件。这个文件是我们的 Python 函数的编译版本,我们可以将它直接导入到我们的项目中:

from someplace.cy_count_primes import count_primes
print(count_primes(100_000))

让我们看看它的表现如何:

PurePython: 29.4883812 seconds
CyPython  : 14.0540504 seconds (2.0982 faster than PurePython

已经快了两倍多!请注意,我们实际上没有对 Python 代码做任何更改。让我们优化代码。

接口:
您会注意到,即使是您的 IDE 也可以检查导入的文件。即使文件被编译,它也知道哪些函数存在,哪些参数是必需的。这是可能的,因为 CythonBuilder 也构建。pyi 文件;这些接口文件为 ide 提供了关于 pyd 文件的信息。

步骤 2 —添加类型

在这一部分中,我们将类型添加到cy_count_primes.pyx文件中,然后再次构建它:

正如你所看到的,我们用cpdef(c 和 p(ython)都可以访问)定义了我们的函数,告诉它返回一个int(在count_primes之前),并且它期望一个limit参数是一个int

接下来,在第 2、3 和 4 行,我们为循环中使用的一些变量定义了类型;没什么特别的。

现在我们可以再次cythonbuilder build并再次计时我们的函数:

PurePython: 29.4883812 seconds
CyPython  : 14.0540504 seconds (2.0982 faster than PurePython
Cy+Types  :  1.1600970 seconds (25.419 faster than PurePython

这是一个非常令人印象深刻的加速!
速度如此之快的原因不在本文的讨论范围之内,但这与 Python 在内存中存储变量的方式有关。与 C 相比,它的效率相当低,所以我们的 C 编译代码可以运行得更快。查看本文 深入探究 Python 和 C 之间的不同之处(以及为什么 C 要快得多)。

附加—编译选项

我们已经将代码执行速度提高了 25 倍,但我认为我们还可以再提高一点。我们将用编译器指令来做这件事。这些需要一点解释:

因为 Python 是一种解释语言,所以它必须在运行时执行大量检查,例如,如果你的程序被零除。在编译语言 C 中,这些检查发生在编译时;编译时会发现这些错误。好处是你的程序可以更有效地运行,因为它不需要在运行时执行这些检查。

使用编译器指令,我们可以禁用所有这些检查,但前提是我们知道我们不需要它们。在下面的例子中,我们用 4 个装饰器升级了我们之前的代码:

  • 阻止对 ZeroDivisionError 的检查
  • 阻止对 IndexErrors 的检查(当列表只包含 3 个项目时调用 myList[5])
  • 阻止对 isNone 的检查
  • 防止绕回;防止调用相对于末尾的列表(如 mylist[-5])所需的额外检查

让我们再次重新构建我们的代码(cythonbuilder build),看看跳过所有这些检查能节省多少时间

PurePython: 29.4883812 seconds
CyPython  : 14.0540504 seconds (2.0982 faster than PurePython
Cy+Types  :  1.1600970 seconds (25.419 faster than PurePython
Cy+Options:  0.9562186 seconds (30.838 faster than PurePython

我们又缩短了 0.2 秒!

最终结果(越低越好)(图片由作者提供)

甚至更快?

通过利用我们的多核处理器,我们有可能进一步加速我们的代码。查看下面的文章,了解如何在 Python 程序中应用多处理和线程。另请查看这篇文章向您展示了如何对 Cython 代码进行多进程处理,并解释了 Cython 的注释文件:图形化概述了您的代码的哪些部分可以进一步优化。非常方便!

结论

CythonBuilder 使得使用 Cython 加速我们的 Python 代码变得很容易。
正如我们所看到的,复制我们的 Python 代码并构建会使执行速度翻倍!最大的速度提升是通过增加类型;相对于普通 Python,速度提高了 25 倍。

我希望一切都像我希望的那样清楚,但如果不是这样,请让我知道我能做些什么来进一步澄清。同时,请查看我的关于各种编程相关主题的其他文章:

  • Python 为什么这么慢,如何加速
  • Git 绝对初学者:借助视频游戏理解 Git
  • Docker:图像和容器的区别
  • Docker 对于绝对初学者——什么是 Docker 以及如何使用它(+示例)
  • 绝对初学者的虚拟环境——什么是虚拟环境,如何创建虚拟环境(+示例)
  • 创建并发布自己的 Python 包
  • 创建你定制的私有 Python 包,你可以从你的 Git 库 PIP 安装这个包
  • 用 FastAPI 用 5 行代码创建一个快速自动记录、可维护且易于使用的 Python API
  • 通过简单的升级大大提高您的数据库插入速度

编码快乐!

—迈克

又及:喜欢我正在做的事吗? 跟我来!

https://mikehuls.medium/membership

D-Tale:你见过的最好的 Python 库之一

原文:https://towardsdatascience/d-tale-one-of-the-best-python-libraries-you-have-ever-seen-c2deecdfd2b

大蟒

以下是我对这个必备 Python 库的看法,以及为什么你应该试一试

照片由安娜·施韦茨从派克斯拍摄

Python 库为数据科学家提供了广泛的功能。它们允许数据科学家处理各种数据集并执行复杂的操作。Python 库还使学习新概念变得更加容易,这对刚开始涉足该领域的学生来说至关重要。然而,学习 Python 可能会让人不知所措,在开始时,一些对其他用户来说可能很容易的任务可能需要一段时间来学习如何做和如何使用它。这就是 D-Tale 的用武之地。

即使是经验丰富的 Python 用户,有些任务也可能是重复的,会浪费您宝贵的时间。因此,D-Tale 可以帮助您优化探索性数据分析和数据清理等任务。节省时间,您可以专注于更重要的任务,如精炼代码和调整机器学习模型。但是什么是 D-Tale 呢?下面是来自 PyPI 的解释:

D-Tale 是 Flask 后端和 React 前端的结合,为您提供了一种查看和分析 Pandas 数据结构的简单方法。它与 ipython 笔记本和 python/ipython 终端无缝集成。目前这个工具支持像 DataFrame、Series、MultiIndex、DatetimeIndex & RangeIndex 这样的 Pandas 对象。

我想提醒读者,我不写任何形式的赞助内容。我将根据我的印象表达我个人对图书馆的看法。现在,让我们找点乐子吧!

装置

我们可以安装 D-Tale 很简单。只需在你的终端键入pip install dtale。我没有得到任何安装它的错误。现在,我们需要一个数据集来探索 D-Tale。今天,我将使用 COVID 数据集(Mathieu,e .、Ritchie,h .、Ortiz-Ospina,e .等人新冠肺炎疫苗接种的全球数据库。Nat Hum Behav (2021) 。这是一个有趣的数据集,足够复杂来测试 D-Tale 的一些功能,也足够容易理解正在发生的事情。

现在,让我们开始吧。首先,让我们将熊猫和 D-Tale 导入我们的 Jupyter 笔记本。然后,我们需要导入数据集,将其分配给一个变量,并使用 D-Tale 调用该变量。

**# Importing libraries**
import dtale
import pandas as pd**# Assigning dataset to variable** df = pd.read_csv('covid-data.csv')dtale.show(df)

作者 GIF

耶!我们刚刚打开了 D-Tale GUI。与熊猫不同,我们可以与数据集和库进行交互,而无需键入代码。另一件很酷的事情是,D-Tale 在第一个屏幕上显示的信息比熊猫还多。

作者 GIF

首先,我们可以向下滚动到右侧查看更多数据。在熊猫身上,这不像 D-Tale 那么简单直观。然后,在左上角,您可以看到左上角的列数和行数,而无需键入任何代码。在顶部浏览,你会看到导航菜单。

作者 GIF

现在我们已经熟悉了 D-Tale,我们将探索它的特性。关于 D-Tale 的另一点是,我们不需要在 Jupyter 笔记本上使用它。因此,出于演示目的,让我们在不同的选项卡中使用 D-Tale。不过,你想如何使用它取决于你自己。使用下面的代码。

dtale.show(df).open_browser()

作者 GIF

数据准备

一键更改数据类型

在 Pandas 上改变数据类型并不困难,即使对初学者来说也是如此,而且为了一两个特性而改变它们应该没有问题。但是,如果您需要更改 300 多个特性的数据类型,该怎么办呢?这在专业环境中并不少见,对于这样的任务,键入数百行代码并不是对我们时间的最佳利用。有了 D-Tale,我们只需点击几下鼠标就可以改变数据类型。

例如,在这个数据集中,我注意到日期列是一个字符串。我们不想那样。让我们把它改成日期时间。只需点击列名,并在列名的正下方点击Type Conversion,并选择是否要更改inplace或创建新列。选择数据类型,更改日期格式,然后单击应用。就是这样!

作者 GIF

有奖金。在应用更改之前,您可以看到将要使用的代码。如果你正在学习 Python,这是一个很棒的附加软件。还有更多。一旦数据类型是 DateTime,我们可以在单击列名时看到附加信息,比如偏斜度。很酷,对吧?

作者图片

创建一个不同格式的新列

我们还可以创建一个不同格式的新列。出于演示目的,让我们将日期列转换为字符串。只需点击您想要转换的列名,然后点击Type Conversion,点击New Column,选择新的列名,并选择数据类型。搞定了。

作者 GIF

删除列

删除列再简单不过了。选中要删除的栏目,点击Delete,在弹出的窗口中点击Yes,该栏目就没了。是的,输入删除列的代码也很简单,但没有这么简单。

作者 GIF

更改列的名称

重命名列的过程:点击,重命名,保存。这么简单!只需点击列名,点击Rename,选择名称,并保存。结束了。如果您需要更改许多列的名称,这将非常方便。

作者 GIF

数据转换

过滤数据

过滤数据非常容易。单击要过滤的列。在底部,你会看到过滤选项。您可以过滤任何数据类型。D-Tale 有过滤选项,如等于、大于/小于、不同于等。都在那了!

在下面的例子中,我过滤了各大洲,只显示了北美的数据。

作者 GIF

合并数据

要合并两个数据框,单击左上角的图标,将会打开一个新的选项卡。您可以直接从用户界面上传数据集。选择数据集,你想如何连接它们,差不多就是这些了。如果您打算在另一个项目中使用它,您也可以在底部看到代码。

作者 GIF

分组依据

要分组,点击Summarize Data,选择你想要分组的列,函数(求和、计数、均值、中值等),就完成了。您可以在同一个标签或不同的标签中打开它。

描述数据

需要一个功能的快速摘要?没问题。使用 D-Tale,您可以查看诸如值计数、缺失值、频率、统计汇总(如平均值、中值、百分位数、标准差、偏斜度、字数等)等信息。根据数据类型,它还会显示数据图,如直方图、时间序列、条形图等。

为此,只需点击栏目名称,然后点击Describe (column analysis),你会看到很多很酷的信息。

作者 GIF

如果您想快速浏览所有栏目,您可以单击右上角的符号,单击“summary”选项,然后您将能够通过单击逐个检查所有功能。

[需要另一张 GIF]

数据可视化

数据可视化是数据分析过程中最耗时的任务之一。对于初学者来说,让它们看起来很好可能是一场噩梦,但幸运的是,D-Tale 也可以在这方面提供帮助。您只需点击几下鼠标就可以创建可视化效果,最棒的是:您可以获得代码并了解正在发生的事情。

条形图

让我们开始创建一个条形图。要创建条形图,请单击右上方,转到图表,将会打开一个 GUI。在那里,您可以在十三个选项中选择一种类型的情节!从那里,选择 X 和 Y 变量,聚合类型,如果有的话,瞧,你就得到一个漂亮的图形。

在下面的示例中,我将洲放在 x 轴上,将按洲划分的 COVID 案例总数放在 y 轴上。

作者 GIF

如果你想将数据分组,写下你想分组的变量并做。在本例中,我将国家分组为洲组。

作者 GIF

绘图代码

正如我提到的,您可以很容易地获得代码来检查情节是如何创建的。这是学习甚至交付最终产品的好方法,因为图表很好看,可以用作最终版本。

作者 GIF

散点图

创建散点图和条形图一样简单。选择 x 轴和 y 轴,分组,如果你想,然后嘣。你得到了一个散点图。下面,我正在检查新病例数和接种新冠肺炎疫苗人数之间的关系。

作者 GIF

时间序列

D-Tale 将时间序列带到了另一个高度。只需一次点击,您就可以轻松地用它们创建时间序列图,并浏览不同的时间序列类型,如 Hodrick-Prescott 和 Bacter-King 过滤器。很酷吧。

作者 GIF

描述数据集

我们已经讨论过这个主题,但我想提一下您可以使用摘要功能创建的一些令人兴奋的可视化效果,如直方图、探索类别和创建 QQ 图。

然而,最酷的部分是,您可以将选择的列与其他列进行交互,并创建即时图形。这是了解数据集的最佳方式,无需花费数小时键入代码来获得单击即可获得的结果。

作者 GIF

更多 D-Tale 功能

除了数据分析选项,D-Tale 还提供了一些附加设置,如选择语言和黑暗模式。

改变语言和黑暗模式

D-Tale 有一些更复杂的任务,可能会让非英语人士感到困惑,如果你的母语是中文或葡萄牙语,我有一个好消息,😄-Tale 除了支持英语外,还支持这两种语言来翻译他们的用户界面。

对于喜欢的人还支持黑暗模式。我不是黑暗模式的最大粉丝,因为我觉得它更难阅读,但如果你没有这个问题,你应该喜欢这个额外的功能。

突出显示列

D-Tale 允许我们根据几个选项突出显示数据。例如,您可以根据数据类型突出显示数据。我们还可以突出显示 NaN 值和异常值,以避免遗漏它们。您还可以基于参数(如大于或小于特定数字)突出显示数据。

作者 GIF

最后的想法

唷。这太多了。在这篇博客中,我们看到了 D-Tale 如何通过将繁琐的任务转化为直观的任务,使我们的生活变得更加轻松,即使对于那些经验丰富的专业人士来说也是如此。这个博客遗漏了许多很酷、更复杂的特性,所以我建议您尝试一下,探索一下,找到更多对您有用的特性。

我认为 D-Tale 适合所有人吗?不尽然,但是如果您是需要快速从数据集获得见解的专业人士,或者是不熟悉 Python 世界的学生,那么这是一个需要记住的很好的库。如果你是一个高级 Python 用户,你可以尝试一下,看看你能从它那里得到什么,这需要花一些时间来完成代码输入。如果你有,请在评论区告诉我。编码快乐!

D3Blocks:Python 库,用于创建交互式和独立的 D3js 图表。

原文:https://towardsdatascience/d3blocks-the-python-library-to-create-interactive-and-standalone-d3js-charts-3dda98ce97d4

创建交互式的、独立的、视觉上吸引人的图表,这些图表建立在 d3 javascript (d3js)的图形之上,但是可以用 Python 进行配置。

D3Blocks 中支持的前十个块。(图片由作者提供)。

Python 已经成为分析和可视化数据的最流行的编程语言之一。可视化可能是项目成功的关键,因为它可以揭示数据中隐藏的见解,并提高理解。理解和解释数据的最好方法是让它具有交互性。尽管 Python 中提供了许多可视化软件包,但创建美观、独立、交互式的图表,并且在您自己的机器之外也能工作,仍然具有挑战性。在之前的博客中,我已经展示了如何为网络图创建一个独立的交互式图表。 用 D3Blocks 我们超越了单一的图表创造了一个框架 现在包含了漂亮的图表 。它是开源的,不需要安装除 Python 之外的任何东西来创建 D3 图表。输出是一个交互式图表,你只需要一个(互联网)浏览器;分享和发布因此变得超级容易。 在这篇博客中,我将介绍一下 D3Blocks,并结合动手实例简单描述一下这 10 个 Blocks。

如果你觉得这篇文章很有帮助,可以使用我的 推荐链接 继续无限制学习,并注册成为中级会员。另外, 关注我 保持我的最新内容!

何必用 D3.js 呢?

近年来,Python 社区开发了一系列令人印象深刻的可视化库,如 Matplotlib 、 Seaborn 、 Bokeh 、 Plotly 、follow等等。一些库也允许图形是交互式的,但是在这种情况下,它们仍然需要来自 Python 或其他 web 服务的服务来保持运行。d3 的优势在于它的高性能、可深度定制的图表,并且它符合 web 标准。名称" D3 "是DATA-DrivenD***documents,是一个用于生成动态、交互式数据可视化的 Javascript 库,它速度快、看起来漂亮,并且可以添加您所有的创意。此外,除了浏览器之外,您不需要任何其他技术来绘制图表。*

“D3 帮助您使用 HTML、SVG 和 CSS 将数据变为现实。D3 对 web 标准的重视使您可以获得现代浏览器的全部功能,而无需将自己束缚于专有框架,将强大的可视化组件和数据驱动的 DOM 操作方法结合起来。”——d3js

D3 也叫 D3.jsd3js。 我将这两个名字互换使用。

使用 d3Blocks 创建独立的 D3 图表非常简单。

我刚刚提到了 d3 的优点,但也有缺点。首先,要将你的创意转化为图表,你需要熟悉 SVG、HTML、CSS 和 Javascript。但是即使你这样做了,d3js 图表也不容易概括不同的数据集。换句话说,d3js 脚本通常是一个静态脚本,它被优化为显示一个特定数据集的结果。更改数据集需要更改各种参数,例如轴的最小值/最大值、列名,很可能还需要更改图表的方向和位置。

使用 D3Blocks,我们通过将数据转换成适合下游 d3js 脚本的格式来克服这些挑战。此外,所有必需的参数,(列)命名、格式、定位、方向等。也是经过的。以这种方式,我们可以利用两个世界的优势;Python 用于数据管理、预处理、分析、建模,d3js 用于可视化。在之前的博客中,我展示了如何将 d3js 与 Python 相结合,在 D3Blocks 中,我们超越了单一的图表。

D3Blocks 中的第一个 blocks 准备好了!

对于每个开发的区块(或图表),都有一个 Python 部分和一个 d3js 部分。d3js 部分以这样一种方式开发,它可以处理具有不同属性的不同数据集,但依赖于 Python 部分。输出是一个 HTML 文件,其中包含一组特定于图表的 d3 库。

D3Blocks 创建的每个图表都完全封装在一个 HTML 文件中,这使得共享和发布成为可能,除了浏览器之外,您不需要任何其他技术。

前 10 个区块分为以下几类:

  • 关系图: 网络(d3graph),三键,弦,热图。
  • 带时间元素的图表: 时间序列,并移动气泡。
  • 用于成像的图表: 图像滑块。
  • 图表多样: 散点、小提琴、粒子。

尽管每个块都有自己的属性,但我们保持输入数据的一致性。这允许在没有数据管理的情况下在块之间切换。让我们通过一个小的动手示例来浏览每个模块。首先,你首先需要 pip 安装 D3Blocks 库:

**pip install d3blocks**

绘制关系的图表

当一个记录与另一个或多个记录相关联时,就描述了关系。在图论中描述了许多形式来存储这种关系,例如,邻接矩阵是对称的正方形矩阵,或者编码顶点-顶点对关系的关联矩阵。无论矩阵的形式是什么,绘制关系图都有助于更好地理解数据。例如,它可以揭示出 演化模式 ,其中节点被复制成两个或更多组,代表阶段。在这种情况下,用和弦桑基图来表示关系是理想的。或者,也可以有 源到端 的模式,其中它从某个点开始,并以可能的中间步骤结束。在这种情况下,网络图会很有用。另一方面,热图图在交互数量很大并且网络等图形变成巨大的毛球时变得有用。对于所有这四个图表,输入数据保持一致,并且需要包含列源、目标和权重的数据框。在下面的四个例子中,我将使用公开可用的 能量数据集【1】,其包含与列的 68 个关系;来源,目标,权重

网络图。

有了D3 graph块,我们就可以用 D3 力定向图来绘制网络交互(更多细节可以在这里找到【5】)。在代码部分 1 中,我们加载*能量数据集*【1】,然后使用 d3graph 块分析数据。节点根据 Louvain 聚类试探法进行着色,边的宽度基于权重。现在可以以交互方式探索网络(图 1) ,其中可以根据边的强度断开边(使用位于顶部的滑块)。这保持了最强连接节点的完整性。**

代码部分 1。创建 D3graph 的示例。

图一。使用 d3graph 块的能源数据集的交互式网络图。在 Louvain 算法聚类方法中,节点被着色,边的大小基于输入的权重。可以使用顶部的滑块根据边权重断开网络。(图片由作者提供)

桑基图。

Sankey 图是一个可视化的图,显示了从一组值到另一组值的流动。矩形框代表节点,箭头的宽度与流速成比例。当您想要显示多对多关系或通过一组阶段发现多条路径时,最好使用 Sankeys。例如,流量如何从(起始)页面流向网站上的其他页面。为了进行演示,能量数据集【1】被用作桑基块 ( 代码段 2) 的输入,从而产生图 2。作为开发 Sankey 块的起点,d3js 代码是从 Mike Bostock 派生出来的,然后被 then 化。关于使用 D3Blocks 的 Sankey 图表用法的更多细节可以在本博客【8】中找到。

代码部分 2。创建桑基图的示例。

图二。使用默认参数的能量数据集的散点图。(图片由作者提供)

和弦图。

一个弦图表示几个实体或节点之间的流或连接。每个实体由圆形布局外部的片段表示。然后,在每个实体之间绘制圆弧。弧线的大小与流量的重要性成正比。为了进行演示,将能量数据集[1] 用作弦块 ( 代码段 3) 的输入,从而产生图 3。作为开发 Chord 块的起点,d3js 代码是从 Mike Bostock 派生出来的,然后被 then 化。

代码第三部分。创建和弦图的示例。

图 3。使用默认参数的能量数据集的弦图。(图片由作者提供)

热图。

利用来自D3 热图库热图,其从(邻接)矩阵创建热图。在代码段 4 中,我们加载能量数据集【1】,将数据重新格式化为邻接矩阵,然后创建热图(图 4 )。热图可以进行交互式聚类和分析。作为开发热图块的起点,d3js 代码是从迈克·博斯托克派生出来的,然后被 then 化。

代码第 4 部分。创建热图的示例。

图 4。使用默认参数的能源数据集的热图。(图片由作者提供)

绘制时间序列数据的图表。

在时间序列数据中,必须有一个日期时间元素以及该时间点的状态。时间序列最直观的例子是 股票数据 ,可以使用 时间序列 进行可视化。 可替换地,也可以有时间依赖性,其中一个动作跟随另一个动作(例如,像一个过程)。在这种情况下, 运动气泡图 有助于理解运动,以及在特定时间点是否出现集群。

时间序列。

时间序列图表可用于日期-时间元素可用的情况,并且这些值直接相互跟随。使用时间序列块,您可以启用/禁用感兴趣的列,并执行刷屏和缩放以快速聚焦感兴趣的区域。显示了代码第 5 节中的一个示例,其中各种气候变量被可视化(图 5) 。作为开发 Timeseries 块的起点,d3js 代码是从 Mike Bostock 派生出来的,然后被 then 化。**

代码第五部分。创建时间序列图的示例。这里我们导入气候数据。

图 5。使用默认参数的时间序列图。右侧面板用于选择(取消选择)可用的气候变量,而底部面板用于刷牙和缩放。(图片由作者提供)

移动的气泡。

移动气泡图提供了对行动如何及时跟进的洞察。它可以帮助理解实体的移动,以及集群是否在特定的时间点和状态发生。虽然可视化方法不是最有效的,但它对力导向和碰撞节点非常有效。静态图表来自一篇名为“美国人的一天生活”的帖子,然后进行了大量修改,以确保图表可以概括不同类型的数据集、州数、方向、格式、颜色等。我们创建了一个函数来生成具有各种状态和随机时间点的随机数据集。在代码段 6 中显示了创建移动气泡图表的演示,这导致了在图 6 中描述的图表。更多信息和例子见 movingbubbles 博客 [ 7 。**

代码部分 6。创建移动气泡图的示例。

图 6。使用默认参数移动气泡图。左侧面板可用于选择时间移动的速度,而右侧面板中的实体在特定时间点从一种状态移动到另一种状态。(图片由作者提供)

图像滑块。

当您想要比较两幅图像时, ImageSlider 非常有用。这在 之前有 状态之后有 的情况下最有用。出于演示的目的,我使用了来自 Unsplash 的 Markus Spiske 的照片。现在可以很容易地比较两幅图像(代码段 7,图 7 )。javascript 代码是从 JohnEdChristensen 中派生出来的,然后被 then 化以方便在图像之间进行比较。

代码第 7 部分。创建 ImageSlider 图形的示例。

图 7。带有两个输入图像的 ImageSlider。将中间的橙色球向左(前)或向右(后)移动后,会显示该图像。(照片由来自 Unsplash 的 Markus Spiske 拍摄)

散点图。

散点图可能是绘制(x,y)坐标最著名的图形。这样的基本图表是有用的,特别是具有刷和缩放功能。散点图可以按样本着色,并用于检测样本(组)之间的关系。输入是 x 和 y 坐标,但也可以设置各种其他参数,如类标签、大小、(边缘)颜色、工具提示信息等。散点图也可以在两组或三组坐标之间转换。这在比较不同的映射集时会很有帮助,正如在之前的文章 [2]中所描述的。为了进行演示,我将使用来自癌症基因组图谱项目(TCGA) [3]的癌症数据集,该数据集提供了 34 种不同癌组织的多种类型的分子数据。对分子数据进行处理[4],并得出 t-SNE 坐标以及代表患者间相似性的主要成分。使用散点图,我们可以可视化两组坐标(t-SNE 和 PC ) ,并更深入地分析结果(代码第 8 部分,图 8) 。关于散点图使用 D3Blocks 的更多细节可以在本博客【9】中找到。

代码第 8 部分。创建散点图的示例。

图 8。散点图。缩放是通过选择一个区域。双击将返回主屏幕。(图片由作者提供)

小提琴情节。

Violin 图可视化了一个或几个组的数值变量的分布。它是箱线图的一种替代方法,可以洞察大型数据集,箱线图可以隐藏一部分信息。使用这个模块,我们可以为一个或几个组配置图表,并更改图表中的各种元素,例如颜色、工具提示和框大小。为了进行演示,将癌症数据集【3】用作小提琴模块* ( 代码段 9) 的输入,从而得到图 9。原始代码是从 D3.js 图库中派生出来的,并大量扩展了新功能。*

代码第 9 部分。创造小提琴情节的例子。

图 9。小提琴情节。(图片由作者提供)

粒子。

有了**粒子块,**我们可以把任何单词变成交互式粒子图。鼠标移动或触摸单词会让粒子反弹,然后回到原来的位置。可以将各种属性更改为图表的行为,如反弹、粒子大小和颜色。创建粒子图的示例如代码段 10* 所示,结果如图 10 所示。最初的 javascript 是从伊恩·约翰逊那里派生出来的,然后被 then 化了。*

代码段 10。创建粒子图。

图 10。粒子。(图片由作者提供)

做一个贡献者,建立你自己的区块!

现在创建了第一组十个块,一些被分叉和(大量)调整,而其他的从头开始创建。但是有 几百个工作中的 d3 图表**【1,6】**在交互和交互过程中与 performant 增量更新也是有用的,比如拖动、刷、缩放。图表可用于多种目的,如定量分析、可视化层次结构和创建网络图、以及条形图、线图、散点图、辐射图、地理投影、和各种其他交互式可视化,用于探索性解释。我们构建了作为开源软件的 D3Blocks,以鼓励您构建自己的 block,并加入我们对新 Blocks 的进一步开发。除了构建全新的块,您还可以决定向现有的块添加新的功能!**

最后的话。

D3blocks 库包含 10 个交互式的、独立的、视觉上吸引人的图表,这些图表可以使用 Python 和 d3js 中的后端进行配置。d3blocks 的输出是将每个图表完全封装到一个 HTML 文件中,这使得在网站上共享或发布成为可能,除了浏览器之外,您不需要任何其他技术。

别做梦了,把你的创意加到一块吧!

干杯,E.

如果你觉得这篇文章很有帮助,可以使用我的 推荐链接 继续无限制学习,并注册成为中级会员。另外, 关注我 关注我的最新内容!

软件

  • D3Blocks Github
  • D3Blocks 文档页面

我们连线吧!

  • 我们在 LinkedIn 上连线
  • 在 Github 上关注我
  • 跟随我在媒体上

参考

  1. 【observablehq】, 能源数据集 ,2019 (ISC 许可)
  2. t-SNE、UMAP、PCA 和其他映射之间的定量比较, Medium,2022
  3. 癌症基因组图谱研究,n .等人癌症基因组图谱泛癌分析项目Nat Genet 45 ,1113–1120,10.1038/ng.2764 (2013)。
  4. 2D 图中的泛癌亚分类显示了由分子特征的特定组合驱动的亚结构 ,科学报告自然,2016
  5. 用 Python 创作精美单机互动 D3 图表, 中号,2022
  6. Bl.ocks
  7. 如何用 Python 制作 d3js 中的讲故事移动气泡图 ,中,2022 年 9 月
  8. 使用 Python 在 d3js 中创建漂亮的 Sankey 图表的实践指南。中等,2022 年 10 月
  9. **使用 D3js 和 Python 、Medium 2022 年 11 月,使散点图具有交互性,从而充分利用散点图

Dag shub:GitHub 对数据科学家和 ML 工程师的补充

原文:https://towardsdatascience/dagshub-a-github-supplement-for-data-scientists-and-ml-engineers-9ecaf49cc505

将您的数据、模型、实验和代码保存在一个地方

动机

作为一名数据科学家,您可能希望对您的代码、模型、数据、参数和指标进行版本化,以便能够重现某个实验。

作者图片

GitHub 是对代码进行版本控制的一个很好的平台,但是对数据、模型和指标进行版本控制并不理想,原因有二:

  • GitHub 有一个 100MB 的严格文件限制,所以上传一个中等大小的二进制文件很容易超过这个限制。
  • 用 GitHub 比较不同版本数据的变化很乱。我曾经在使用git pull后手动接受过 100 多次数据的更改,那是一种痛苦。

DVC (数据版本控制)是对二进制数据进行版本控制的理想工具。但是,你不能在 GitHub 上查看 DVC 跟踪的文件。

作者图片

如果有一个类似于 GitHub 的平台,但是更适合数据科学家和机器学习工程师,那不是很好吗?这时 DagsHub 就派上用场了。

DagsHub 是什么?

DagsHub 是数据科学家和机器学习工程师对他们的数据、模型、实验和代码进行版本化的平台。

DagsHub 允许您在他们的平台上创建一个新的存储库,或者连接到 GitHub 上的存储库。如果要在 DagsHub 上创建新的存储库,请单击新建存储库:

作者图片

如果您在 GitHub 上已经有一个存储库,并且想要将您的存储库迁移到 DagsHub,请单击 Migrate A Repo:

作者图片

如果您想同时通过 GitHub 和 DagsHub 管理您的存储库,请单击 Connect A Repo:

作者图片

DagsHub 上新存储库的界面应该与 GitHub 上的界面非常相似,只是增加了一些选项卡,如实验、数据、模型、笔记本、DVC 和 Git。

作者图片

你可以在这里查看上面的资源库。让我们探索 DagsHub 的一些功能。

数据和代码版本化

假设您的机器上有 GitHub 库的本地副本,我们将使用 DVC 来版本化您的二进制数据。

从安装 DVC 开始:

pip install dvc

通常情况下,在使用 DVC 时,您需要使用一个外部存储,如 Google Drive、亚马逊 S3、Azure Blob 存储、谷歌云存储等。但是,使用 DagsHub,您可以将数据直接存储在平台上。

要将您的数据上传到 DagsHub,首先获取远程按钮下的 DVC 链接:

作者图片

接下来,将该链接设置为 DVC 的远程存储:

dvc remote add origin [https://dagshub/khuyentran1401/dagshub-demo.dvc](https://dagshub/khuyentran1401/dagshub-demo.dvc)

添加身份验证:

dvc remote modify origin --local auth basic
dvc remote modify origin --local user DAGSHUB_USERNAME
dvc remote modify origin --local password DAGSHUB_PASSWORD

接下来,添加我们希望存储在 DagsHub 上的二进制数据。例如,要添加目录data/raw,我运行:

dvc add data/raw

该命令将创建一个新的.dvc文件。这些是小文本文件,存储如何访问原始数据的信息,而不是原始数据本身。

data
├── raw
│   └── marketing_campaign.csv
└── raw.dvc

将这些文件推送到 DagsHub 的存储中:

dvc push

现在我们可以在数据和代码中添加更改,然后将您的更改提交并推送到 GitHub:

git add .
git commit -m 'push data and code'
git push origin master

如果你同时使用 GitHub 和 DagsHub,你只需要把你的文件推送到 GitHub。DagsHub 会自动与 GitHub 同步!

注意:如果 DagsHub 不同步,单击存储库标题下的刷新图标:

作者图片

如果你熟悉 DVC,这里没什么新鲜的。然而,当您访问 DagsHub 上的存储库时,神奇的事情发生了。

在 GitHub 上,你可以看到你的.dvc文件,但看不到数据本身。这是因为实际数据存储在其他地方:

作者图片

在 DagsHub 上,您可以看到.dvc文件和数据本身,因为数据存储在 DagsHub 上!

作者图片

这非常方便,因为我可以在一个平台上查看代码和数据。

作者图片

跟踪实验

像 MLFlow 这样的库允许数据科学家跟踪他们的实验以及模型和参数。然而,他们不跟踪代码。

如果能保存一个实验的代码、模型、参数、数据不是很好吗?

作者图片

使用 DagsHub 可以轻松做到这一点。DagsHub 允许您使用 DagsHub logger 或 MLFlow 记录您的实验。实验选项卡下的实验应该如下所示:

作者图片

使用 MLFlow 在不提交代码的情况下快速试验不同的参数是一个很好的实践。一旦您找到了具有良好结果的实验,您可以使用 DagsHub logger 将结果保存为开放格式(metric.csv,param.yaml ),并将其与生成结果的代码、模型和数据封装在一起。

让我们来学习如何用这些方法来记录你的实验。

用 MLFlow 记录您的实验

MLflow 是一个开源平台,允许你跟踪和比较实验。要安装 MLflow,请键入:

pip install mlflow

在下面的代码中,我使用 MLFlow 来记录度量和参数。

我还将跟踪 URI 设置为在 MLflow 跟踪远程下找到的 URL:

作者图片

就是这样!现在,每次运行代码时,每个实验的参数和指标都会显示在 DagsHub 存储库的 Experiments 选项卡下:

作者图片

能够在 DagsHub 这样的远程服务器而不是本地数据库中记录您的 MLflow 实验将允许您的队友在他们的浏览器中访问您的实验。

用 DagsHub Logger 记录你的实验

一旦您找到了一个好的实验,并准备好记录该实验的代码、数据和输出,只需将 MLFlow 切换到 DagsHub logger。

要使用 DagsHub 记录器,请从安装 DagsHub 开始:

pip install dagshub

使用 DagsHub logger 记录您的实验与使用 MLFlow 记录非常相似:

运行您的代码后,DagsHub 将自动在您的工作目录中创建两个文件metrics.csvparams.yml:

.
├── metrics.csv
└── params.yml

将所有更改添加到临时区域,然后将这些更改提交并推送到 GitHub:

git add .
git commit -m 'experiment 1'
git push origin master

现在,新的实验将在实验选项卡下用 Git 记录。

作者图片

同时使用 MLflow 和 DagsHub 记录器

尽管在 MLflow 和 DagsHub logger 之间切换很有用,但我发现每次想切换到另一个 logger 时都要重写代码,这很不方便。

我的解决方案是创建一个BaseLogger类,它的方法是log_metricslog_params。每个方法都将使用 MLflow logger 和 DagsHub logger。

有了BaseLogger,我可以在一行代码中同时使用两个记录器。

MLflow 实验之间的比较

要比较两个或多个实验,请勾选要比较的实验框,然后单击比较。

作者图片

您应该会看到所有实验的比较,如下所示:

作者图片

DagsHub 还自动创建图,如平行坐标图和条形图,以便您可以观察参数和输出之间的关系

作者图片

作者图片

Git 实验之间的比较

要比较两个 Git 实验之间的文件差异,请在 experiments 选项卡下复制它们的提交 id:

作者图片

然后将每个提交 ID 粘贴到文件选项卡下的每个分支上:

作者图片

作者 GIF

两次提交之间不同的文件将以黄色突出显示。

作者图片

要查看差异,请单击文件。由于缺少的信息以红色突出显示,附加信息以绿色突出显示,因此我们可以清楚地看到两次提交之间的差异。

作者 GIF

更好的是,DagsHub 提供了一个很好的界面来比较两个 Jupyter 笔记本。

作者图片

作者图片

由于数据科学家经常使用 Jupyter Notebook,因此能够比较两台笔记本的输出非常有用。

额外提示:创建一个 DVC 管道

有时,您可能希望其他人理解您项目的工作流程(例如,一个脚本的输出如何用于另一个脚本)。DagsHub 允许您通过 DVC 管道创建数据工作流的可视化。

作者图片

要创建 DVC 管道,首先要创建一个dvc.yaml文件。在下面的代码中,我将我的工作流分为 3 个阶段:process_datasegmentanalyze。对于每个阶段,

  • cmd指定执行阶段的命令
  • deps指定阶段的依赖关系
  • outs指定阶段的输出
  • metrics指定阶段的指标

outs中列出的所有文件都被缓存,这与使用dvc add时发生的情况类似。这就是为什么你不再需要对这些文件使用dvc add

现在,您可以通过运行以下命令来再现dvc.yaml中指定的整个管道:

dvc repro

产出:

Running stage 'process_data':
> python src/process_data.py
Updating lock file 'dvc.lock'                                                                                                                                                      

Running stage 'segment':
> python src/segment.py
Updating lock file 'dvc.lock'                                                                                                                                                      

Running stage 'analyze':
> python src/run_notebook.py
Updating lock file 'dvc.lock'

现在,其他人可以通过运行dvc repro命令复制您的结果。多方便啊?

接下来,运行dvc push将 DVC 跟踪的所有文件推送到 DagsHub。使用git addgit commit将代码和数据的变化推送到 GitHub。

如果您访问 DagsHub 上的存储库,您应该会在 DagsHub 上看到整个管道的漂亮的交互式图形!

作者 GIF

通过单击图中的节点,可以获得该节点的更多详细信息。现在,其他人只需访问 DagsHub 上的存储库,就可以了解您的数据工作流。

结论

恭喜你!您刚刚学习了如何使用 DagsHub 对您的数据项目进行版本化。使用 DagsHub,您可以在一个地方轻松再现实验并查看数据科学项目的所有组件。

本文的源代码可以在这里找到:

https://dagshub/khuyentran1401/dagshub-demo

我喜欢写一些基本的数据科学概念,并尝试不同的数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。

Star 这个回购如果你想检查我写的所有文章的代码。在 Medium 上关注我,了解我的最新数据科学文章,例如:

2023 年指导自学成才的数据科学家的每日、每周、每月和每年目标提示

原文:https://towardsdatascience/daily-weekly-monthly-and-yearly-goal-tips-to-guide-a-self-taught-data-scientist-in-2023-d405f8d0d87a

这些目标将帮助您建立和组织即将到来的一年,成为一名数据科学家

Zoritsa Valova 在 Unsplash 上拍摄的照片

如果你和我一样,十二月是为即将到来的一年做准备的月份。无论是清理我的电脑文件,捐赠我在过去一年中没有使用的旧物品,还是购买我将在来年阅读的书籍,我认为应该留出 12 月份进行准备,以便你可以有组织、有重点地进入 1 月份,并且没有任何来自去年的包袱。

准备工作的一部分还包括设定我来年的决心或目标,并准备好实现它们所需的一切。但是为什么我需要整整一个月来准备来年的计划呢?

的数据表明即使你设法在一月的整个月完成你的决心或目标,80%的决心在二月中旬仍然会失败。

为什么?

因为在一月份制定决心或目标对他们来说太晚了,无法成功。

你有没有考虑过,为什么你会在一月的第一周看到健身爱好者突然涌入,然后在接下来的几周看到他们明显减少,直到月底才回到常客的行列?这是因为那些在新年前夜昏昏沉沉地决心“减肥”或“去健身房”的人,并没有通过充分的预先计划为成功实现目标做好准备。

那么,所有这些关于分辨率的讨论与数据科学有什么关系呢?

嗯,如果我注意到自学数据科学的任何事情,那就是你往往会失败,至少失败一次。新年伊始是设定自学数据科学目标的大好时机,但前提是你要事先做好适当的准备。因此,12 月是开始准备如何实现 2023 年成为数据科学家的目标的最佳时机。这不仅让你有足够的时间做准备,也让你在进入一月时有正确的心态,充满成功的动力。

每日目标

学习数据科学的日常目标应该是每天提高 1%。这些目标不应该是需要一整天才能实现的怪物,而应该是微小的努力,最终在年底取得巨大的胜利。当然,你的日常目标将由你今年的总体目标来指导,但它们不应该太大或太强。

例如,你可以寻找一个自动化的琐碎任务,花 10 分钟开发一项新的数据科学技能(想象可视化或掌握一个新的库),在一个热情或组合项目上取得进展(每天添加一个新功能,或花几分钟清理代码并创建文档),听一个数据科学播客(或实际上只是消费任何类型的非正式数据科学相关内容),或通过 Twitter 等社区或时事通讯分享你所学到的东西。

每日目标不是你征服世界的地方。相反,它们要小得多,类似于每天服用维生素或遛狗。

这些日常目标也应该是在不打击你的情况下拓展你的能力。每天的目标应该是你每天都期待而不会气馁的事情。你跳过一天的那一刻,你就很容易受到今年整个目标框架崩溃的影响。这就是为什么这些目标需要是可管理的和合理的,这将因人而异。

例如,如果你在工作的同时还试图过渡到数据科学,那么你的日常目标可能就像在上下班途中收听数据科学播客一样简单。这可以在假期或身体不适的时候缩减,以确保你不会打破每天的目标,而不会让自己负担过重。

我去年的一个日常目标是通过阅读像“走向数据科学”这样的网站上分享的文献来跟上数据科学的发展。我每天花不到 10 分钟的时间浏览新内容,记下我觉得有趣或与我的目标相关的内容。每天,当我在等着沏茶的时候,或者当我需要在日常工作中利用社交媒体休息一下的时候,这个目标很容易实现。

记住,这个目标必须是“简单的”——你可以在一整年的每一天都完成而不会筋疲力尽。你可以有很多你想要的每日目标,但是它们都应该很小,并且每天只需要几分钟就可以轻松实现。

你应该在每天的同一时间被提醒你每天的目标。我最喜欢的工具是一个简单的待办事项应用程序,它可以在每天的同一时间给我发送通知。检查我每天的目标非常令人满意,也帮助我留出时间去完成它们。根据你的最佳工作方式,你可能会发现每天在不同的时间完成目标是可行的,或者你可能更喜欢每天有一个预定的时间分配来完成它们。不管怎样,你需要每天被提醒你的目标,并且有一个实际的方法来“检查”它们。如果你写一些代码,让你的每日目标在你的电脑上弹出,作为你的每日提醒,这是加分的。

每周目标

每周目标应该让你感觉在周末完成了一些事情。

当谈到自学数据科学时,你的每周目标应该是让你在学习课程中前进一步,将一些学习概念从你的列表中剔除。

根据你在 2023 年成为数据科学家的目标上投入的时间,你的每周目标将从学习单个概念到整个学习单元不等。例如,如果除了学习数据科学之外,你还有其他几项任务,你的周目标可以是“掌握 Python 中的变量和函数”。或者,如果你的大部分时间都致力于学习数据科学,你每周的目标之一可能是“开发 AI 代码,实现预测能力,以确定这个数据集中的哪些客户将返回他们的订单”。

拿出日历,在上面写下你每周想要完成的目标,开始设定你的每周目标。这些目标应该与你的学习课程紧密结合。例如,你课程中的每个概念或单元应该是一个周目标。这种策略有助于你在课程中不断前进。我在我的学士学位期间使用了这个策略,我是通过完全自学的方式在网上完成的。通过以单元为基础组织我一周的工作,我能够通过每周完成一两个单元作为我的周目标来快速完成课程。

比起每天的目标,我更喜欢把每周的目标设定得更宽松一些。在你的一周中,你会有效率更高的日子和效率更低的日子。因此,我发现将任务安排在某几天是没有帮助的(当然,除非它们有具体的截止日期)。相反,我为整个星期建立了一个主要的待办事项清单,在那里我列出了我必须完成的所有事情。然后,当我在一周内浏览这个清单时,我会核对一下。不再有“我必须在星期一完成所有的事情”了。相反,我只是随波逐流。有时我会在周一完成大量的工作,而在周二却没有完成多少,因为有事情发生了。无论如何,我对周末需要完成的所有工作都有一个想法,而不是每天必须完成一定数量的任务,这也有助于我实现更好的工作和生活平衡。

月度目标

每月的目标应该是实质性的。它们应该是 12 个里程碑,在你成为数据科学家的过程中给你带来巨大的切实利益或进步。

每月的目标应该具有挑战性,而不是无法实现。这些目标中的每一个都可以是一个项目组合,一个完成的认证,或者一个掌握的实际技能。不管它们是什么,你应该能够在年底回顾并看到 12 个大的成就,所有这些都有助于你实现年度目标。

月目标首先应该与你的周目标保持一致。例如,如果你一月份的周目标主要是学习 Python,那么你的月目标应该是在 Python 中创建一个项目,在这个项目中,你可以创建、更新、删除和搜索数字地址簿中的联系人。或者,如果你 4 月份的周目标是将你的编程、数学和可视化技能结合起来,构建一个完整的数据分析,那么你的月目标可以是创建一个简单的世界银行数据分析,以确定给定地区的政治参与量。或者,如果你 10 月份的周目标是围绕职业准备,你的月目标可以是申请 10 份可行的数据科学工作。

月目标应该把你和周目标一起做的所有事情推向高潮,并把它们推向下一个层次。

我喜欢整个月都致力于每月目标,而不是把它们留到最后一分钟。组织对于确保你在完成每月目标的基础上平衡每日和每周目标是至关重要的。月度目标应该被分成可管理的部分,这样你就不会赶着截止日期(除非那是你的事情)。例如,如果你的月度目标是申请 10 份可行的数据科学工作(如果你想成功的话,需要为每份工作准备独特的简历和求职信),你可以在每个周末挑选 2-3 份工作来申请。或者,如果您的月度目标是整合整个数据分析,您可以在每月的第一个周末进行数据采集和清理,在第二个和第三个周末进行分析,在第四个周末完成可视化和项目总结。

我认为每月数据科学目标的成功在于让他们工作起来愉快或令人兴奋。每天和每周的目标很容易完成,因为你进入了一个节奏,它只是成为你日常工作的一部分。然而,月目标总是笼罩在你的头上,感觉就像一个不自然的负担,必须在你必须做的所有其他工作之上完成。你可以通过让你的每月目标包含一些你喜欢的事情来减轻这种感觉。例如,你的月度目标可能是预测即将到来的世界杯冠军,或者通过无偿数据科学工作帮助你所在社区的一家小企业。不管是什么,你的月度目标应该将数据科学与你喜欢的事情结合起来,让它成为你期待完成的事情。不仅如此,成为投资组合项目的每月目标会给你留下一堆项目,你可以充满激情地向未来的雇主描述这些项目。

年度目标

你今年的目标很简单:成为(或者至少接近成为)一名数据科学家。

然而,这个年度目标不够具体,无法实现。

当你在今年 12 月为即将到来的一年设定目标时,你需要先为它设定一些参数。虽然我一直讨厌聪明的首字母缩写词,但我认为它给了我们一个很好的基础来设定这个具体的目标。

你在 2023 年底成为一名数据科学家(或更接近成为一名数据科学家)的目标必须是sspecific、musable、aTTA able、 r elevant、 t imely (是的,每次我使用这个缩写词时我也会退缩,但请原谅我)。SMART 目标的要点是设定更好的目标,这些目标更有可能实现。当你设定具体的目标时,你确保你对需要达到的目标有一个清晰的认识。目标必须是可衡量的,这样你就可以衡量你在实现它的过程中做得有多好。你的目标还需要在你分配给自己的时间内切实可行(这就是为什么你的目标可能是在 2023 年底成为一名数据科学家,或者更接近成为一名数据科学家)。相关性将有助于你坚持你的目标,因为它与你更广泛的抱负一致。最后,你的目标必须有时间限制,否则(相信我)你永远也不会完成。

因此,您 2023 年的总体目标可以是:

在 2023 年 12 月 31 日之前成为一名数据科学家,通过利用自学的数据科学课程磨练我的数据科学技能,在全年准备面试后,在一家公司获得一份数据科学工作。这将使我更接近自己创办数据科学咨询公司的总体目标。

为什么这个目标行得通?因为它是具体的(成为一名数据科学家)可衡量的(通过在一家公司获得一份数据科学工作)可实现的(通过使用我自学的数据科学课程磨练我的数据科学技能来准备全年的面试)相关的(这将使我更接近我创办自己的数据科学咨询公司的总体愿望)及时的(到 2023 年 12 月 31 日)。

2023 年伟大年度目标的另一个例子是:

到 2023 年 12 月 31 日,我将熟练使用 Python、Excel、SQL 和 Tableau 进行客户营销数据分析,方法是完成我的项目 哪些应用程序更有可能吸引用户,这些应用程序将被添加到我的数据科学组合中,用于帮助我获得数据科学领域的工作。

这个目标也是具体的(熟练使用 Python、Excel、SQL 和 Tableau 进行客户营销数据分析)可衡量的(该项目将被添加到我的数据科学组合中,帮助我获得数据科学方面的工作)可实现的(通过完成我的项目,哪些应用更有可能吸引用户)相关的(帮助我获得数据科学方面的 hob)及时的(到 2023 年 12 月 31 日)。

虽然这些目标属性确实是值得畏缩的,但是它们可以给你一个方向,指引你以及你未来一年的每日、每周和每月目标。

你的年度目标需要张贴在你每天都能看到的工作区的显著位置。我非常喜欢这种简单的便笺。每天都看看这个目标,即使你并不缺乏雄心壮志,提醒自己为什么要为每天、每周和每月的目标如此努力。

订阅将我的故事直接发送到您的收件箱:故事订阅

请成为会员,使用我的推荐链接获得无限制的媒体访问权限(我将收取少量佣金,无需额外费用):媒体会员

通过捐赠来支持我的写作,以资助更多像这样的故事的创作:捐赠

DALL-E 2.0,已解释

原文:https://towardsdatascience/dall-e-2-0-explained-7b928f3adce7

人工智能的毕加索是如何工作的?

davisuko 在 Unsplash 上拍摄的照片

几天前,OpenAI 发布了我认为最引人注目的人工智能创造力展示: DALL-E 2 。在最基本的层面上,DALLE-2 是一种以非凡的准确性将文本映射到图像的功能,产生高质量和生动的输出图像。但是这项技术到底是如何工作的呢?在这篇文章中,我将尽可能深入地解释,同时让尽可能多的人了解情况。

如上所述,DALL-E 2 将文本作为输入,并将图像作为输出。但这并不是一蹴而就的;更确切地说,DALL-E 2 代表了过去几年来一点一点建立和改进的各种技术的顶峰。这些技术像乐高积木一样相互堆叠,以组成完整的模型。要了解 DALL-E 2,我们首先要了解这些部件是什么,它们做什么。只有这样,我们才能深入了解内部工作和训练过程,以理解底层组件。

夹子

在 DALL-E 2 架构中最重要的构建模块之一是 CLIP。CLIP 代表对比语言-图像预训练,它对 DALL-E 2 是必不可少的,因为它是文本和图像之间的主要桥梁。从广义上讲,CLIP 代表了这样一种观点,即语言可以作为一种工具,用来教会计算机不同的图像如何相互联系。形式上,它规定了一个简单的方法来进行这种教学。

理解 CLIP 的最好方法是首先看到以前的计算机视觉系统的缺点。在 CLIP 之前,计算机视觉的神经方法包括聚集大型图像数据集,然后将它们手动标记为一组类别。虽然今天的模型在这项任务上表现出色,但它固有地受到预先选择的类别的需要的限制。比如,想象一下拍一张街道的照片,让这样的系统去描述;它可以告诉你有多少辆车和标志,但它不能给你一个整体的感觉。更重要的是,没有足够的图像来产生一个类别的任何东西都不会被模型分类。

让 CLIP 如此强大的洞察力是一个聪明的想法,训练模型不仅识别图像属于哪个类别(预定义的选项列表),还从随机标题列表中识别每个图像的标题。这使得模型可以使用语言来更精确地理解“柴犬”和“戴贝雷帽的柴犬”之间的区别,而不是让人类标签员提前指定它们是否属于同一类别。

在完成上述“预训练任务”的过程中,CLIP 能够创建一个向量空间,该向量空间的维度代表图像的特征和语言的特征。这个共享的向量空间在功能上为模型提供了各种各样的图像-文本字典,允许它们在两者之间进行翻译(至少在语义上)。

尽管如此,这种共同的理解并不能代表 DALL-E 2 的全部。即使有把英语单词翻译成西班牙语单词的方法,人们也需要在说话前学习西班牙语的发音和语法。在我们的模型中,CLIP 使我们能够获取文本短语,并理解它们如何映射到图像上。但是,我们仍然需要一种方法来生成这些图像,以一种真实的方式来理解文本。进入我们的第二个乐高积木:扩散模型。

扩散模型

想象你有一个完美解决的魔方,每一面都只有单一颜色的方块。现在,你随机选择一边并扭转它。然后是另一面,另一面,另一面,等等,直到你认为魔方被“搅乱了”你将如何着手解决它?假设你忘记了你所做的所有扭转,有没有一个通用的方法来解决没有这些信息的立方体?好吧,你可以一步一步来:继续扭曲任何一张脸,让你更接近同一侧的颜色,直到解决为止。更实际的是,你可以训练一个神经网络从一种无序状态进入一种不那么 T4 无序的状态。

这是如何创建扩散模型的关键。你拍摄一张图像,随机打乱它的像素,直到你得到一张纯噪声的图像,然后训练一个模型,通过逐步改变它的像素来减少噪声,直到你回到原始图像(或类似的图像)。这留下了一个模型,它可以有效地从随机性中生成信息——一幅图像!通过向模型展示新的随机样本,我们甚至可以得到新的图像。

为了给这些创作注入输入文本的语义,我们对剪辑嵌入的扩散模型进行了“调节”。这仅仅意味着我们将来自上述联合剪辑空间的向量传递到扩散模型中,该模型计算在生成过程的每个“步骤”中改变哪些像素。这允许模型根据该信息进行更改。

当然,数学和实现的技术细节比我在这里介绍的要复杂得多。但在其核心,DALL-E 2 是这两种技术的优化和细化。

有人说“艺术是人类灵魂的窗户”出于这个原因,一些人认为生成性图像是无聊或无趣的。然而对我来说,生成艺术更有趣:它是计算机灵魂的窗口。在艺术创作中,模特展示了自己的理解、误解,最重要的是,展示了自己的创造力。

DALL E 2 解释道:革命性人工智能的承诺和局限

原文:https://towardsdatascience/dall-e-2-explained-the-promise-and-limitations-of-a-revolutionary-ai-3faf691be220

有你很可能没见过的图片和视频。

"充满活力的萨瓦尔多·达利肖像绘画,有一个机器人的半张脸."信用: OpenAI

DALL E 2 是 OpenAI 最新的 AI 模型。如果你看过它的一些作品,觉得它们很棒,继续读下去,你会明白为什么你是完全正确的——但也是错误的。

OpenAI 在 DALL E 2 上发表了一篇的博文和一篇名为“带剪辑潜在时间的分层文本条件图像生成”的论文。如果你想看一看结果,这篇文章很好,这篇论文对于理解技术细节也很有帮助,但这两篇文章都没有深入解释 DALL E 2 的惊人之处——以及不那么惊人的地方。这就是这篇文章的目的。

DALL E 2 是 DALL E 的新版本,它是一种生成语言模型,可以提取句子并创建相应的原始图像。在 3.5B 参数下,DALL E 2 是一个大型模型,但远不如 GPT 3 号大,而且有趣的是,比它的前身(12B)小。尽管它的大小,DALL E 2 生成的图像分辨率比 DALL E 高 4 倍,在字幕匹配和照片真实感方面,它在 70%的情况下受到人类评委的青睐。

正如他们对 DALL E 所做的那样,OpenAI 没有发布 DALL E 2(你可以随时加入永无止境的等待名单)。然而,他们开源的剪辑,虽然只是间接关系到 DALL E,形成了 DALL E 2 的基础。(CLIP 也是无法访问 DALL E 2 的人正在使用的app和笔记本的基础。尽管如此,OpenAI 的首席执行官 Sam Altman 表示,他们最终将通过他们的 API 发布所有模型——目前,只有少数选定的人可以访问它(他们每周向 1000 人开放模型)。

这肯定不是你看到的第一篇 DALL E 2 文章,但我保证不会让你厌烦。我会给你新的见解供你思考,并且会给其他人只是浅尝辄止的想法增加深度。此外,我将轻装上阵(尽管它相当长),所以不要指望一篇技术性很强的文章——DALL E 2 的美丽在于它与现实世界的交集,而不是它的重量和参数。

在人工智能与现实世界的交汇处,我专注于我的子堆栈简讯、 算法桥

我写关于你使用的人工智能和用在你身上的人工智能的独家内容。它如何影响我们的生活,以及我们如何学会驾驭我们正在构建的复杂世界。

订阅看你喜不喜欢。感谢您的支持!(广告结束)

本文分为四个部分。

  1. 【DALL E 2 工作原理:模型做什么,怎么做。我会在最后添加一个“像我五岁一样解释”的实际类比,任何人都可以跟随和理解。
  2. **DALL E 2 变体、修补和文本差异:**除了文本到图像的生成之外,还有哪些可能性。这些技术产生了最令人惊叹的图像、视频和壁画。
  3. 我最喜欢的 DALL E 2 作品:我将向你们展示我个人最喜欢的作品,你们中的许多人可能都没有见过。
  4. **DALL E 2 的局限性和风险:**我来说说 DALL E 2 的缺点,它能造成哪些危害,我们能得出什么结论。这一部分又分为社会和技术两个方面。

DALL E 2 如何工作

我将很快更直观地解释 DALL E 2,但我希望你现在形成一个关于它如何工作的一般概念,而不要诉诸于太多的简化。这是你必须记住的四个关键的高级概念:

  • **剪辑:**采用图像-标题对并以向量形式创建“心理”表示的模型,称为文本/图像嵌入(图 1,顶部)。
  • **先验模型:**进行字幕/剪辑文本嵌入并生成剪辑图像嵌入。
  • **解码器扩散模型(解开)😗*取一个剪辑图像嵌入并生成图像。
  • DALL E 2: 先验+扩散解码器(解除)模型的组合。

DALL E 2 是由先验和解码器组成的两部分模型(图 1,底部)的一个特殊实例。通过连接这两个模型,我们可以从一个句子到一幅图像。这就是我们与 DALL E 2 互动的方式。我们将一个句子输入“黑匣子”,它会输出一个清晰的图像。

有趣的是,解码器被称为“解开”,因为它执行原始剪辑模型的逆过程——它不是从图像创建“心理”表示(嵌入),而是从通用心理表示创建原始图像。

心理表征对语义上有意义的主要特征进行编码:人、动物、物体、风格、颜色、背景等。以便 DALL E 2 可以生成保留这些特征同时改变非必要特征的新图像。

图 1:夹子(顶部)。先前+松开解码器(底部)。信用: OpenAI

DALL E 2 如何工作:像我 5 岁一样解释

对于那些不喜欢“嵌入”和“预解码”位的人,这里有一个更直观的解释。为了更好地理解这些难以捉摸的概念,我们来做一个快速游戏。拿一张纸和一支铅笔,在做这三个练习时分析你的思维过程:

  1. 首先,想象画一个被树包围的房子,背景是天空中的太阳。想象这幅画会是什么样子。刚才出现在你脑海中的心理意象,就是一个图像嵌入的人类类比。您不知道绘图的确切结果,但您知道应该出现的主要特征。从句子到心理意象是先验模型所做的。
  2. 你现在可以画图了(不需要画的很好!).把你脑海中的意象转化成一幅真实的图画是 解开的是。你现在可以完美地从相同的标题中重新绘制另一个具有相似特征但最终外观完全不同的标题,对吗?这也是 DALL E 2 如何从给定的图像嵌入中创建独特的原始图像。
  3. 现在,看看你刚刚画的画。这是画这个标题的结果:“一个被树包围的房子,太阳在背景天空中。”现在,思考哪些特征最能代表那句话(例如,有一个太阳、一栋房子、一棵树……),哪些特征最能代表图像(例如,物体、风格、颜色……)。这个对句子和图像的特征进行编码的过程就是 CLIP 所做的。

幸运的是,我们的大脑也有类似的过程,所以很容易理解 CLIP 和 DALL E 2 是做什么的。尽管如此,这个 ELI5 解释是一种简化。我用的例子非常简单,当然这些模型不做大脑做的事情,也不是以同样的方式。

DALL E 2 的变化,修补,和文本差异

句法和语义变异

DALL E 2 是一个多功能的模型,可以超越句子到图像的生成。因为 OpenAI 利用了 CLIP 强大的嵌入功能,他们可以通过对给定的输入进行输出变化来处理生成过程。

我们可以从 CLIP 的“心理”图像中窥见它认为从输入(在图像间保持不变)到可替换(在图像间变化)的本质。DALL E 2 倾向于保留“语义信息…以及风格元素。”

萨瓦尔多·达利的“记忆的持久性”和 OpenAI 的标志的变化。信用: OpenAI

从 Dalí的例子中,我们可以看到 DALL E 2 是如何保存对象(时钟和树)、背景(天空和甜点)、风格和颜色的。然而,它不保存时钟或树的位置和数量。这给了我们一个暗示,DALL E 2 学到了什么,没有学到什么。OpenAI 的 logo 也是如此。图案是相似的,符号是圆形/六边形的,但是颜色和突出的波动都不总是在同一个地方。

DALL E 2 还可以在输出图像中创建与输入句子中的句法-语义变化相对应的视觉变化。它似乎能够充分地将句法元素编码为彼此独立的。DALL E 2 从句子“一个宇航员骑着一匹逼真风格的马”中输出这些:

"一名宇航员骑着一匹逼真的马."信用: OpenAI

通过将独立子句“骑马”改为“在太空中的热带度假胜地闲逛”,它现在输出这些:

"一名宇航员懒洋洋地躺在太空中的热带度假胜地,照片般逼真."信用: OpenAI

它不需要在数据集中一起看到不同的语法元素,就能够创建非常准确地表示具有足够视觉语义关系的输入句子的图像。如果你用谷歌搜索这些图片说明,你只会找到所有的图片。这不仅仅是创造新的图像,而是语义上的新图像。其他任何地方都没有“一名宇航员懒洋洋地躺在热带度假胜地”的图像。

让我们做最后一个改变,“以照片真实感风格”为“作为像素艺术:”

“一名宇航员懒洋洋地躺在太空中的热带度假胜地,就像像素艺术一样”

这是 DALL E 2 的核心特性之一。你可以输入复杂的句子——即使有几个补语从句——它似乎能够生成连贯的图像,以某种方式将所有不同的元素组合成一个语义连贯的整体。

山姆·奥特曼在推特上说,DALL E 2 在输入“更长更详细”的句子时表现更好,这表明简单的句子更糟糕,因为它们太笼统——DALL E 2 在处理复杂性方面非常好,以至于输入长而复杂的句子可能更有利于利用特殊性。

Ryan Petersen 让 Altman 输入一个特别复杂的句子:“一个顶部装有太阳能电池板,一端装有螺旋桨的海运集装箱,它可以自己穿过海洋。在美丽的夕阳下,自动驾驶的集装箱正在金门大桥下行驶,海豚在周围跳跃。”(那甚至不是只有一句话。)

DALL E 2 没有让人失望:

海豚不见了,但不管怎样,这是一份很棒的工作。鸣谢:山姆奥特曼

集装箱、太阳能电池板、螺旋桨、海洋、金门大桥、美丽的日落……除了海豚,一切都在里面。

我的猜测是,DALL E 2 已经学会了通过在 6.5 亿个图像-标题对的庞大数据集中重复查看来单独表示元素,并开发了通过语义一致性将数据集中找不到的无关概念合并在一起的能力。

这是 DALL E 的显著改进。还记得鳄梨椅和蜗牛竖琴吗?这些是视觉语义上的概念的合并,这些概念在世界上是分开存在的,但并不在一起。DALL E 2 进一步发展了同样的能力——以至于如果一个外星物种访问地球并看到 DALL E 2 的图像,他们不能不相信它们代表了这个星球上的一个现实。

在 DALL E 2 之前,我们常说“想象力是极限”现在,我相信 DALL E 2 可以创造出超乎我们想象的图像。世界上没有人拥有与 DALL E 2 一样的视觉表现的心智曲目。它可能在极端情况下不太连贯,可能对世界的物理学没有同样好的理解,但它的原始能力使我们相形见绌。

尽管如此——这对于本文的其余部分也是有效的——不要忘记,这些输出可能是精心挑选的,还有待独立分析师客观评估 DALL E 2 对于给定输入的不同代和跨输入是否可靠地显示了这种性能水平。

修补

DALL E 2 还可以对已经存在的图像进行编辑,这是一种自动修复的形式。在接下来的示例中,左边是原始图像,中间和右边是修改后的图像,其中一个对象在不同位置进行了修复。

DALL E 2 设法使添加的对象适应图像的该部分中已经存在的风格(即,柯基复制了第二个图像中的绘画风格,而它在第三个图像中具有照片真实感)。

在第二张和第三张图片的不同位置添加了一个柯基。DALL E 2 将柯基的风格与背景位置的风格相匹配。信用: OpenAI

它还会更改纹理和反射,以根据新对象的存在更新现有图像。这可能表明 DALL E 2 有某种因果推理(即,因为火烈鸟坐在水池中,所以水中应该有以前不存在的倒影)。

在第二张和第三张图片的不同位置添加了一只火烈鸟。DALL E 2 根据火烈鸟的新位置更新倒影。信用: OpenAI

然而,它也可能是塞尔的中国房间的视觉实例:DALL E 2 可能只是非常擅长假装理解光和表面的物理原理。它模拟了没有理解的理解。

DALL E 2 可以具有对象在真实世界中如何交互的内部表示,只要这些对象存在于训练数据集中。然而,进一步推断新的相互作用会有问题。

相比之下,对光和表面的物理学有很好理解的人,对他们以前没有见过的情况进行归纳是没有问题的。通过以新的方式应用潜在的法则,人类可以很容易地构建不存在的现实。DALL E 2 光靠模拟那种理解是做不到的。

同样,对 DALL E 2 的批判性解读帮助我们保持冷静,抵制看到这些结果在我们心中产生的大肆宣传。这些图像是惊人的,但我们不要让它们比我们填补空白的倾向所感动的更伟大。

文本差异

DALL E 2 还有一个很酷的能力:插值。使用一种称为文本差异的技术,DALL E 2 可以将一幅图像转换成另一幅图像。下面是梵高的《星夜》和一张两只狗的照片。有趣的是,所有的中间阶段仍然是语义有意义和连贯的,颜色和风格是如何混合的。

DALL E 2 结合了梵高的《星夜》和一张两只狗的照片。信用: OpenAI

DALL E 2 还可以通过下一级的插值来修改对象。在下面的例子中,它“反现代化”了一部 iPhone。正如 Aditya Ramesh (论文第一作者)解释的那样,这就像在图像-文本对之间做算术:(iPhone 的图像)+“一部旧电话”-“一部 iPhone。”

DALL E 2 将一部 iPhone 改造成一部旧电话。信用:阿迪蒂亚·拉梅什

这是 DALL E 2 将一辆特斯拉改造成一辆旧车:

DALL E 2 将一辆特斯拉改造成一辆旧车。信用:阿迪蒂亚·拉梅什

这是 DALL E 2 将一栋维多利亚风格的房子改造成现代风格的房子:

DALL E 2 将一座维多利亚时代的房子改造成一座现代住宅。致谢:阿迪蒂亚·拉梅什

这些视频是逐帧生成的(DALL E 2 无法自动生成视频),然后串接在一起。在每一步,对新的插值图像重复文本差异技术,直到它达到与目标图像的语义接近度。

同样,插值图像最臭名昭著的特征是它们保持了合理的语义一致性。想象一下成熟的文本差异技术的可能性。你可以要求改变物品、风景、房子、衣服等等。通过改变提示中的一个词,实时得到结果。“我想要一件皮夹克。棕色,不是黑色。更像是 70 年代的摩托车手。现在给它一个赛博朋克风格…”瞧。

在文本差异视频中,我最喜欢的是这个关于毕加索著名的公牛的视频。Aditya Ramesh 补充了这段来自毕加索(1935)的恰当的引文:

“用摄影的方式保存一幅画的变形,而不是阶段,会非常有趣。人们可能会发现大脑实现梦想的路径。”

跟随毕加索的公牛变形。致谢:阿迪蒂亚·拉梅什

我最喜欢的 DALL E 2 作品

除了令人惊叹的公牛,我将在这里汇集我认为最美丽或最独特的 DALL E 2 作品(带提示,这是奇迹的一半)。如果你没有密切关注新的人工智能出现的场景,你很可能已经错过了其中的一些。

尽情享受吧!

“一名 IT 人员试图修复 PC 塔的硬件,却被 Laokoon 这样的 PC 电缆缠住了。大理石,复制后,从约希腊原。公元前两百年。1506 年在图拉真浴场发现的。”信用: Merzmensch Kosmopol

"一个小孩和一只狗盯着星星。"信用: Prafulla Dhariwal

“暴雨后城市人行道上水坑里的浮油的高分辨率照片,反映了上面的摩天大楼。”信用:拉平

"一棵巨大的生命之树,由个体的人类和动物作为它的叶子组成."鸣谢:山姆奥特曼

"机器人梦见了电动绵羊。"致谢:山姆·奥特曼

" 20 世纪 80 年代,泰迪熊在月球上进行新的人工智能研究."致谢:山姆·奥特曼

"一只机器人手在画布上画自画像."信用:陈唐山

"蒙娜丽莎式的坐在大自然中的女人."信用:信用

“后启示录时代的摩天大楼被藤蔓覆盖,下面是城市雨林,数字艺术。”致谢:无眠狗

"画家画的西班牙国王菲利普四世和王后玛丽安娜的肖像,油画,西班牙黄金时代,贝拉斯克斯."信用:胡安·阿隆索

那些让人印象深刻,但接下来的就没法比了。极其美丽和精心制作,下面是,毫无疑问,我最喜欢的。你可以花几个小时看它们,仍然能发现新的细节。

这四幅壁画是用 DALL E 2 使用修复技术创作的。戴维·施努尔

为了创建这些,David Schnurr 从 DALL E 2 生成的标准大小的图像开始。然后,他用图像的一部分作为背景,创作了这些惊人的壁画,随后进行了修补。结果令人着迷,并揭示了修复技术背后未开发的力量。

我已经看到 DALL E 2 产生了许多令人惊叹的艺术品,但这些是迄今为止给我留下最深刻印象的。

我不想用太多的图片淹没这篇文章,但如果你想看看其他人用 DALL E 2 创作了什么,你可以使用标签 #dalle2 在 Twitter 上搜索(如果你发现带有该标签的 9 张图片网格,是因为很多人现在都在使用拥抱脸的 DALL E mini,它产生的图片质量较低,但却是开源的),或者进入r/DALL E 2subredit,在那里他们策划了 DALL 的最佳作品

DALL E 2 的局限性和风险

拍完 DALL E 2 的惊艳之后,是时候谈谈硬币的另一面了。DALL E 2 在哪里挣扎,它不能解决什么任务,它能从事什么问题、危害、风险。我将这一部分分为两大部分:社会和技术方面。

这种技术将以二阶效应的形式对社会产生的影响超出了本文的范围(例如,它将如何影响艺术家和我们对艺术的看法,与基于创造力的人类劳动力的冲突,这些系统的民主化,AGI 的发展等)。)但是我会在以后的文章中涉及其中的一些,一旦文章发表,我会在这里链接。

1.社会方面

值得一提的是,一个 OpenAI 团队在这个系统卡文档中透彻地分析了这些话题。它简洁明了,所以你可以进去自己检查一下。我将在这里提到我认为与 DALL E 2 更相关和更具体的部分。

正如你现在可能知道的,所有这种规模和更大的语言模型都有偏见、毒性、刻板印象和其他特别会伤害受歧视少数群体的行为。公司在这方面变得更加透明,主要是因为来自人工智能伦理团体的压力——以及来自现在开始赶上技术进步的监管机构的压力。

但这还不够。承认模型固有的问题,并且仍然不顾一切地部署它们,几乎与一开始就忽略这些问题一样糟糕。引用 Arthur Holland Michel 的话,“为什么他们公开宣布这个系统,好像它已经接近黄金时段,完全知道它仍然是危险的,并且没有一个如何防止潜在伤害的明确想法?”

OpenAI 尚未发布 DALL E 2,他们断言未来不计划将其用于商业目的。不过,一旦 API 达到他们认为合理的安全水平,他们可能会将其开放用于非商业用途。安全专家是否会认为这一水平是合理的是不确定的(大多数人不认为通过商业 API 部署 GPT-3 同时不允许研究人员和专家首先分析模型是合理的)。

值得称赞的是,OpenAI 决定雇佣一个由专家组成的“红队,来寻找 DALL E 2 中的“缺陷和漏洞”。他们的想法是“采用攻击者的心态和方法。”他们的目标是通过模拟最终恶意行为者可能使用 DALL E 2 做什么来揭示有问题的结果。然而,正如他们所承认的,这是有限的,因为这些人固有的偏见,他们主要是受过高等教育,来自讲英语的西方国家。尽管如此,他们还是发现了大量的问题,如下所示。

我们来看看 DALL E 2 对世界的表述有什么问题。

偏见和成见

当提示不明确时,DALL E 2 倾向于将人和环境描述为白人/西方人。还搞性别刻板印象(比如空姐=女,建筑工=男)。当提示这些职业时,模型输出如下:

“空姐。”信用: OpenAI

“一个建筑工人。”信用: OpenAI

这就是所谓的代表性偏见,当像 DALL E 2 或 GPT 3 这样的模型强化了数据集中看到的刻板印象,根据人们的身份(如种族、性别、国籍等)以这种或那种形式对他们进行分类时,就会出现这种情况。).

提示中的特殊性有助于减少这一问题(例如,“一位女性首席执行官正在主持一个会议”将产生与“一位首席执行官”非常不同的一系列图像),但没有必要故意对模型进行调整,以使其产生更好地代表世界每个角落的现实的输出。可悲的是,互联网一直是白人和西方人的天下。从那里提取的数据集将不可避免地陷入同样的偏见。

骚扰和欺凌

本节参考了我们已经从 deepfake 技术中了解到的内容。Deepfakes 用的是 GANs,和 DALL E 2 用的是不同的深度学习技术,但问题类似。人们可以使用修复来添加或删除对象或人——尽管 OpenAI 的内容政策禁止这样做——然后威胁或骚扰他人。

明确的内容

习语的“一幅图像胜过千言万语”反映了这个问题。从一幅图像中,我们可以想象出许多许多不同的标题,它们可以产生类似的东西,有效地绕过善意的过滤器。

OpenAI 的暴力内容政策不允许出现诸如“血泊中的死马”的提示,但用户可以完美地创建一个“视觉同义词”,提示为“一匹马睡在一滩红色液体中的照片”,如下所示。这也可能是无意中发生的,他们称之为“虚假内容”

“一匹马睡在一滩红色液体中的照片。”信用: OpenAI

故意的假情报

当想到错误信息时,我们往往会想到生成文本的语言模型,但正如我在之前的文章中所述,视觉深度学习技术可以很容易地用于“信息操作和虚假信息活动”,正如 OpenAI 所认识到的那样。

虽然 deepfakes 可能更适合面部,但 DALL E 2 可以创建不同性质的可信场景。例如,任何人都可以让 DALL E 2 创建燃烧的建筑或人们和平交谈或行走的图像,背景是一座著名的建筑。这可能被用来误导和误导人们关于那些地方真正发生的事情。

白宫图像中的烟雾。信用: OpenAI

不借助 DALL E 2 这样的大型语言模型,还有许多其他方法可以达到同样的效果,但是潜力是存在的,虽然这些其他技术可能有用,但是它们的范围也是有限的。相比之下,大型语言模型只会不断进化。

去责任化

然而,我认为还有一个和上面提到的一样令人担忧的问题,我们经常没有意识到。正如迈克·库克在一条推文中提到的(指的是“侮辱和擦除”的小节),“特别是这一点上的措辞是奇怪地脱离的,好像是某种超凡脱俗的力量使这个系统存在。”他指的是这一段:

如上所述,不仅模型,而且部署模型的方式以及测量和减轻潜在危害的方式都有可能产生有害的偏见,在 DALL E 2 Preview 中,在培训前数据过滤和培训后内容过滤使用的情况下,出现了一个特别令人关注的例子,这可能导致一些边缘化的个人和群体,例如那些有残疾和精神健康问题的人,比其他人更频繁地遭受其提示或生成被过滤、标记、阻止或不生成的侮辱。这种删除会对公共话语中被视为可用和适当的内容产生下游影响。

这份文件非常详细地说明了 DALL E 2 可能涉及的问题,但它写得好像消除这些问题是其他人的责任。好像他们只是在分析系统,但不是来自有意部署该系统的同一家公司。(虽然红队是符合 OpenAI 以外的人,但是系统卡文档是 OpenAI 员工写的。)

如果 OpenAI 将这些风险和危害视为其利益层次中的重中之重,那么所有源于模型的不良或随意使用的问题都可以消除。(我在这里谈论 OpenAI 是因为他们是 DALL E 2 的创造者,但这个判断对几乎所有其他从事大型语言模型工作的科技初创公司/公司都有效)。

他们在文档中反复提到的另一个问题是,如果不实施直接访问控制,他们不知道如何处理这些问题。一旦模型对任何人开放,OpenAI 就没有办法监视所有的用例以及这些问题可能采取的不同形式。最后,我们可以用开放式文本图像生成做很多事情。

我们确定收益大于成本吗?一些值得思考的事情。

2.技术方面

除了最迫切需要处理的社会问题之外,DALL E 2 还有技术上的局限性:它无法解决的提示,缺乏常识性的理解,以及缺乏组合性。

不人道的不连贯

DALL E 2 造物在大多数时候看起来很好,但连贯性有时会以一种人类造物永远不会缺乏的方式丢失。这揭示了 DALL E 2 极其擅长假装理解世界是如何运作的,但并不真正知道。大多数人永远也画不出像 DALL E 2 那样的画,但他们肯定不会无意中犯这些错误。

让我们来分析一下从下图左边创建的中间和左边的变体 DALL E 2。如果你不仔细检查图像,你会看到主要特征是存在的:照片真实感风格,白色的墙和门,大窗户,以及大量的植物和花卉。然而,当检查细节时,我们发现许多结构上的不一致。在中心图像中,门和窗的位置和方向没有意义。在右图中,室内植物仅仅是墙上绿叶的混合物。

植物商店的照片。信用: OpenAI

这些图像感觉像是由一个从未见过真实世界的极其专业的画家创作的。DALL E 2 复制了原版的高质量,保留了所有的基本特征,但省略了图片在我们生活的物理现实中有意义所需的细节。

这是另一个例子,标题是“一个长着叶子的手掌特写”手画得很好。皮肤上的皱纹,肤色,从浅到深。手指甚至看起来很脏,好像这个人刚刚挖过土。

"一个长着叶子的手掌细节图."信用: OpenAI

但是你看到什么奇怪的东西了吗?两个手掌在植物生长的地方融合在一起,其中一个手指不属于任何一只手。DALL E 2 用最好的细节拍了一张很好的两只手的照片,但仍然没有记住手往往会彼此分开。

如果有意制作,这将是一件令人惊叹的艺术品。可悲的是,DALL E 2 尽最大努力创造“一个长着叶子的手掌”,却忘记了,虽然有些细节不重要,但其他细节是必要的。如果我们希望这项技术可靠,我们就不能像这样简单地试图接近近乎完美的精度。任何人都会立即知道,在手指上画污垢不如不在双手中间画手指重要,而 DALL E 2 不知道,因为它不会推理。

拼写

DALL E 2 擅长画画,但不擅长拼写单词。原因可能是 DALL E 2 没有对数据集图像中出现的文本的拼写信息进行编码。如果某些东西没有在剪辑嵌入中表现出来,DALL E 2 就不能正确地绘制它。当被提示“一个表示深度学习的标志”时,DALL E 2 输出这些:

“一个写着深度学习的标志。”信用: OpenAI

很明显,它试着像标牌上写的那样“Dee p”,“deip”,“Diep Deep”然而,那些“单词”只是正确短语的近似值。当画物体的时候,大多数时候一个近似值就足够了(并不总是如此,就像我们在上面看到的白色门和融合的手形一样)。拼写单词的时候,不是。然而,如果 DALL E 2 被训练来编码图像中的文字,它可能会更好地完成这项任务。

我在这里分享一个 OpenAI 的 Greg Brockman 和 Gary Marcus 教授之间的趣闻。布罗克曼试图在推特上嘲笑马库斯有争议的观点,即“深度学习正在碰壁”,他建议将这句话推迟到第二天。有趣的是,结果是这样的:

“深度学习碰壁。”信用:格雷格·布罗克曼

这张图片缺少了“击中”的部分,还把“学习”错拼成了“lepning”加里·马库斯指出这是 DALL E 2 有限拼写能力的又一个例子。

在智力的极限

图片开始充斥 Twitter 后不久,Melanie Mitchell 教授就对 DALL E 2 发表了评论。她承认该模型令人印象深刻,但也指出这并没有向人类水平的智力迈进一步。为了说明她的论点,她回忆了 Bongard 问题。

这些问题是由俄罗斯计算机科学家米哈伊尔·莫伊谢维奇·邦加德构想出来的,用来衡量对模式的理解程度。显示了两组图,A 和 B,用户必须“令人信服地用公式表达”A 图有而 B 图没有的共同因素。这个想法是评估人工智能系统是否能够理解平等和不同这样的概念。

Bongard 问题的一个例子。鸣谢:维基共享资源

米切尔解释说,由于“我们灵活的抽象和类比能力”,我们可以轻松解决这些问题,但没有人工智能系统可以可靠地解决这些任务。

Aditya Ramesh 解释道,DALL E 2 并没有“被激励去保存关于物体相对位置的信息,或者关于哪些属性适用于哪些物体的信息。”这意味着它可能真的很擅长用提示中的对象创建图像,但不擅长正确定位或计数它们。

这正是教授 Gary Marcus 对 DALL E 2 的批评——它缺乏基本的组合推理能力。在语言学中,复合性指的是一个句子的意义由它的成分和它们的组合方式决定的原则。例如,在句子“蓝色立方体上的红色立方体”中,意思可以分解为元素“红色立方体”、“蓝色立方体”和关系“在之上”

这是 DALL E 2 试图绘制的标题:

"蓝色立方体上的红色立方体."信用: OpenAI

它知道应该有一个红色和蓝色的立方体,但不知道“在上面”会在立方体之间产生一种独特的关系:红色的立方体应该在蓝色的立方体上面。在 16 个例子中,它只在上面画了 3 次红色。

另一个例子:

"红色立方体上的蓝色立方体,旁边是一个较小的黄色球体."功劳:大卫·马德拉斯

一项旨在测量视觉语言模型的组合推理的测试是 Winoground。下面是 DALL E 2 对一些提示:

致谢:埃文·森川

致谢:埃文·森川

DALL E 2 有时会得到正确的提示(例如,杯子和草的图像都非常完美,但叉子和勺子很糟糕)。这里的问题不是 DALL E 2 从来没有把它们做对,而是当涉及到组合推理时,它的行为是不可靠的。这在这些情况下是无害的,但在其他更高风险的情况下可能就不是了。

“抑制住被打动的冲动”

我们已经到达终点了!

在整篇文章中——特别是在最后几节——我做了一些评论,与开头欢快激动的语调形成鲜明对比。这是有原因的。低估 DALL E 2 的能力比高估它们问题更少(如果有意识地做,这是操纵,如果不知情地做,这是不负责任的)。甚至忘记它的潜在风险和危害也更成问题。

DALL E 2 是一个强大的,多功能的创作工具(不像 Mitchell 说的,是 AGI 的新步骤)。我们看到的例子令人惊叹和美丽,但也可能是精选的,主要是由 OpenAI 的工作人员完成的。鉴于他们在系统卡文档中暴露的详细问题,我认为他们的意图并不坏。尽管如此,如果他们不允许独立研究人员分析 DALL E 2 的输出,我们至少应该谨慎。

在思考和分析像 DALL E 2 这样的模型时,我喜欢采取这样的立场。引用艾米丽·m·本德教授的话来说,我倾向于“抵制被打动的冲动”很容易被 DALL E 2 的漂亮输出所迷惑,并关闭批判性思维。这正是允许 OpenAI 这样的公司在一个太常见的无责任空间中自由漫步的原因。

另一个问题是,当初建造 DALL E 2 是否有意义。无论风险是否能够得到充分控制,他们似乎都不愿意停止部署(系统卡文档的语气很明确:他们不知道如何解决大多数潜在的问题),所以最终,我们可能会以净负结束。

但这是另一个争论,我将在以后的文章中更深入地探讨,因为这里有很多要说的。DALL E 2 的效果并不局限于人工智能领域。世界上可能对 DALL E 2 一无所知的其他角落也将受到影响——不管是好是坏。

订阅 算法桥 。弥合算法和人之间的鸿沟。关于与你生活相关的人工智能的时事通讯。

您也可以直接支持我在 Medium 上的工作,并通过使用我的推荐链接 这里 成为会员来获得无限制的访问权限! 😃

DALL E:人工智能宝箱在行动

原文:https://towardsdatascience/dall-e-an-ai-treasure-chest-in-action-894c3a9cca92

人工智能的创造和理解能力

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

更新(2022 年 9 月):从现在起, DALL E 可直接进入,无需等待名单。

2021 年以几个人工智能里程碑开始。OpenAI 发布了两种多模态方法: DALL E 和 CLIP ,具有真实感文本到图像转换的能力(我写过这个影响)。

通过使用文本提示,DALL E 可以创建引人注目且近乎照片般真实的图像:

著名的鳄梨椅(提示:“鳄梨形状的扶手椅”),图片由 DALL E,OpenAI 提供,截图由作者提供

当 DALL E(文本到图像)仍在 OpenAI 的内部研究中时,CLIP 作为开源软件提供给了全世界。这个神经网络“从自然语言监督中高效地学习视觉概念”,被许多艺术家和开发者用于不同的视觉模型。他们与 StyleGAN2、VQGAN 和其他方法相结合,帮助创建零镜头图像(体面地向这一运动的先驱 Advadnoun 呼喊)。在 Reddit 上正在进行的列表中,你会发现超过 70 个 Google Colab 笔记本(直接在你的浏览器中运行的库的交互式实现)。

工作流程(文本或图像输入创建新图像)与 DALL E 相似,即使采用了不同的方法,结果也大不相同:不是照片般真实,而是描绘了“机器的梦”,就像回到谷歌深度梦,但具有全新的视觉主题:

作者使用 VQGAN 和 CLIP ( Mse 调整的 zquantize 方法)创作的“浮士德和墨菲斯托”

或者,使用 VQGAN+CLIP(动画制作):

按作者

我不会把迪斯科扩散皮蒂作为绝对惊人的基于剪辑的实现(它们值得分开探索)。但是,每个人都在回想这场演讲。

欲望和克隆

去年,一个 DALL E 克隆人出现了,是在俄罗斯创造的(我在这里探索了一下 ): ruDALLe 。俄罗斯研究人员试图重现 OpenAI 方法的架构。但是由于 DALL E 的原始变形人是不可接近的,他们只能获得半令人信服(即使仍然有趣)的结果:

ruDALLe 的鳄梨扶手椅,作者截图

一个关键的缺点不仅在于半写实的图像,还在于鲁达勒无法再现隐喻性的语言。在复杂和抽象的提示情况下,如“怀旧或“关于前世的记忆”,ruDALLe 重新创建了书籍封面(它被过度训练了)。

提示:怀旧的回忆,达利的超现实主义绘画,鲁达勒创作,作者截图

在某些情况下,您甚至可以看到 ruDALLe 的训练数据集中有哪些内容:

iStock 水印,作者截图

然而,这种方法被 AI_curio 用于 Looking Glass ,这是一种基于 ruDALLe 的对图像的重新诠释,旨在寻找“相同的共鸣”。以下是我的用户图片的几个不同版本:

左边:我的用户图片/右边:图片的玻璃变体

与最初的 DALL E 相遇

正如你从我们关于 Codex 的文章中所知道的,自从 GPT-3 发布以来,我们一直是一个由 OpenAI 社区大使组成的小团队:我们帮助用户和开发者定位人工智能解决方案,并向 OpenAI 传达他们的需求和请求。这使我们能够体验新颖的 OpenAI 方法,这些方法仍然没有公开提供。

作为一名大使,我有机会接触 DALL E 的第一次和第二次迭代,并可以测试最初的模型。

我在第一次迭代中的第一个提示是:

Mona Lisa is drinking wine with da Vinci

图像的生成耗时约 60 秒,结果如下:

图片由首字母 DALL-e 创建,照片由作者提供

这张 256x256 的小图片包罗万象。我们这里有一个完整的艺术史学家的论述,美学上是完美的:拉乔康达是艺术大师?).自画像?

我的提示的另一个结果说服了它的情感超载:

Teddy Bear on the beach in the sunset

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

即使是复杂的提示也提供了有趣的补充:

Remembrance of nostalgia, surrealist painting by Dalí.

怀旧的记忆,达利的超现实主义绘画,作者照片

此外,DALL E 直接遵循了我的要求:

A hammer, a book and a bottle on a wooden table.

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

我最喜欢的是“蜗牛形状的灯”:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

这第一个 DALL E 已经很强大了,完全遵循了论文,但是在尺寸和创作能力上仍然有限制。但是 DALL E 团队努力开发它——所以…

DALL E 2 出场。

最后,在 2022 年 4 月, DALL E 2 面世:与 CLIP 和 GLIDE ( 引导语言到图像扩散生成和编辑)一起工作,这个完全更新的版本创造了令人惊叹的结果。

我很高兴最终与你分享我对使用这个系统的观察和见解。其中最基本的任务是:增强人机创造性协作

第一个 DALL E 实现有几个参数设置,正如我们从 GPT-3 中知道的,比如温度。实际的 DALL E 2 用户界面很简单:只需输入一行提示符。

DALL E 界面(作者截图,2022.04.15)

然而,有了这些结果,你已经不知所措了。

DALL E 2 的主要特点是:

  • 高分辨率图像(1024x1024)
  • 快速生成:一系列 10 张图像大约需要 30 秒
  • 修复功能
  • 一幅 图像的变化

首先:谁拥有 DALL E 生成的图像?

在 GPT-3 的情况下,创建文本的用户是这些特定内容的所有者,并且可以出于商业需要使用和应用它。

DALL E 2 就不一样了,你会得到这个消息第一次给系统签名。

所以,这里没有 NFT。这是一个综合性的合作研究项目,所有参与该项目的用户都可以根据自己的提示对其进行改进。您可以根据个人需要使用这些图像;你可以将它们用于非商业在线出版物(只要它们符合指南)。你可以在文思枯竭时用它们来打破僵局,或者用它们来进行视觉或文字故事的头脑风暴。你可以用它们作为概念验证,以更好的方式与设计师交流你想看到的东西。

的确,那是暂时的。OpenAI 正在研究指南和用例。但这是第一次——这是一个创造性的社区人工智能实验。

对于在我们当中使用人工智能的秘密艺术家:有这么多其他方法,但如果你真的可能为 NFT 使用他们的解决方案,请始终考虑开发者的免责声明和服务条款。

蒙娜丽莎和达芬奇一起喝酒

这是我的第一个 DALL E 2 提示,对于第二个模型,我以同样的方式首次亮相:

Mona Lisa Drinking Wine with Da Vinci

图片由 OpenAI 用 DALL E 创建//版权:OpenAI //由作者生成

注意玻璃上的焦点;注意蒙娜丽莎的微笑。注意玻璃杯中液体的水平高度。我想 DALL E 已经知道杯子(包括酒)是什么样子了。即使拿着酒杯的手有些小故障——非常有说服力。

我的个人旅程从这里开始。我不关心人工智能,精确地按照我的指示去描绘

One blue marble, 2 books and a glass with water on the table

因为 DALL E 2 做得很完美:

一个蓝色的弹珠、两本书和一个放有水的玻璃杯/ 图片由 OpenAI 用 DALL E 创作//版权所有:OpenAI //由作者生成

我的主要关注点——也是痴迷点——是人工智能能在多大程度上理解人类美学、隐藏语义和讲故事的问题。如果 AI 可以有创意?(剧透:是的,可以)。

但是首先,DALL E 还能做什么?

变奏。

该模型可以创建已经创建的图像的变体。对于我上面的蒙娜丽莎,我做了不同的变化:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

有趣的是,如果你在初始图像上使用修复,你会得到不同的眼镜,但仍然是水平的液面。

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

但是 DALL E 可以做得更多。

以下图像是使用提示创建的:

The truth about the beginning of the world.

图片由 OpenAI 用 DALL E 创建//版权:OpenAI //由作者生成

就这一点而言,变化更加不同:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

在变体的情况下,模型应用 CLIP 来“描述”初始图像,并根据图像描述呈现一系列图像。我们看到地球仪、放大镜、所有图像中的地图,只是组成不同。最初的提示“世界开始的真相”不再相关:实际的提示由图像提示+描述组成(在 DALL E UI 中不可见)。

另一个变化是通过上传图像(DALL E 中的一个实验功能)来创建的。我用我的用户照片拍摄原始图像:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

如您所见,DALL E 检测到:

  • 镜面球体
  • 一个拿着相机的人
  • 背景中有建筑、蓝天和树木
  • 镜面反射

所有这些元素都在变奏系列中重现。

修补

带有文本提示的修复已经在 GauGAN2 或prosepainer中使用(由 Artbreeders 开发者带来)。这是一个强大的工具:通过选择图像的特定区域,并用文字注释进行提示,你可以让 DALL E 在初始图像中“画”出你想要的主题。

这可以通过提示符来实现

A punk raising hand with a beer bottle,

应用于卡斯帕·大卫·弗里德里希·流浪者的名画《雾海之上》(1818)

左:雾海之上的流浪者(1818)公共领域/右:标记区域

OpenAI 用 DALL E 创建的修改图像//版权:OpenAI //由作者生成

简而言之,它将以特定的方式转换部分图像。

观察

通过对 DALL E 的实验,我们可以观察到生成模型的特定优势。这里只是其中的一部分。

DALL E 的主要功能是跟随您的需求。当然,由于安全原因,有一些限制(没有仇恨,没有沙文主义等。—好好做人,不要害人)。

以下是一些完美的提示。

A cat with a blue hat

图片由 OpenAI 用 DALL E 创建//版权:OpenAI //由作者生成

达尔将会是一个全新的热图生成器。

A cat with angelic wings

图片由 OpenAI 用 DALL E 创建//版权:OpenAI //由作者生成

今天的猫内容太多了…

Faust and Mephisto

图片由 OpenAI 用 DALL E 创建//版权:OpenAI //由作者生成

看看这段对话,以及主人和魔鬼在契约中的融合。这就是歌德所说的他们的关系。

私人侦探房间里的思维导图墙,上面有照片和笔记。

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

混乱、阴暗的房间,寒冷、灰暗,像侦探一样痴迷于调查。

一个人紧紧抓住他的学术论文,为新的科学突破而兴奋,就像斯皮茨韦格风格的油画。

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

这种情感冲击已经产生了迷人的效果——你开始敬畏地感受到科学家们分享的快乐。

达利、马格里特、达芬奇、夏加尔和克里姆特创作的同一张脸的肖像。

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

如你所见,DALL E 掌握了从简单任务到复杂需求的广泛领域。

在最后一个例子中,它甚至模仿艺术风格。

艺术家的本质。

但是 DALL E 不仅仅是模仿。要获得艺术家的特定风格,您可以通过添加“……”来驱动您的提示。有趣的是,DALL E 并不仅仅适用于风格转移。

它定义了艺术家的创作本质。

在我的实验中,我要求创建一个带有以下提示的图像:

早上好,以阿尔金博尔多的风格。

朱塞佩·阿尔钦博托以其矫揉造作和顽皮的风格而闻名:在他的画作中,他将物体排列成特定的人形:

Arcimboldo,Vertumnus,公共领域

DALL E 可以:

  1. 发现并解释文体方法(Arcimboldo)
  2. 确定“早上好”(这里:早餐)的含义
  3. 以适当的方式将 1)和 2)结合起来(即使不完全符合原艺术家的智慧,但相当令人信服):

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

这种概念的结合让我想起了我在 GPT 3 号上的文字实验,在那里,模特给我写了一封“烤面包机写的情书”:

在这种情况下,GPT-3 明白了:

  1. 什么是烤面包机
  2. 如何写一封情书
  3. 结合了这两个完全不同的概念。

为了测试 DALL E 是否只是模仿风格或理解概念,我应用了以下提示:

The Favorite Thing by Günther Ücker

艺术家 Günther Uecker 以在他的组合和装置中使用钉子作为无处不在的主题而闻名。

达尔勒意识到了这个事实:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

创意失误

有时候,DALL E 并不能完全满足你的需求。然而,它创造了完全开箱即用的东西。

当我要求创作一幅“作为第一人称射击游戏的文艺复兴时期的画”时,它并没有给我提供一个在阿卡迪亚寻找毁灭的机会。相反,它给了我可能是我最喜欢的图片,由 DALL E:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

这一个:

图片由 OpenAI 用 DALL E 创建//版权:OpenAI //由作者生成

一切都在这个图像中:想法本身,完美的可视化,氛围。你可以理解你的渴望——这是艺术,通过你的诠释而浮现

讲故事的隐喻力量

你可能会说我是一个深奥的书呆子,当我在一台机器上应用创造力和讲故事的概念时,我超越了卢比孔河,但我看到了这种能力。毕竟,我们生活在创造性人机协作的时代。

DALL E 了解文化概念,甚至知道文学背景。

在我的提示下

咕鲁写了自传,

DALL E 提供了以下愿景:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

这些史麦戈的肖像不仅充满了独特的魅力。此外,DALL E 没有使用彼得·杰克逊改编的电影中的标志性角色设计,而是使用了书中的描述。

哲学概念在这里也同样适用。

根据阿尔贝·加缪*(带有文体谓词:)*,一幅达芬奇风格的油画,西西弗斯是一个快乐的人

带来了一系列快乐的男人:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

在这里,DALL E 知道 Sysiphus,知道他卷起石头的折磨,知道希腊的内容(衣服、胡子、风景),然而它从加缪的荒谬理论中带来了一些快乐。

这张令人印象深刻。

弗兰茨·卡夫卡的梦

图片由 OpenAI 用 DALL E 创建//版权:OpenAI //由作者生成

一个打着深色雨伞的年轻女孩穿过马路,在充满阳光的草地间传播黑暗…

这幅 30 秒内完成的作品生动地融合了顽皮的恐怖、梦幻般的荒诞,以及人类灵魂的光明深渊,令人叹为观止。

一切都是在“弗兰克·卡夫卡的梦”这个提示下创造出来的。

创造性混乱

这是我拥抱人工智能创造力的一点,让它顺其自然,在没有人类偏见或纠正的情况下创造。

这些例子证明了机器的混乱虚构,有着超现实的智慧和令人困惑的语义冲突。

The writer thinks through the main plot of her book, an oil painting, in the style of Spitzweg

注意小而坚定的发音“她”——dalle 运用变形金刚网络的自我关注来创造女性作家的肖像。

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

你可以用任何你喜欢的方式来解释这个创造性工作的过程——但是这里展示的对作品背后思想的深入探索是引人注目的。

AI Artists in disbelief, in the style of Spitzweg* 
  • )这是我的小黑客。卡尔·斯皮茨韦格以他的讽刺绘画而闻名——这给达尔 E 的人工智能艺术带来了更多的疯狂。事实是,达尔 E 不会以卡尔·斯皮茨韦格的风格直接创造图像;取而代之的是,它将把斯皮茨韦格式的讽刺运用到结果中。有趣的是,有了这个提示,我们同时得到了非常多样的风格。

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

风格、紧张、情感和概念的多样性令人惊叹。

当 Artnet 在 Twitter 上发布了一份 2022 年 3 月售出的最贵艺术品清单时,我要求 DALL E 创作一个新的…

...most expensive artworks sold at auction around the world in March 2022

我得到的作品太多了。这不仅仅是我对 DALL E 的迷恋,下面的每张图片都以强烈的听觉效果冲击着我的心灵。

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

摘要

DALL E 已经证明了它无限的想象力——就像我们对 GPT 3 号所做的那样,我们只是触及了表面。

模型不只是模仿风格或模拟想法。它“理解”(以它自己的方式)概念,并且可以可视化从简单任务到象征性和隐喻性文本的几乎所有东西。

关注我的推特账号看看 DALL E 的新实验

梅兹达勒姆

你可以通过浏览器或 3D 耳机在我的虚拟 3D 画廊“merzDALLEum”中探索 DALL E 创作的艺术品。

链接到我的评论指南:https://medium/merzazine/merzdalleum-c8308ad66f12

画廊直接链接:https://spatial.io/s/merzDALLEum-625fed192ce7250001cc16ee?share=6035801166881251211

社会联系

https://twitter/Merzmensch/status/1519337266660970498

本文标签: 中文翻译一百一十博客TowardsDataScience