TowardsDataScience 博客中文翻译 2021(三百零六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Fuzzywuzzy:合并不同转录名称的数据集

原文:https://towardsdatascience.com/fuzzywuzzy-basica-and-merging-datasets-on-names-with-different-transcriptions-e2bb6e179fbf?source=collection_archive---------13-----------------------

使用词向量距离比较字符串相似度的模糊匹配

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

安娜斯塔西娅·切平斯卡在 Unsplash 上拍摄的照片

我最近做了一个项目,涉及到合并同一个人的姓名的数据集,这些姓名的转录略有不同。一些名字拼写错误,包括昵称、中间名或后缀,它们在数据集之间不匹配。在本例中,我使用了一个字符串匹配包 Fuzzywuzzy 来合并正确的名称。

为了省去你很多我在合并前做的额外工作,我想解释一下你可以使用的 Fuzzywuzzy 的模块、方法和用途。

模糊的距离计算

Fuzzywuzzy 使用 Levenshtein distance 来计算距离,简单来说,它决定了需要对字符串中的每个字符进行多少次更改才能找到另一个单词。

例如,“dog”和“dogs”需要一个变化:添加“s”。而“dog”和“dig”也需要一个变化:替换一个字母。而将“start”改为“tarp”将会有两处改动:删除“s”并用“t”代替“p”。

在实现 one names 的计算时需要注意的一点是,在词根发生变化的情况下,将名字与昵称进行比较时会有困难。例如,“Bobby”和“Robert”需要大量的更改,可能会导致其他不相关的名称出现为更好的匹配。

模糊不清的模块和方法

Fuzzywuzzy 有两个模块:processfuzz

绒毛

返回字符串的相似率,在 0-100 之间,最基本、最精确的方法是fuzz.ratio()

  1. fuzz.partial_ratio()将一个字符串与较长字符串中长度相等的子字符串进行比较。例如:**fuzz.partial_ratio(‘Dogs’, ‘Dog’)**会有一个 100 的部分 _ 比率,但只会有一个 86**fuzz.ratio()**

2.fuzz.token_sort_ratio()不考虑顺序测量字符串,您可以从包含单词 sort 中猜到这一点。这在比较不同顺序的姓名时很有用,例如,比较、姓。

3.token_set_ratio(),你可以从.token_sort_ratio中猜到,把每一个令牌做一套来比较。重复的话不会影响比例。如果我们在歌名列表中查找歌曲,其中一首歌曲名为谁放出了狗,而我们想要匹配的歌曲名为谁放出了狗,谁,谁,谁,我们将获得 100 的比率分数。

过程

基于比率抓取最相似的单词。

  1. process.extract()process.extractOne()将从字符串列表中取出最相似的(extractOne)或 n 个最相似的(extract(limit = n))单词与你给定的字符串进行比较。

与 Fuzzywuzzy 的过程融合

在我的合并过程中的这一点上,我已经将我的一个数据集中的名称重新排序为与我的第二个数据集相同的顺序,所以我在我的过程中没有使用fuzz。现在我们知道,在未来的尝试中,我们不必这样做。

首先,安装您正在使用的软件包和模块。

*# pip install fuzzywuzzy* from fuzzywuzzy import process

为了合并名称,我在要合并的数据帧中创建了一组名称,称为names,并在第二个数据帧中创建了一组要比较的名称:member_names。然后我做了一个字典,里面有与names最接近的两个匹配项,这样我就可以手动检查分数,看名字匹配是否正确。

# *make a dictionary of closest matches to names* keys = {}**for** name **in** names: *#names in smaller dataset to compare and match**#get closest match of `name` compared to larger data `member_names`*keys[name] = ((process.extract(name, member_names, limit=2)))#*you can limit to 1 with extractOne to take less time but I wanted to check if names were returning as correct.*

下面是keys返回的前 5 行。

Robert J. Wittman [('J Cox', 86), ('Rob Wittman', 86)]
James R. Langevin [('James Risch', 86), ('James Comer', 86)]
Gerald E. Connolly [('Gerry Connolly', 75), ('J Cox', 54)]
Kathy Manning [('Kay Granger', 58), ('Kathy Castor', 56)]
Michael K. Simpson [('Mike Simpson', 86), ('Michael Waltz', 66)]

正如您所看到的,最匹配的名字并不完美,所以从这一点上,我过滤并检查了不匹配的名字。我查了比率低于或等于 86%的名字。

*#checking names that might not match correctly***for** name **in** keys:
    **if** keys[name][0][1] <= 86: * #this gives the second value in the first tuple, which is the score of the first name*

    print(name, keys[name])

此时,您可以将您的限制扩展到 2 个以上,因为我的一些匹配项的比率较低。找到正确的参数后,您可以为没有匹配项的名称创建一个列表,在不同的索引处有匹配项,并迭代字典值以创建一个合并关键字过滤列表中的名称,如果需要的话:

no_match = ['Michael Enzi', 'Kathy Manning', 'John Hickenlooper', 'William Hagerty', 'cott Franklin', 'Victoria Spartz',
           'Marjorie Taylor Greene', 'Marie Newman', 'eter Meijer', 'David Cheston Rouzer', 'Robert "Bobby" Scott']

second_match = ['Mitchell Mcconnell, Jr.', 'Harold Dallas Rogers', 'Neal Patrick Dunn MD, FACS']

下面,我提供了匹配代码的简化版本来生成 merge_keys:

# *getting list of the matches from the bigger dataset to the smaller one as keys to merge on*merge_key = [keys[name][1][0] **if**
                      name **in** second_match \
                      **else** **None** **if** name **in** no_match **else**
                      keys[name][0][0] **for** name **in \** df['name']]df[‘merge_key’] = merge_keydf.merge(second_df, how = ‘left’, left_on = ‘merge_key’, right_on=’member_names’)

现在你知道了!如果愿意,您可以覆盖任一数据集中的原始列,但是我希望保留原始数据集中的原始名称,以及我希望用于合并第二个数据集中的名称。

感谢阅读,我希望它是有帮助的!

你可以阅读更多关于 fuzzywuzzy 的内容,或者在这里下载。

模糊不清——之前和之后

原文:https://towardsdatascience.com/fuzzywuzzy-the-before-and-after-c3661ea62ef8?source=collection_archive---------45-----------------------

关于数据预处理,选择适当的模糊函数,并处理结果

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

娜塔莉·格兰杰在 unsplash 上拍摄的图片

在之前的文章中,我介绍了 FuzzyWuzzy 库,它为一对字符串计算 0-100 的匹配分数。不同的模糊不清的功能使我们能够选择一个最符合我们需要的。

然而,进行一个成功的项目不仅仅是计算分数。我们需要在开始处理数据之前清理数据,选择计算分数的最佳方法,学习如何不仅处理一对字符串,还处理数据表,并最终知道如何使用我们收到的分数来充分利用我们的结果。

所以,事不宜迟,让我们深入了解一些我们应该熟悉的最佳实践。

使用包含熊猫的表格来比较多个字符串

如前所述,FuzzyWuzzy 函数计算两个字符串的匹配分数。但是当处理“真实生活”的数据时,我们可能需要比较至少两组字符串。这意味着使用表格,或者用熊猫的术语来说——使用数据框架。

一个好的表格应该是这样的:

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

上表包含两个比较列,每个列都有一个相关的标题,其中要比较的字符串位于平行的行中。

给定这样一个数据集,我们可以使用相关函数将表读入数据帧。下面的例子直接从 CSV 读取,但是如果您对使用其他格式感兴趣,您可以查看下面的文档

>>> my_data_frame = pd.read_csv("**my_folder/my_file_name.csv"**)

数据预处理—在分析前清理数据

在我们选择 FuzzyWuzzy 函数并开始比较字符串之前,我们希望清理数据以确保我们的结果尽可能准确。

清理数据意味着删除不相关的字符串,从而提高函数的性能。

例如,假设我们比较两个地址的字符串,其中一个地址是“Joe Boulevard”,另一个是“Jule Boulevard”。匹配分数会相对较高,但大多是因为两个字符串中都存在“Boulevard”。删除它并重新计算将导致低得多的匹配分数:

>>> fuzz.ratio("**Joe Boulevard"**, "**Jule Boulevard"**)
89
>>> fuzz.ratio("**Joe"**, "**Jule"**)
57

数据所需的清理类型取决于您的域。我们看到了一个地址清理的例子。类似地,在比较电话号码时,我们可能会想要删除没有附加值的括号和破折号。还建议将所有字符串规范化为小写,因为一些 FuzzyWuzzy 函数将大写字母不同的字母视为不同的字符串。
所以,看看你的数据,决定什么应该被修改,以使其干净并准备好处理。

数据预处理——让我们来看看技术

现在,让我们用相关逻辑定义一个函数,并在数据帧中的每个相关列上迭代运行它。

**为了解释清楚,下面的示例已经过简化。为了获得最佳结果,建议使用正则表达式(regex ),这超出了本文的范围。请注意,当前形式的 strings_to_remove 可能会导致清理后的结果不完美。

>>> strings_to_remove = [" **ave "**, **" ave. "**, "**avenue"**,  " **lane "**, 
" **ln "**, "**blvd"**, "**boulevard"**, " **rd. "**, "**road"**, "**street"**, " **st. "**, 
**" str "**, **" dr. "**,  "**drive"**, **" apt "**, "**apartment"**, "**valley"**, "**city"**, **"."**, **","**]

>>> comparison_table = 
    comparison_table.astype(str).apply(lambda x: x.str.lower())>>> for current_string in strings_to_remove:
        comparison_table = comparison_table.astype(str).apply(
           lambda x: x.str.replace(current_string, **' '**))

>>> comparison_table = comparison_table.astype(str).apply(
      lambda x: x.str.replace(**' +'**, **' '**))

然后——瞧!

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

添加分数栏并进行比较

现在剩下的就是向数据帧添加一个名为“score”的空列,使用我们选择的 FuzzyWuzzy 函数
计算匹配的分数,并用这些分数填充数据帧。

这是一个如何做到这一点的例子

>>> comparison_table[**"score"**] = **""**>>> comparison_table[**'score'**] = 
comparison_table.apply(lambda row: 
fuzz.token_set_ratio(row[**'col_a_addresses'**], row[**'col_b_addresses'**]),axis=1)

让我们将结果与我们在未处理的数据帧上运行 FuzzyWuzzy 函数所得到的结果进行比较:

清洁前-

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

清洁后-

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

那么,清洗完数据后,实际发生了什么? 匹配分数变得更加准确——根据清洗情况增加或减少。

  • 让我们看看清洁后得分下降的第 3 行。
    在这种情况下——清理前两个地址都出现的单词“Lane”错误地增加了匹配分数。但是删除之后,我们发现地址并不相似。
  • 让我们看看第 9 行,清洁后得分增加了。
    而“巷”和“巷”有相同的意思,它们是大小写不同的不同字符串。
    清除噪声后,我们能够获得更好的分数,更准确地反映这些字符串之间的相似性水平。
  • 有趣的是,第 9 行中清理过的字符串并不相同。“85”只出现在 col_b_addresses 中,但匹配分数是 100。为什么?因为字符串“足够接近”而被算法确定为完全匹配。如果由人类来做,这个决定可能也是一样的。

简而言之,选择一个模糊的函数

选择最佳 FuzzyWuzzy 函数的一种方法是基于不同函数的逻辑/目的,并确定哪个函数似乎与您的目的最相关。

但是,如果您不能决定哪个函数可以检索最准确的结果,您可以进行一个小的研究来确定使用什么。

我推荐使用的方法是对数据集进行采样,并对其运行每个相关的函数。然后,对于每个结果,手动决定每行中的值是真阳性/假阳性/真阴性/假阴性。

完成后,您可以选择 TP/FP 率最令人满意的地方,或者继续计算准确度和灵敏度,并使用这些值做出决定。对于每个项目,我们的目标可能不同,我们愿意接受的假阳性/真阴性率也不同。

*准确性和敏感性都用于数据科学,超出了本文的范围。这些公式都可以在网上找到。

选择阈值分数—简而言之

我的一对字符串返回了 82 的匹配分数。好吃吗?很糟糕吗?

答案取决于我们的目标,并且有许多相关的问题要问,例如:我们是对彼此非常相似的字符串感兴趣,还是对不同的字符串感兴趣?我们愿意接受的最大假阳性率是多少?我们想要的最小真阳性率是多少?

对于同一组字符串,我们可以得出两个不同的阈值分数——相似字符串的最低分数(例如 85),不同字符串的最高分数(例如 72)。
这些阈值分数之间可能存在一个完整的范围,这将注定是“不确定的”。

有不同的方法来定义阈值分数,我们不会在本文中深入探讨它们。然而,我要提到的是,选择阈值分数将需要一些手动工作,类似于上面提到的关于如何选择最佳 FuzzyWuzzy 函数的工作——获取一组具有最终分数的样本字符串,确定结果的真阳性和假阳性,并最终决定我们的阈值。

使用 FuzzyWuzzy 进行字符串比较,以及预处理数据,并最终分析结果是一项令人着迷的工作。总是有更多的事情要做,并且有不同的方法来改进这个过程。

在本文中,我们探索了一些让这个过程变得有用和舒适的实践。

我希望本系列对您有所帮助和启发,并且现在您已经为下一个面向数据的项目准备了更好的工具。

R 中用蒙特卡罗方法模拟 Gacha

原文:https://towardsdatascience.com/gacha-simulation-using-monte-carlo-method-in-r-3897ce611458?source=collection_archive---------28-----------------------

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

C MUnsplash 上拍照

不是运气。概率就是这样的。

动机

蒙特卡罗模拟方法是模拟理论中最流行的方法之一,它依靠重复随机抽样来获得期望的数值结果。这种方法有很多应用,如 A/B 检验、从贝叶斯推断的后验分布中模拟随机样本、期权定价、风险分析等等。

另一方面,手机游戏近年来变得越来越受欢迎,其中一个主要功能是向玩家提供兑换某种稀有物品或角色的能力。这个特征通常被称为嘎查

在这篇文章中,我将解释如何应用蒙特卡罗方法来模拟你将使用 r 得到的 gacha。

概念:蒙特卡罗模拟法

蒙特卡洛方法的思想是利用随机性来解决通常(原则上)是确定性的问题。具体来说,在进行模拟时,蒙特卡罗方法的过程可以解释如下。

  1. 定义可能输入的域和每个输入的频率,
  2. 根据输入计算概率密度函数(PDF ),
  3. 从 pdf 中计算累积密度函数(CDF),
  4. 生成均匀分布在(0,1)中的随机数,
  5. 基于 CDF 将随机数值指定为输入之一,
  6. 重复步骤 4 和 5,直到达到所需数量的模拟结果。

为了在实践中更好地理解这种方法,这里我将实现蒙特卡罗方法来模拟您将得到的 gacha。我将在这里使用的编程语言是 r。

履行

假设我们想要模拟的 gacha 系统遵循这些规则:

  1. 可用物品稀有度为 3、4 和 5 级(通常分别表示为 3 星、4 星和 5 星)。我们将使用它们作为我们可能输入的域。
  2. 对于 3 级、4 级和 5 级稀有物品,该物品在一次投掷中获得的概率分别为 0.945、0.05 和 0.005。
  3. 如果在连续 9 次掷骰中,玩家还没有获得 4 级稀有物品,那么第 10 次掷骰将保证玩家获得 4 级稀有物品。这个卷通常被称为怜悯卷
  4. 如果在连续 89 次掷骰中,玩家还没有获得 5 级稀有物品,那么第 90 次掷骰将保证玩家获得 5 级稀有物品。

根据上面的规则,我们可以如下创建每个卷的 PDF。

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

其中 x 表示该物品的稀有程度。从上面的 PDF 中,我们可以创建逆 CDF 来将均匀分布在(0,1)中的随机数分配给每个稀有级别,如下所示。

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

其中 u 表示均匀分布在(0,1)中的生成的随机数。请记住,上面的逆 CDF 不包括 4 级和 5 级稀有物品的同情骰,因为它只计算一次。

然后,我们用这几行代码编写函数来模拟 gacha 过程。

蒙特卡洛模拟嘎查,代码由作者编写

让我们通过运行 50 次 gacha roll 模拟来尝试上面的代码。结果如下(注意,每次运行模拟的结果可能不同)。

> x=runif(50)
> rarity=3:5
> PDF=c(0.945,0.05,0.005)
> sim=mc.sim(x,rarity,PDF)
Gacha Simulation Table
  rarity   PDF   CDF
1      3 0.945 0.945
2      4 0.050 0.995
3      5 0.005 1.000The 1 th roll produces : 3 star rarity item. 
The 2 th roll produces : 3 star rarity item. 
The 3 th roll produces : 3 star rarity item. 
The 4 th roll produces : 3 star rarity item. 
The 5 th roll produces : 3 star rarity item.
...
The 46 th roll produces : 3 star rarity item. 
The 47 th roll produces : 3 star rarity item. 
The 48 th roll produces : 3 star rarity item. 
The 49 th roll produces : 4 star rarity item. 
The 50 th roll produces : 3 star rarity item.
> table(sim)
sim
 3  4 
44  6

从上面的模拟中我们可以看到,我们获得了 6 个 4 星稀有项目,对于 gacha 游戏的初学者来说还不错!让我们把它增加到 70 次模拟,看看有什么不同。

> x=runif(70)
> rarity=3:5
> PDF=c(0.945,0.05,0.005)
> sim=mc.sim(x,rarity,PDF)
Gacha Simulation Table
  rarity   PDF   CDF
1      3 0.945 0.945
2      4 0.050 0.995
3      5 0.005 1.000The 1 th roll produces : 4 star rarity item. 
The 2 th roll produces : 3 star rarity item. 
The 3 th roll produces : 3 star rarity item. 
The 4 th roll produces : 3 star rarity item. 
The 5 th roll produces : 3 star rarity item.
...
The 16 th roll produces : 3 star rarity item. 
The 17 th roll produces : 5 star rarity item. 
The 18 th roll produces : 3 star rarity item.
...
The 66 th roll produces : 3 star rarity item. 
The 67 th roll produces : 3 star rarity item. 
The 68 th roll produces : 3 star rarity item. 
The 69 th roll produces : 3 star rarity item. 
The 70 th roll produces : 3 star rarity item.
> table(sim)
sim
 3  4  5 
61  8  1

伟大的结果!1 件五星级稀有品和 8 件四星级稀有品,这就是我们所说的好嘎查!

结论

我们到了。本文解释了蒙特卡罗方法在模拟理论中的许多实现之一,您可以在其他领域中实现它,如风险度量、期权定价等等。

像往常一样,如果您有任何问题,请随时提问和/或讨论!我的下一篇文章再见!保持安全,保持健康!

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

可能发生在你读完这篇文章之后(图片来自 Imgflip

作者的联系人

领英:拉登·奥勒留和希卡·维亚迪努格罗霍

中:https://medium.com/@radenaurelius

参考

[1] Enrico,Z. (2013 年)。 系统可靠性与风险分析的蒙特卡罗模拟方法 。可靠性工程中的斯普林格级数。伦敦:斯普林格。

[2]https://book down . org/S3 dabeck 1984/book down-demo-master/Monte-Carlo-simulations . html

[3]罗伯特,C. P .和卡塞拉,G. (2010 年)。 用 R 介绍蒙特卡罗方法 。用 R!。伦敦:斯普林格。

[4]s . m .罗斯(2013 年)。 模拟,第五版 。爱思唯尔。

GAIA-X:向欧洲推销?

原文:https://towardsdatascience.com/gaia-x-a-pitch-towards-europe-6c0e7fa36370?source=collection_archive---------34-----------------------

欧洲雄心勃勃的数据和云基础设施项目会信守承诺吗?

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

用 GAIA-X 克服数据湖孤岛?(图片由滑翔伞运动员金·雷伯格提供)

目前,只有少数超大规模云提供商主导着市场:谷歌云平台、亚马逊网络服务、IBM 云、微软 Azure 和阿里云,仅举几个最著名的例子。他们都没有欧洲血统。生活在欧洲,如果你想在云中存储和分析数据,你很可能会选择一家美国供应商,它隶属于云法案。你很可能会发现自己被这些全球科技巨头锁定为**。欧洲的数字基础设施和分析依赖于提供全球可扩展云基础设施的非欧洲企业集团。如果锁定作为一个选项被添加到这一事实中,这可能意味着在欧洲范围内进一步增值是不可能的。在这一点上,在进入进一步的细节之前,请让我强调,我不是危言耸听。就其本身而言,这些全球科技公司绝对没有任何问题。像我们这样处理数据的人一定会对他们令人印象深刻的服务着迷。就我个人而言,我是他们每个人的超级粉丝。此外,这篇文章不是批评全球主义。依我拙见,全球主义比保护主义提供了更多的机会,在我看来,保护主义不是解决当今问题的可持续答案。但是这并不意味着我们应该在没有任何规则的情况下玩这个游戏。这个帖子主要是想引发一些关于数据**主权的思考。我们走吧。****

GAIA-X 的目标是什么?

盖亚是希腊语的原始神之一,起源于混沌( 1 )。我不会说当前的云状态是混乱的,但只有未来才会真正告诉我们 GAIA-X 中的 X 代表什么,我估计(或者也许我只是完全误解了该项目的名称)。不管你是否喜欢以神的名字命名一个云项目,这只是一个名字,所以让我们来看看它背后的主要思想。对 GAIA-X 最大的误解之一是它应该是一项云服务。但是 GAIA-X 是而不是旨在成为欧洲云替代方案**,它更好地被描述为一个非营利导向的云倡议。如果有的话,GAIA-X 作为一个数字生态系统努力为安全(欧洲)云服务设定规则标准,这满足了欧洲数据和**知识产权。就像之前提到的,这篇文章不会选择一条关于云的国有化道路,但是因为我们已经提到了美国、中国和欧洲很多,也许现在是一个假设性问题的好时机:

数据有国籍吗?

理想情况下,互联网旨在超越国界,将这个星球上的每个人联系起来。自由交换数据。一切平等交易。

云平台是建立在互联网上的,它们的所有者是收入触发的。这些供应商遵守他们祖国的法律和秩序,也必须遵守他们提供服务的国家的法律和秩序。例如,我是一名德国公民,使用谷歌云平台,并向其提供我的个人数据。谷歌也可以使用我的数据吗?当我使用谷歌的人类标签服务来完成机器学习任务时,这些工人受到哪些社会标准的保护?哪个国家的社会标准?我应该在乎吗?由于这个话题超出了本文的范围,我们将把它留给下一个话题。

许多人同意,数据必须受到国家机构的透明保护,而不能对私营公司不透明。这种观点认为,在民主国家,法律更可能符合公众利益,而不是公司的商业利益。如果不能,就要靠人民投票来改变。那么 GAIA-X 的方法看起来怎么样呢?

作为一个云计划,GAIA-X 的目标不是拥有一个巨大的服务器,而是许多小型(如欧洲)和大型提供商(如中国和美国)的能力,这些能力将在需要时通过统一的接口连接起来。GAIA-X 是一种云网**。在这个网络中,GAIA-X 主要有两个目标[ 3 ]😗*

  • 为了数据驱动的价值链,公司应该在欧洲安全地交换数据(而不是让他们的数据通过大西洋流失)。
  • 通过服务合作加强较小的云供应商的地位,这样他们可以建立一个联合的平衡力量来对抗现有的大型云玩家的统治地位。

在公司之间共享数据以从中获取更多价值(这对每个相关合作伙伴来说都是双赢),使用安全基础设施确实是一个令人兴奋的想法。在日常生活中,我们可能不太担心云数据的物理安全。但是 OVHcloud(一家来自法国的大型云提供商)的一些客户非常清楚地记得,即使是云也不是天堂般的安全区域,但它们也容易发生像火灾这样的人间灾难。OVHcloud 位于斯特拉斯堡的一些服务器在 2021 年 3 月 10 日晚不幸烧毁( 2 )。当然没有任何恶意的喜悦,这应该再次提醒我们所有人,安全网是多么的重要。云也不例外。但是,尽管有这种明显的安全声明,GAIA-X 观点中的安全更多地是针对数据保护,非常类似于“通用数据保护条例” (GDPR,或在德国称为 Datenschutz-Grundverordnung DSGVO)。

GAIA-X 是如何努力实现目标的?

政策规则

必须有规范,你可以审计,以确保欧洲的价值观是真正遵守有关数据保护和他们的知识产权。根据定义,使用云意味着您的数据将存储在外部服务器上。美国提供商受美国云法案的约束。这一云法案与任何欧洲对欧洲数据主权的企图背道而驰。

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

来自我的网站的声明

更准确地说,数据主权是关键!您需要控制并能够访问数据,以努力实现数据驱动的创新,例如“现成的”数据生态系统**。全球化经济需要的是公平透明的竞争规则,只有健康的依赖关系。**

互操作性( Liberté,用法语说)

这些规则之一是互操作性。这意味着提供商必须确保他们的客户能够轻松地将他们的数据从一个云提供商切换到另一个云提供商,而不会丢失任何数据。GAIA-X 还希望为他们的客户提供不同供应商的服务的相互使用,例如分析。希望通过使用相互的 GAIA-X 参考体系结构实现互操作性,从而实现业务模型的协作和扩展。这与目前大玩家的锁定效应完全相反。如今,通过使用例如 AWS,亚马逊正在努力为您这个客户也利用亚马逊的其他服务。作为客户,留在亚马逊的原因可能在于方便(向其他供应商传输数据是可能的,但需要努力)。老实说,留在亚马逊的另一个原因(谷歌、微软等也是如此)很可能是因为他们的服务已经在技术上满足了你的需求。每个云提供商都将能够提供云存储来保存您的数据。这不是一个大挑战。但是,这些供应商是否也能够提供与 IBM 的 Watson 自然语言处理、谷歌的 Vision API、微软的 Azure 机器学习服务、阿里巴巴的 Quick BI 或亚马逊的增强人工智能相当的有竞争力的云服务呢?与这些极高的高低杠竞争,我相信它们实际上是不可超越的。但是盖亚-X 的决定性王牌是它的透明度方法。

透明度

或许对科技巨头来说,更根本的是对透明度的要求。非常欢迎每一个愿意达到盖亚-X 标准的人加入。从法律角度来看,针对云提供商所依据的监管问题:

  • 美国云法案****

或者尊重

  • 欧洲一般数据保护条例**(与美国《云法案》相矛盾)**

GAIA-X 希望成为符合欧洲透明度和互操作性标准的云主机市场。欢迎所有云提供商让他们的服务通过 GAIA-X 标准的认证。美国东道主屈从于《云法案》。《云法案》与欧洲云标准形成鲜明对比。理论上,云法案要求美国供应商在特殊情况下允许美国机构访问其服务器上的数据(甚至法律专家仍在争论这到底意味着什么)。虽然观察 GAIA-X 是否会吸引任何非欧洲客户会很有趣,但我确实希望一些欧洲公司对这种欧洲云质量标签市场有浓厚的兴趣。

展望:欧洲的数据经济

GAIA-X 的应用程序希望确保数据可以在安全的环境中在公司和国家之间交换。这些云基础设施网络是在工业 4.0、健康、金融等许多不同应用领域创建数据驱动生态系统的基础。GAIA-X 的生态系统应该给我们一个从数据中赚钱的市场机会。例如,人工智能可以用数据池进行训练,这些数据池可以提供给其他行业的公司(这在以前是不可能的)。这个想法是从原始数据中创建二级数据。辅助数据的保护需求低于主数据。特定于域的批准和接受被认为是作为元数据保存在主数据中的。如果一个公司为 GAIA-X 开发库,他们将会收到所有必要的信息,如认证协议等。这些库是开发者的财产,作为“知识产权”(IP)投放市场。与欧洲数据战略类似,GAIA-X 旨在创建数字生态系统,尤其是在以下领域[ 3 ]:

  • 产业的
  • 欧洲绿色交易
  • 流动性
  • 健康
  • 金融
  • 农业
  • 行政部门

数据聚类

例如,金融数据集群保持了连接数据的承诺,以便更有效地打击洗钱和市场滥用。欧洲央行和其他银行的数据池与人工智能相结合,可能会导致更高的命中率。如果这不是使用云分析的理想目标,那该怎么办?

GAIA-X 只会吸引欧洲商家吗?

在 GDPR(General Data Protection Regulation)之初,许多人(包括我自己)都对这种方法是否真的能保护数据隐私持怀疑态度。我不得不承认,我预计 GDPR 会让事情变得更糟,在没有给数据保护带来重大好处的情况下,摧毁的欧洲就业岗位比它创造的还要多。我的假设是多么错误。今天,GDPR 不仅在欧洲广为人知,甚至还出口到中国、南美和日本等国家。

一个目前被广泛讨论的概念是,大型科技公司也可以自由加入 GAIA-X 项目。例如,法国 OVH 云提供商正在与谷歌合作。谷歌应该在尊重欧洲主权原则的同时,以开源兼容技术交付他们的软件和应用。这项技术将由欧洲人在位于欧洲的服务器上实践,因此预计不会有数据离开欧洲。正如本文开头所提到的,GAIA-X 不想自己创建一个云和云应用程序。欧洲足够现实地估计,如果没有在这项技术上投入了数十亿美元的老牌大玩家的专业知识,就没有解决方案。

直到今天,还没有一个具体的 GAIA-X 服务可以让我们得到。我非常兴奋地看到 GAIA-X 是否会成为一个高飞的新云标准或者只是一个理论上的 Gedankenexperiment(德语为思想实验)。

在此之前,非常感谢您的阅读!希望这篇文章对你有帮助。请随时在 LinkedInTwitter工作室与我联系。

****https://jesko-rehberg.medium.com/membership

最初发表在我的网站 DAR-Analytics

参考:

[1]维基百科上的盖娅:https://en.wikipedia.org/wiki/Gaia

[2] FAZ 网,Flammen wüten beim gr esten Cloud-Anbieter Europas:https://www . FAZ . Net/aktuell/wirtschaft/digitec/frank Reich-feuer-Bei-groesstem-Cloud-Anbieter-Europas-ausgebrochen-17237695 . html

[3]联邦经济事务和能源部,欧洲 GAIA-XA 联邦数据基础设施:https://www.bmwi.de/Redaktion/EN/Dossier/gaia-x.html

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

GAIA-X:一个高飞的新云标准还是一个理论上的实验?(图片由滑翔伞运动员金·雷伯格提供)****

通过解决负责任的人工智能差距获得信任

原文:https://towardsdatascience.com/gain-trust-by-addressing-the-responsible-ai-gaps-eeb5ee685bf1?source=collection_archive---------39-----------------------

全球负责任人工智能调查的结果

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

布雷特·乔丹在 Unsplash 上的照片

在过去的几年里,人工智能的风险和人工智能的伦理考虑正成为人们关注的焦点。随着人工智能在疫情期间越来越多地用于接触追踪、劳动力安全和规划、需求预测和供应链中断,出现了许多围绕人工智能模型的隐私、偏见、安全、鲁棒性和可解释性的风险。

人工智能风险识别、评估和缓解因人工智能成熟度、公司规模、行业部门和居住国而异。普华永道在 2020 年 11 月对 1000 多名首席执行官进行的全球负责任的人工智能调查揭示了许多见解,因为它与人工智能的风险以及公司如何评估、管理和减轻这些风险有关。接受调查的公司来自多个行业,包括金融服务、技术、能源、公用事业和医疗卫生。这些公司的规模各不相同,有年收入不足 5 亿美元的小公司,有年收入在 5 亿至 10 亿美元之间的中型公司,也有年收入超过 10 亿美元的大型公司。近 49%是大公司,29%是中型公司,其余是小公司。我们还根据这些公司的人工智能成熟度(由部署的企业范围人工智能应用程序的数量决定)对它们进行了细分。这导致了三个集群——**人工智能领导者(或完全拥抱人工智能 ) (26%),人工智能实验者(或实现的早期阶段)(58%),以及人工智能落后者(**或未实现 ) (16%)。毫不奇怪,大公司(年收入 10 亿美元)占人工智能领导者的近 65%。

人工智能伦理仍未在相当多公司的视野中出现

近 33%的受访者不考虑道德因素(4%)或仅在有限程度上考虑道德因素(29%)。这一比例在人工智能实验者中上升到 37%,在人工智能落后者中上升到 44%。在日本,人工智能实验者的这一比例上升至 58%。小公司(营收 5 亿美元或更低)往往很少或根本不关注道德考虑——46%的人工智能实验者和 52%的人工智能落后者属于这一类别。

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

1:成熟度等级对人工智能伦理的关注度(来源:普华永道责任人工智能调查)

人工智能的偏倚、安全性和可解释性仍然排名靠前

算法偏差仍然是许多组织主要关心的问题。这是 36%的受访者的主要关注点,56%的受访者充分考虑了这一点。随着公司在人工智能采用方面的成熟,他们将算法偏见作为主要关注点——近 60%的人工智能领导者将它作为主要关注点。

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

2:关注成熟度水平的偏差(来源:普华永道责任人工智能调查)

人工智能系统的安全性是 28%的受访者的主要担忧,37%的受访者非常担忧,31%的受访者有点担忧。然而,随着公司的成熟,安全变得更加令人担忧——50%的人工智能领导者将安全视为非常重要的问题。

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

3:按成熟度划分的安全关注度(来源:普华永道责任人工智能调查)

在我们的调查中,27%的公司绝对有能力解释或证明模型所做的决定,41%的公司能够很好地解释,30%的公司能够在一定程度上解释。人工智能领导者在这方面更精通——48%的人肯定有能力解释这些决定。

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

图 4:关注成熟度级别的可解释性(来源:普华永道责任人工智能调查)

公司正在使用各种方法来评估和管理人工智能风险

在调查受访者中,近 52%的人没有道德的人工智能框架,也没有将道德原则纳入日常运营。对于 AI 落后者,这个数字上升到 68%,对于收入低于 5000 万美元的公司,这个数字上升到 66%。

人工智能行为准则(63%的受访者)、人工智能影响评估(52%)、人工智能道德委员会(43%)和人工智能道德培训(37%)是公司一直用来处理人工智能风险的一些机制。虽然这些百分比在所有国家都相对一致,但英国的人工智能道德委员会(32%)和人工智能道德培训(28%)的数量似乎较少。随着公司在人工智能采用方面的成熟,他们似乎接受了更多的道德培训,也使用了道德委员会。60%的人工智能领导者拥有人工智能道德委员会(整体比例为 43%),47%的人工智能领导者接受过道德培训(整体比例为 37%)。

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

图 5:按成熟度管理人工智能风险的方法(来源:普华永道责任人工智能调查)

人工智能风险识别和问责尚处于起步阶段

只有 12%的公司将其人工智能风险管理和内部控制完全嵌入和自动化;26%的公司拥有已经标准化和沟通的企业方法;其余的公司在人工智能风险管理方面采取了孤立的或非标准化的方法。对于人工智能领导者,我们看到近 29%的领导者拥有完全嵌入式和自动化的风险管理和控制,38%的领导者拥有企业范围的标准化方法。

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

图 6:按成熟度划分的人工智能风险识别(来源:普华永道责任人工智能调查)

当谈到透明度和问责制时,只有 19%的公司有一个正式的和记录在案的过程,并向所有利益相关者报告;29%的公司只有在发生特定事件时才有正式流程;其余的只有一个非正式的过程或者根本没有明确定义的过程。

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

图 7:按成熟度划分的人工智能责任(来源:普华永道责任人工智能调查)

从上述调查结果可以清楚地看出,在以下方面,人工智能领先者和人工智能落后者之间仍有很大差距

  • 他们对偏见、安全性和可解释性等问题的关注;
  • 他们使用人工智能行为准则、人工智能伦理委员会、培训和人工智能影响评估来管理人工智能风险的方法;和
  • 他们识别人工智能风险并让人们承担责任的能力。

我们称之为 负责任的 AI 差距。 公司需要弥合这一鸿沟,以获得客户、员工和其他利益相关者的信任。如果做不到这一点,很可能会影响他们的投资回报率(ROI ),并且无法从人工智能计划中获得预期的收益或价值。

相关文章

  1. AI 领导人充分利用新冠肺炎危机来增加 AI 的作用

基于 LeNet-5 的星系多影像分类

原文:https://towardsdatascience.com/galaxy-multi-image-classification-with-lenet-5-1bc2f66d3cfc?source=collection_archive---------19-----------------------

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

Guillermo Ferla 在 Unsplash 上拍摄的照片。

用梯度下降魔法探索空间

星系的美丽从未停止征服我。思考星系是令人难以置信的基础,它们是重塑视角的有力工具。

不久前,当我在互联网上搜索我的下一次机器学习冒险时,我偶然发现了这个机器,我知道我必须试一试。不过,在训练机器对图像进行分类之前,我很好奇, I 能把它们分类得多好?

简短的回答是不太好。其中一些非常明显,我可以很容易地把它们挑选出来,归类为一个特定的标签。其他人我会很有信心,但当我发现我错了的时候,我的信心就破灭了。

考虑到这一点,我现在很好奇。一台机器能做得多好?因此,我对这个问题进行了测试,并构建了一个卷积神经网络——到底是哪一个呢?心爱的 LeNet-5!

在本文中,我将从头到尾介绍如何建立一个对星系进行分类的机器学习模型!

只对代码感兴趣?没关系,我不太生气。我将为您省去通读整篇文章的麻烦,因为说实话,当我只需要某个特定部分时,我不太喜欢费力地阅读大量信息。这里是 Kaggle 笔记本的链接。

导入依赖关系

在构建任何机器学习模型时,要做的第一件事是下载我们需要的依赖关系。

! pip install astroNN
import tensorflow as tf
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import numpy as np
from tensorflow import keras

from keras.models import Sequential
from keras.layers import Conv2D, AveragePooling2D, Flatten, Dense, Dropout
from keras.callbacks import ReduceLROnPlateau
from keras.optimizers import Adam

import sklearn
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report,confusion_matrix
from tensorflow.keras import utils

from astroNN.datasets import galaxy10
from astroNN.datasets.galaxy10 import galaxy10cls_lookup

完成后,我们现在有了开始构建模型所需的工具。

关于数据集

如果你读过我的其他机器学习文章,你就会知道我对数据的评价有多高。数据点是我们日常决策的北极星。你知道你的同事总是在上午 10 点霸占着咖啡机吗?你可以把喝咖啡的时间改到 9:30。因为你的老师喜欢用突击测验给你惊喜而不断受挫?你将开始每天学习,为第二天他们可能扔给你的任何东西做好准备。

数据是机器学习的核心。如果人工智能有一个口号,我会说是“只添加数据”。话虽如此,我还是给大家简单介绍一下今天节目的明星:galaxy10!

galaxy10 数据集包含 21785 个 69x69 像素的彩色星系图像,分为 10 个不同的类别。该数据集的图像来自斯隆数字巡天,标签来自银河动物园。

数据集内的每个图像被分类为 10 个类别中的一个,然而,在分配给来自人类志愿者的某些图像的类别中存在差异,所述人类志愿者的任务是标记图像,其作为经验证据,表明在类别之间的图像中存在高水平的相似性。为了缓解这个问题,Galaxy10 数据集不包括没有最终决定的图像。(55%的人类志愿者投票支持一个类别)

您现在已经熟悉了数据集!我们继续吧。

数据探索

现在,我们不能探索尚未加载的数据。

images, labels = galaxy10.load_data()

x_train, x_test, y_train, y_test = train_test_split(images, labels, test_size=0.2)

features = ['Disk, Face-on, No Spiral', 'Smooth, Completely round', 'Smooth, in-between round', 'Smooth, Cigar shaped', 'Disk, Edge-on, Rounded Bulge', 'Disk, Edge-on, Boxy Bulge', 
            'Disk, Edge-on, No Bulge','Disk, Face-on, Tight Spiral', 'Disk, Face-on, Medium Spiral', 'Disk, Face-on, Loose Spiral']

x_train = x_train / 255.0
x_test = x_test / 255.0

那更好。现在,让我们试着更好地理解这些数据。

x_train.shape, x_test.shape# This prints ((17428, 69, 69, 3), (4357, 69, 69, 3))

现在,我们对数据集有了更多的了解。这里,我们有 17248 个尺寸为 69×69 的彩色训练图像和 4357 个尺寸为 69×69 的彩色测试图像的数据集。让我们来看看数据集中随机选择的图像。

fig = plt.figure(figsize=(20,20)) 

for i **in** range(25):
    plt.subplot(5,5,i+1)    
    plt.imshow(x_train[i])
    plt.title(features[y_train[i]])
    fig.tight_layout(pad=3.0)

plt.show()

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

从数据集中选择星系图像。来自 galaxy10 数据集的图像。

令人敬畏不是吗?让我们看看这个数据集还能揭示什么。

*# Check class distribution*

df = pd.DataFrame(data=labels)

counts = df.value_counts().sort_index()
print(counts)

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

上面代码的输出。图片由作者提供。

def class_distribution(x, y, labels):
    fig, ax = plt.subplots()
    ax.bar(x, y)
    ax.set_xticklabels(labels, rotation=90)
    plt.show()

class_distribution(features, counts, features)

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

上面代码的输出。图片由作者提供。

不平衡数据:准确性悖论

这里,我们有一个相当不平衡的数据集。每个类别中的图像数量范围从类别 5 中的 17(最小)到类别 1 中的 6997(最大)。具有偏斜类别分布的数据的问题在于,准确度不再是正确反映机器学习模型对图像进行分类的能力的评估度量。这也被称为准确性悖论,即具有较高准确性的模型可能比具有较低准确性的模型具有更少的预测能力。

总结一下:准确性可能并不总是评估你的模型的最佳指标。因此,如果我们使用其他评估指标,如精确度或召回率,这将是一个更公平的分析。

精度:精度=真阳性(TP) /真阳性(TP) +假阳性(FP)

召回:召回=真阳性(TP) /真阳性(TP) +假阴性(FN)

**补充说明:**精度和召回指标已被移除,因此我们将使用精度作为指标来训练卷积网络,但稍后将使用 Scikit Learn 的分类报告来更好地了解我们模型的精度、召回和 f1 分数。

训练基线模型

model = Sequential()

*# Baseline model to compare to LeNet-5*
model.add(Flatten(input_shape=(69, 69, 3)))
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))

model_optimizer = Adam(lr=0.001)

model.compile(optimizer=model_optimizer, loss='sparse_categorical_crossentropy', metrics=["accuracy"])
reduceLR = ReduceLROnPlateau(monitor='accuracy', factor=.001, patience=1, min_delta=0.01, mode="auto")
lol = model.fit(x_train, y_train, epochs=10, callbacks=[reduceLR])

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

上面代码的输出。图片由作者提供。

还不错。最终准确率为 70%。让我们看看 LeNet-5 在比较中表现如何,但在此之前,我先向您介绍一下 LeNet-5 的背景。

LeNet-5 架构

LeNet-5 是一种古老而经典的卷积神经网络架构,由 Yann Andre LeCun、Leon Bottou、Yoshua Bengio 和 Patrick Haffner 于 1998 年开发。最初开发时,它是为手写 MNIST 数字识别而设计的,后来成为了 AlexNet 和 VGG 等未来架构的基础。

第一个卷积块由两个卷积和平均池层组成,其后是一个平坦层,然后是 3 个密集层。

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

LeNet-5 架构。图可以在原文中找到。

让我们开始构建 LeNet-5 模型吧!

model2 = Sequential()

*# LeNet-5 conv-net architecture*
model2.add(Conv2D(filters=6, kernel_size=(5,5), strides=(1,1), activation='tanh', input_shape=(69,69,3)))
model2.add(AveragePooling2D(pool_size=(2,2), strides=(2,2)))
model2.add(Conv2D(filters=16, kernel_size=(5,5), strides=(1,1), activation='tanh'))
model2.add(AveragePooling2D(pool_size=(2,2), strides=(2,2)))

model2.add(Flatten())
model2.add(Dense(units=120, activation='tanh'))
model2.add(Dense(units=84, activation='tanh'))
model2.add(Dense(units=10, activation='softmax'))

model_optimizer = Adam(lr=0.001)

reduceLR = ReduceLROnPlateau(monitor='accuracy', factor=.001, patience=1, min_delta=0.01, mode="auto")

model2.compile(optimizer=model_optimizer, loss='sparse_categorical_crossentropy', metrics=["accuracy"])
model2.fit(x_train, y_train, epochs=10, callbacks=[reduceLR])

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

上面代码的输出。图片由作者提供。

90%的准确率!这不完全是机器学习的圣杯,但也是一个相当不错的分数。现在,让我们看看 LeNet-5 模型的预测。

predict = model2.predict(x_test).argmax(axis=1)

for i **in** range(10):
    print("Actual:", features[y_test[i]])
    print("Prediction:", features[np.argmax(predict[i])])
    print("-----")
    print()

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

上面代码的输出。图片由作者提供。

看起来一些星系等级被其他的混淆了。即使是人类也很难正确地对每一类图像进行分类。为了更好地理解所犯的错误,使用混淆矩阵是有帮助的。我们还会在这里看一下分类报告。

classification_report(y_test, predict)

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

上面代码的输出。图片由作者提供。

从这个报告中,我们可以看出,我们的模型对于分类 0、12、4(特别是 12)具有很高的精度和召回率。请注意,类 1 和类 2 也有最多的训练和测试样本。另一方面,对于只有 6 个测试样本的类别 5,该模型具有非常低的精度和召回率(0)。绘制混淆矩阵将进一步明确这 6 个测试样本的预测结果。

matrix = confusion_matrix(y_test, predict)
sns.heatmap(matrix, annot=True)
plt.title('Galaxy Confusion Matrix')
plt.xlabel('Predicted class')
plt.ylabel('True class')

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

该模型很好地预测了 1 类和 2 类图像!这并不奇怪,因为它们是样本最多的类。0 和 4 也做得不算太差。我们的模型一贯混淆类别 0 和类别 7 (76 个样本),类别 1 和类别 2 也经常被预测为类别 0。此外,该模型在分类第 8 类时存在问题,经常将其误认为第 0 类和第 7 类。让我们调查一下。8 类是盘面,正面,中螺旋,0 类是盘面,正面,无螺旋,7 类是盘面,正面,紧螺旋。看看上面的图像,很容易看出为什么这些图像看起来非常相似。

结论

这是一个有趣的数据集!当我找到它并检查图像时,作为一个人,我很难辨别不同星系类别之间的差异,因为它们具有高度相似的特征,所以我很想看看机器学习模型与人类相比表现如何。我做的一些最初的假设是正确的:我相信这个模型在螺旋上有最大的困难,其他的有点偏离。我曾认为该模型会更频繁地混淆类别 1 和类别 2(平滑、完全圆形和平滑、圆形之间),因为这些类别在一些图像中看起来也非常相似。经过训练后,我认为模型能够很好地区分两个类别,是因为每个类别都有大量的图像可供训练。

其他要注意的事情:准确性并不总是评估你的模型的最佳指标,也是 LeNet-5 的一个旁注;LeNet-5 虽然它的体系结构可能相对较老,但它在这个数据集上的表现并不太差。

伽辽金变压器:NeurIPS 2021 上的一次性实验

原文:https://towardsdatascience.com/galerkin-transformer-a-one-shot-experiment-at-neurips-2021-96efcbaefd3e?source=collection_archive---------28-----------------------

思想和理论

一个业余计算数学家关于注意力机制的数学理论和应用的旅程。

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

一个基于注意力的算子学习器直接从参数中推断出解。图片作者。

警罗罗格

最近,我写了我的第一篇关于机器学习的论文,这是一个有趣但具有挑战性的兼职项目,同时还有一个包含代码的开源库:【https://github.com/scaomath/fourier-transformer。

作为一个完全的新手和这个领域的独立研究者,我疯狂而愚蠢地向 NeurIPS 2021 提交了这篇论文……感谢我的导师的鼓励。

我认为这个标题很吸引人,因为搜索“伽辽金变形金刚”会在顶部找到这篇论文的 arXiv 链接。作为一名业余数学家,这个标题表明这更像是一篇“享受乐趣,而不是为了发表”类型的论文。然后,我看到了一些其他“明显的”NeurIPS 使用 LaTeX 模板提交的内容,标题类似于“反 Koopmanism”“Max-Margin 已死,Max-Margin 万岁!”“你永远不会独自群集”。毫无疑问,这些 CS 人对此是认真的。

论文本身是半理论半实验的。我觉得即使每个人都在使用变形金刚,因为 注意力是你所需要的全部 ,即使对于 CV 任务,说“注意力机制背后的数学不是很好理解”甚至有点轻描淡写。几乎没有任何严格的理论基础来解释为什么注意力会以如此神奇的方式在数学上起作用。

因此,在这篇博文的剩余部分,我将以一种随意的方式,带着一些半严肃的数学知识,介绍我们用一些我熟悉的严肃数学知识重新思考变形金刚的小小尝试:

首次尝试从希尔伯特空间的逼近理论出发,用伽辽金方法解释注意机制的逼近能力。

[1]:曹,S. (2021)。选择一个变换器:傅立叶或伽辽金。在 arXiv 预印本 arXiv:2105.14995

[2]:瓦斯瓦尼,a .,沙泽尔,n .,帕尔马,n .,乌兹科雷特,j .,琼斯,l .,戈麦斯,A.N .,凯泽,l .,波洛苏欣,I .,2017。你需要的只是关注。 arXiv 预印本 arXiv:1706.03762

背景

自我关注算子的数学定义如下:𝐲 ∈ ℝⁿ × ℝᵈ是输入潜在表示,查询 Q ,键 K ,值 V ,以及投影矩阵 WQ、WK、W^V

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

使用编码创建的方程式。

缩放后的点积关注度为:

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

使用编码创建的方程式。

全部注意力是:对于 g(⋅)一个逐点通用逼近器(在这种情况下是前馈神经网络)

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

(A) :标准的注意机制。使用编码创建的方程式。

在许多关于中自我注意机制的解释的论文中,注意是你所需要的全部,包括最近的一些尝试,用“内核解释”进行类比,或者说将 Softmax (QKᵀ)V 链接为可学习的内核图是一种常见的做法。Softmax( QKᵀ )被描述为每个位置的特征向量(标记的学习嵌入)与每个其他位置的特征向量的相似性度量。softmax 归一化变压器的一些值得注意的线性化利用了这种解释。

我想,如果没有 softmax,生活会变得简单得多,我们将解释从行方式的改为列方式的。所以让我们做吧!

改进基于数学直觉的注意机制的尝试

现在假设 Q,k,V 的第 j 列为在物理位置 xᵢ ∈ ℝᵐ采样的(单独的)函数 qⱼ(⋅),i=1,…,n ,连同 zⱼ(⋅)表示缩放的点积的输出。然后, (QKᵀ)V 加上一些关于跳过连接的警告,没有 softmax 的注意力变成了第二类弗雷德霍姆方程:

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

使用代码生成的方程式

与κ(x,ξ):=ζ_q(x)⋅ϕₖ(ξ)对于特征地图:

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

使用代码生成的方程式

将注意力机制解释为积分并不新鲜,例如在 LieTransformer 中已经开发了对的积分。

尽管如此,将积分引入到图片中会为没有 softmax 的线性变量带来更有趣的解释: Q(KᵀV) 可以被视为彼得罗夫-伽辽金投影(如果我们将 Q,k,V 的列视为独立函数):

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

(P-G) :重写没有 softmax 的线性注意。使用编码创建的方程式。

其中𝔟(⋅,⋅)是在 无限维希尔伯特空间 上定义的双线性形式,但在行动中被评估为离散近似。为了帮助我们理解,我们可以参考下面的两个数字,看看没有 softmax,生活是如何变得容易得多的。

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

没有 softmax 的线性注意力的图示。图片作者。

现在,为了将上面关于没有 softmax 的线性注意力的表达式与我们熟悉的东西联系起来,我们可以进一步考虑 QR 因式分解,或者甚至是在一组 d 正交基函数{ qⱼ(⋅) }ⱼ₌₁ᵈ:中的投影

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

使用编码创建的方程式。

毫不奇怪,解决方案是一个类似于线性回归解的显式表达式的投影:如果我们假设{ qⱼ(⋅) }ⱼ₌₁ᵈ通过其内积诱导范数进一步规范化(想想具有进一步 1/√n 权重的实例规范化)。

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

(F) :正交基的潜在扩展。使用代码生成的方程式

来看一个具体的例子:设ω=【0,2π 】和 qⱼ(x) = sin( jx )和 cos( jx ),那么上面的等式只是 傅里叶级数部分和逼近*【x】*和中的一个特例(p-p)

受这种解释的启发,提出了下面的伽辽金型简单注意算子:

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

(G) :伽辽金注意力,一种尺度保持的注意力算子。使用代码生成的方程式

一点也没有。在进行点积之前,对潜在表示进行层归一化,就像傅立叶基可以被视为具有预内积归一化一样,

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

使用代码编码创建的方程式。

[3]:哈钦森,m .,兰,C. L .,扎伊迪,s .,杜邦,e .,德,Y. W .,,金,H. (2020)。LieTransformer:李群的等变自注意。 arXiv 预印本 arXiv:2012.10885

操作员学习

现在一种新的注意力被构想出来了,问题是:

我们在哪里为这位新的注意力操作员搭建舞台?

即使一些初始原型表明使用fairseq(例如,更快的训练)在 IWSLT14 (En-De)上的 BLEU 评估基准上有希望的结果,对我自己来说,与偏微分方程相关的操作员学习问题将是自然的选择。如果选择一个大而艰巨的自然语言处理(NLP)问题,作为一个独立的研究人员,原型-调试-改进的周期对我来说太长了。

去年,我的导师给我发了一篇博客文章关于加州理工学院 ML 小组使用所谓的傅立叶神经算子(FNO)⁴学习偏微分方程解算子)实现了一个最先进的性能。在仔细阅读、剖析代码并自己重新实现之后,我完全屈服于这种令人敬畏的方法的脚下,因为它在数量级上击败了以前的方法。此外,这个实现让我确信,注意力中的一般Q/K/V方法变成了FFT->conv->iFFT。这种变化是注意力机制的一种特殊而有效的线性变化,投影矩阵是不可训练的。因为快速傅立叶变换(FFT)或其逆变换都可以被视为通过乘以范德蒙矩阵的不可训练的基变换。在实际的注意机制中,基底的(非线性)变化的权重都是可训练的。

最重要的是,FNO 的实践表明了一件事

对待潜在表示的而不是(位置的特征向量)施加操作,是一种有前途的方法。

直到最近(截至 2021 年 5 月),ML 社区开始重视这一方向,例如在[5]和[6]。

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

随机界面的扩散系数。图片作者。

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

含 10%噪声的偏微分方程解。图片作者。

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

来自溶液的噪声测量的重构系数。图片作者。

那么,结果是什么呢?注意力和 FNO 的结合非常好,基于伽辽金注意力的转换器也可以解决困难的反系数识别问题(见上图)。在相同的参数配额下,在伯格斯方程基准中,4 个伽辽金注意层+2 个 FNO 层的模型在相同的实验室条件下(相同学习速率的[1cycle](https://arxiv.org/abs/1708.07120) 调度器,100 个历元)优于 4 个 FNO 层的模型 4 倍,优于原始的具有Batchnorm的模型 10 倍。在 L -norm 中平均评价相对误差的常用范围为1e-3,最大值为1.7e-3。达西流中的基准,连同其逆版本,在评估准确性方面也已经废黜了国王(FNO)。伽辽金变换器的训练比 FNO 慢,尽管理论上具有相同的复杂度。

除了加州理工学院集团提出的神经算子结构化网络,下一个接近的竞争对手 DeepONets 要差得多……(参见第 14 页,图 10 中有3e-2相对误差的单个实例)。由于 DeepONets 中的网络类似于神经图灵机(NMT) 中的附加注意力,可以预见的是,尽管 DeepOnets 具有启发式地符合数学的结构,但由于多个“困难的”非线性(如双曲正切和 Sigmoids)的组合,deep onets 更难训练。

[4]:李,z .,科瓦奇基,n .,阿齐扎德内谢利,k .,刘,b .,巴塔查里亚,k .,斯图尔特,a .,&阿南德库马尔,A. (2020)。参数偏微分方程的傅立叶神经算子。 arXiv 预印本 arXiv:2010.08895

[5]:托尔斯泰欣、霍尔斯比、科列斯尼科夫、拜尔、李、翟、安特辛纳、杨、凯泽斯、乌兹科雷特、卢契奇和多索维茨基,2021 年。Mlp 混合器:用于视觉的全 mlp 架构。 arXiv 预印本 arXiv:2105.01601

[6]:李-索普,j .,安斯利,j .,埃克斯坦,I .,&翁塔农,S. (2021)。FNet:用傅立叶变换混合记号。 arXiv 预印本 arXiv:2105.03824

注意:下面的最后一部分有一些半严肃的数学。

我们能证明什么?彼得罗夫-伽辽金投影

注意算子或其线性变体,就其输入和可训练参数而言,是一个 非线性 算子。我们如何把它连接到像伽辽金或者彼得罗夫-伽辽金投影这样的线性投影上呢?答案很简单:

我们尝试在希尔伯特框架下,在以下意义下证明 近似容量

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

(M) :线性投影度量的非线性映射的逼近能力。使用编码创建的方程式。

这转化为:g_θ,建立在伽辽金注意力上的近似器,其近似能力等同于到近似子空间 𝕍ₕ ⊂ ℋ的伽辽金投影,其中ℋ是希尔伯特空间,并且我们想要在它的子集上模拟操作者的行为。

这个子空间 𝕍ₕ 是基于潜在表示的当前子空间,并且在优化期间,是动态变化的。然而,在固定的潜在表征的静态视图中,注意机制有能力在当前的近似空间中提供最佳近似器,即伽辽金型投影。

难点:用线性投影桥接非线性映射

有人可能会问:这不是小事吗?嗯,有几分像 (F) 正是𝕍ₕ:= span {vⱼ(⋅)}的情况。然而,仔细观察后,用数学方法把这个结果清晰地表达出来可能并不那么容易。困难如下:

  • 与伽辽金投影中的空间设置不同,Q/K/V所代表的近似子空间是不同的。
  • 如何将 Q 的列线性组合得到 (P-G) 中输出 z 的每一列取决于乘积 KᵀV 的每一列。然而,并不完全清楚的是, KᵀV 的某一列是否足以给出系数,以产生任意函数f∈ℋ.的伽辽金或彼得罗夫-伽辽金投影原因是因为既不能保证Q/K/V满秩,也不能保证非线性内积的满射性。

一个简单的例子来说明困难

在注意力的任何线性变化的上下文中:

q 代表值,K 代表查询,V 代表键。

让我们考虑一个简单的例子,其中ω=(-11 ),由−1=x₁<x₂<⋯<xₙ=1离散化。q列的近似空间 由前两个切比雪夫多项式 { 1,x }构成, KV 的列的近似空间分别为{ a,bx 和{ c,dx }对于 a,b,b 实际的列是由这些函数在 xᵢ 的评估产生的,对于一个样本,网格点数 n 是固定的。我们注意到序列长度 n 可以在操作者学习管道中改变。

现在,对于一个 f ∈ ℋ,l-fℚₕ := span{ 1,x }的投影为:

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

(L) :线性多项式空间中对 f 的最佳逼近。使用代码生成的方程式

当将 K/V 的列解释为网格采样的函数时, KᵀV/n 的点积成为积分的近似值,并且易于验证:

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

使用代码生成的方程式

在这种情况下,通过进一步的简单检查,我们可以看到 KᵀV/n 能够复制 (L) 中投影的系数,只需乘以矢量 (f₁,f₂)ᵀ )。

但是,如果把 KV 的列改成网格点处的{ a,bx }和{ cx,dx }的求值呢?

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

使用代码生成的方程式

突然,**复制(L)中系数的能力没有了!**因为这个矩阵乘以 Q 后: Q(KᵀV) 的列所代表的子空间在里面没有常数函数!欢迎感兴趣的读者验证一下。

当然,这是一种过度简化,因为:

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

使用代码生成的方程式

但是你明白了。

证明:希尔伯特空间中的一个鞍点问题

通过我自己的专业技术(混合有限元),我们可以证明 Q(KᵀV) 具有能力来实现彼得罗夫-伽辽金投影所能近似的结果,前提是以下条件成立:

存在从关键空间(线性注意中的 V)到值空间(线性注意中的 Q)的满射映射。

在泛函分析中,这也可以被视为在逼近算子方程的情况下的近距离定理Ladyzhenskaya–Babu ka–Brezzi 条件的条件。如果我们的一些读者对细节感兴趣,请参考论文中的附录 D。

用通俗易懂的语言来翻译这个线性注意证明的数学意义,它是:

对于值空间中的最佳逼近器(Petrov-Galerkin 投影),至少存在一个键来匹配传入的查询以传递该最佳逼近器。

写成一个不等式的形式:

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

变压器的序列长度独立逼近。使用编码创建的方程式。

其中 c 是离散近似空间上 Ladyzhenskaya-Babu ka-br ezzi 条件中的常数。如果 c 可以被证明是序列长度无关的,那么伽辽金变换器的近似功率,或者变换器的任何线性变量的近似功率,是 独立于序列长度 ,数学证明。

相反,近似能力取决于d_model,即我们愿意支付多少基函数来近似一个子集上的操作者的响应。算子理论和(线性)注意力机制之间的完美桥梁,没有 softmax。

由于我自己已经完成了这个小项目,并在不久的将来返回到我自己的领域(可能会在多级转换器上再做一个工作,利用注意力机制中残差的子空间校正性质),如果 ML 社区发现这个证明的重要性,利用 键到值映射 的满射性,这并不奇怪,在 12 年内,将会出现像“Sobolev 注意力”、“微分注意力”、“Chebyshev 注意力”、使用其他积分变换的注意力之类的东西。

连续中的连续,离散中的稳定

对于不熟悉希尔伯特背景下算子方程近似的人来说,按照本文的思路,最大的困惑可能是:

使用双线性形式定义键到值的映射。这种双线性形式定义在两个无限维希尔伯特空间上,但为什么论文只给出了它在有限维 离散近似空间上的下界?

答案很长。在写这篇论文之前,我读了关于第一篇论文的评论 ⁷试图使用 Mercer 核以数学严谨的方式解释近似容量。他们的证明主要是将早期开创性工作中的一个移植到巴拿赫·spaces⁸.的背景中从他们提交 arXiv 的时间来看,可以有把握地假设他们也向 NeurIPS 2021 提交了他们的工作(尽管没有使用 LaTeX 模板)。

在他们提交的 ICLR 2021 年申请的公开审查页面中,审查者 1 提出了这个关键的有见地的问题:

论点中的另一个弱点是,核随着随机梯度下降的每一步而变化。也就是说,参数 W^Q 和 W^K 被更新,这改变了核函数。结果,变压器的训练不在单个再生核 Banach 空间中操作。

这是 Mercer kernel 论文的作者没有用明确的论据直接回答的主要问题之一。事实上,在操作员学习的背景下,答案很简单:

即使 Transformer 提供了序列长度不变的性能,例如,在 n=512 上训练的模型可以在 n=512 或 n=2048 上提供相同的评估误差;对于单个样本,提供的近似是通过具有 n 个网格点的离散空间。因此,该理论可以用动态变化的有限维近似空间 来表述,但只有一个无限维的潜在希尔伯特(或巴拿赫)空间

例如,在ω的 n 个网格点采样的连续分段线性函数的空间,无论那个 n 有多大,都是*L(ω)*的子空间。每个单个样本的近似是在离散水平上完成的。近似空间通过优化动态更新,但底层无限维希尔伯特空间( LH 等,甚至像 Lᵖ 这样的巴拿赫空间)没有变化!

我觉得对于 Mercer kernel 论文来说,这是一个错失的机会,因为近似理论是建立在无限维的背景上的。Transformer 架构的近似能力仍然受限于有限维子空间,受限于d_model,这是在我们的“面向列”解释中支付的基函数的数量。

[7]:赖特,硕士,冈萨雷斯,J. E. (2021)。变形金刚是深度无限维的非 Mercer 二进制内核机器。arXiv 预印本 arXiv:2106.01506 。

[8]:奥野,a .,哈达,t .,&下代拉,H. (2018,7 月)。基于神经网络的多视角特征学习概率框架。在机器学习国际会议(第 3888–3897 页)。PMLR。

收场白

NeurIPS 2021 委员会决定将清单放在提交模板的末尾:

NeurIPS 论文清单旨在鼓励负责任的机器学习研究的最佳实践,解决可重复性、透明度、研究道德和社会影响等问题。

我个人非常喜欢这个清单。它指导我,一个在这个领域完全是新手的人,通过准备论文,并教会我在 ML 研究中的以下良好实践:

  • 承认别人的资产(代码、数据集);
  • 用可再生/可复制的代码和指令展示 ML 研究;
  • 报告关于不同种子的误差条/带。

受到这份清单以及 LieTransformer 论文中致谢的启发,我感谢在这个小项目过程中启发我的每个人,即使这只是在一次偶然的随意交谈中的一句俏皮话。

原载于 2021 年 6 月 6 日https://scao math . github . io

Gallia:数据转换库

原文:https://towardsdatascience.com/gallia-a-library-for-data-transformation-3fafaaa2d8b9?source=collection_archive---------27-----------------------

用于实际数据转换的模式感知 Scala 库:ETL、特性工程、HTTP 响应等

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

约书亚·索蒂诺Unsplash 上拍摄的照片

Gallia 是一个用于通用数据转换的 Scala 库,重点关注实用性可读性可伸缩性(如果需要的话)。

这是一个个人项目,是我在对现有工具失望多年后开始的。它旨在帮助数据工程师完成工作,而不必在需要时放弃可伸缩性。它还旨在填补像 pandas 这样的库(对于那些重视 Scala 这样的强大类型系统的人)和 Spark SQL 这样的库(对于那些发现 SQL 很难理解特定查询复杂性的人)之间的空白。更一般地说,它是为应用程序中的大多数或所有数据转换需求提供一站式范例而创建的。

它的执行发生在两个阶段,每个阶段遍历一个专用的执行有向无环图(DAG) :

  1. 初始的阶段完全忽略数据,并确保转换步骤是一致的(模式方面)。
  2. 随后的数据阶段,在此阶段数据被实际处理。

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

图片通过 LogoGround 授权给 Anthony Cros。

微不足道的例子

下面是一个非常基本的用法示例:

这样就会成功打印: {" 姓名 ":"托尼】, 年龄 ":40}

但是,由于 Gallia 支持模式,因此在实际处理任何数据之前,以下操作将会失败:

因为递增字符串(通常)是无意义的,初始的“元”阶段将返回一个错误,抱怨字符串不能递增。

注意事项:

  • JSON 因其作为对象符号无处不在而被用于所有示例,然而 Gallia 并不是 JSON 特定的数据序列化或内存表示(见 JSON 缺陷
  • 这里实际上推断出了模式,这更简洁,但通常并不理想(参见改为提供模式)

更复杂的例子

让我们来看一个更复杂的用法例子。您的老板比尔向您提供了以下电子表格(优雅地被甩为 TSV):

雇员

项目

问题

他希望您为公司( Initech )的每位员工创建一份报告,并基于以下模板对“W2K”和“W3K”进行项目设计:

代码和数据

您可以使用 Gallia 和以下代码实现上述结果:

这个例子的可运行代码可以在 github 上找到。存储库还包含输入和输出数据,以及所有中间顶级模式/数据对的转储,这将有助于澄清任何不明确之处。例如,如果我们考虑上面的第 31 行(生成 is_manager 字段),我们可以找到所有的中间体文件,如下所示:

请注意,这不是一个标准的 Gallia 特性,只是为了本文的方便而提供的。还要注意,每个步骤只提供第一个数据实体。

EDIT: 我还增加了一个手动对应物,可以很容易的和 Gallia 加工相比。手动对应物专门使用标准库。

游戏攻略

上面的转换步骤尽可能不言自明。例如,.remove(“Employee ID”)就是这个意思:“雇员 ID”字段将不再存在。

相反,我们将在下面详述一些更复杂的操作。

嵌套操作

第一个嵌套操作很简单:

.nest(“first”, “middle”, “last”).under(“name”)

它基本上把一个实体:

{【第一个 ”:【彼得】、 中间 :【罗恩】、 最后 :【长臂猿】、…}

到…里面

{姓名:{【彼得】, 中间 【罗恩】, 最后 【长臂猿】},… }

然而,第二个嵌套操作(有意地)更加复杂:

*.renest{ **_.filterKeys(_.startsWith(“Address”))** }.usingSeparator(“ “)*

它利用了两种机制:

  • 通过谓词选择一个键的子集,即这里的startsWith(“Address”)
  • 使用一个普通的分隔符重新嵌套,即这里的空格字符

目标选择集中在仅有的四个带有“地址”前缀的字段上。同时,重定机制使用提供的分隔符来重建隐含的嵌套:

因此我们从:

*{
  ...
  "Address number":  9,
  "Address street": "Channel Street",
  "Address city"  : "Houston",
  "Address zip"   :  77001,
  ...
}*

收件人:

*{
  ...
  "Address": {
    "number":  9,
    "street": "Channel Street",
    "city"  : "Houston",
    "zip"   :  77001
  },
  ...
}*

请注意,这是处理已被“展平”以适合矩形格式的数据的典型方式。

更多关于 Gallia 重新嵌套的细节可以在这里找到

进行操作

*issues.bring(projects, target = "Name", via = "Project ID" <~> "ID")*

该语句可以用简单的英语理解为“通过匹配字段将字段名称项目带入问题*”。这里,我们必须显式地命名匹配的字段,因为它们的键不同(“项目 ID” vs “ID” ),否则它们可能会被猜到。*

""是一种特殊类型的左连接。当一个人只想用来自另一个数据源的几个字段来扩充数据时,可以方便地使用它。这与以下情况形成对比:

  • *Gallia *join,对应于同名的 SQL 操作,因此意味着潜在的反规范化。
  • A Gallia co-group ,对应于同名的 Spark 操作:没有反规格化,但是分组的边分别嵌套在 _left_right 字段下。

透视操作(嵌套)

*.transformObjects(“issues”).using {
  _ .countBy(“Status”) // defaults to “_count”
    .pivot(_count).column(“Status”)
      .asNewKeys(“OPEN”, "IN_PROGRESS", “RESOLVED”) }*

这里要注意的第一件事是,我们将转换应用于嵌套元素,而不是每个实体根处的数据元素。下划线在 Scala 中有特殊的含义,因此对应于嵌套在 issues 字段下的每个实体(在前面的 group-by Employee ID 操作中,参见中间元数据数据)。

从这里开始,对于所有这样的“发布”实体,我们按状态进行计数(打开进行中已解决*),然后对该计数进行透视。也就是说,如果这些是给定受让人的问题:*

那么计数操作导致:

该支点导致:

应该注意的是,.asNewKeys(“OPEN”, “IN_PROGRESS”, “RESOLVED”部分是必需的,因为——非常重要 Gallia 在整个转换过程中维护一个模式。在目前的情况下,状态的值只能在查看整个数据集后才能知道,因此必须提前提供。关于这个问题的更多细节也可以在文档的模式和【T21(DAG)】标题部分找到。

未来文章

*在以后的文章中,我想讨论使用替代技术实现相同结果的方法,如 *SQL、Spark sql、pandas、等(与这个想法相关)

我还想讨论如何使用内置 Gallia 的 Spark RDDs 扩展上述转换(参见文档)。上面的例子是有意忽略的,但是如果数据包含数十亿行,代码将不能像现在这样处理它。

结论

对于现实生活中更复杂的例子,参见这个知识库。另请参见示例的完整列表

Gallia 的主要优势可以总结如下:

  • 提供最常见/有用的数据操作,或者至少预定
  • 领域专家至少应该能够部分理解的可读 DSL。
  • 扩展不是事后的想法,需要时可以利用Spark rdd*。*
  • 元感知,意味着不一致的转换会尽可能地被拒绝(例如,不能使用已经被移除的字段)。
  • 可以处理单个实体,而不仅仅是其集合;也就是说,没有必要创建一个实体的“虚拟”集合来操作那个实体。
  • 可以以自然的方式处理任何多重性的嵌套实体。
  • 可用于与 case 类层次的平滑集成。
  • 提供灵活的目标选择,即作用于哪个(哪些)字段,范围从显式引用到实际查询,包括涉及嵌套时。
  • 执行 DAG 是充分抽象的,它的优化是一个很好分离的关注点(例如谓词下推、剪枝等);但是请注意,目前很少有这样的优化。

Gallia 仍然是一个相当新的项目,因此我期待着它的任何反馈!主存储库可以在 github 上找到,而父组织包含了所有相关的存储库。

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

根据 Anthony Cros 的许可,图片来自 LogoGround。

脚注

还要注意的是,带来 / 加入 / 协同组对多个按键的操作还不可用:参见任务多个按键( t210304115501 ) 。解决方法是生成一个临时字段。

权力的游戏和编程语言#第二部分

原文:https://towardsdatascience.com/game-of-throne-and-programming-language-7606f4da8027?source=collection_archive---------36-----------------------

数据科学

r,SQL,Python,Ruby。作为一名数据科学家,如果《权力的游戏》角色是编程语言会怎样?

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

KyloUnsplash 上的照片

首先,我要感谢你。第一篇文章在 Medium 和 Twitter 上一飞冲天(超过 15000 次浏览和 350 次鼓掌)。我对此心存感激。我要感谢大家的支持。正如我所承诺的,这是第二部分。

让我们回顾一下到目前为止我们所看到的。

在开始之前,我建议你阅读发表在 TDS 上的第一部分,以获得第一个角色的第一个概述,因为本文中的不同角色将引用它:

在这篇文章中,我们将探索戴维·贝尼奥夫和乔治·马丁的剩余角色,并作为一名数据科学家,从编程语言丛林的历史和复杂性中获取更多信息。

探索以下房屋后:

  • 严肃的;R1SE 何洛洛
  • 坦格利安
  • 兰尼斯特
  • 拜拉席恩

在本文中,我们将介绍其余的关键人物,并想象世界各地的数据科学家每天都会使用哪些工具。

本文涉及的人物有山姆威尔·塔利、梅丽珊卓、瓦里斯勋爵、波隆、玛格丽·提利尔和拉姆齐·波顿。

我希望你喜欢这个故事。

让我们从一门你每天都必须使用并且总是在幕后的编程语言开始:SQL。

瓦里斯勋爵— SQL

比如 SQL,瓦里斯勋爵总是在幕后。你可以为银行、汽车行业甚至建筑商工作,SQL 或者瓦里斯勋爵将会提供你需要的所有信息。

Gif 来自 Giphy.com

通过发送他的“小鸟”(瓦里斯抚养的孩子,帮助他获得所有的秘密)对不起…小查询,瓦里斯勋爵不停地收集维斯特洛的每一个人和每一件事的数据,再次抱歉…在你的公司。

等待您的管理特权,您将无法访问相同的信息,拥有它将始终是一个至关重要的附加值。而且,说到底,唯一知道维斯特洛/你们公司每个人的一切的人就是瓦里斯大人/SQL。

此外,他被设计成能够轻松地与多个角色(兰尼斯特、坦格利安、史塔克……)合作。在这个系列中,当 SQL(又名瓦里斯勋爵)与强大的编程语言 Python ( 提利昂·兰尼斯特)结合在一起时,一切都变了。两者的结合帮助数据科学征服了世界。

山姆威尔·塔利河

山姆威尔·塔利是维斯特洛的学者。总是好的一面,人人都爱 R 和山姆威尔·塔利。即使他不是最重要的 GOT 字符,他仍然是健壮的,并有助于获得关于您存储的数据的见解。

如山姆威尔·塔利,R 很少探究企业环境。但它是学者、理学硕士和博士生使用的主要编码语言之一。

Gif 来自 Giphy.com

与 R 类似,山姆威尔·塔利非常适合阅读许多旧书,这些旧书会对你的数据提供有益的见解。如果您想在数据集内运行预测或时间序列分析,R 非常适合导入额外的库,如机器学习和统计库。

波隆——坚固

波隆维斯特洛的另一个主角。波隆,如雷贯耳,可以佩服他处理合同的能力。因为他们不忠于任何一方,看起来都像雇佣兵,但如果你想在双方之间达成一个透明干净的协议,他们都是必不可少的。

研究如何编写智能合同…这相当于在早期互联网时代学习 HTML 和 Java。威廉·穆加耶

Solidity 正在使用区块链编辑越来越有名的**“智能合同”。**比如波隆在第三季到第六季之间,波隆填补了提利昂·兰尼斯特和他妹妹之间的桥梁。与稳健类似,随着时间的推移,波隆赢得了信誉和影响力。

在早期阶段,稳健和它处理货币合同的方式变得越来越重要,对不起…随着时间的推移。

梅丽珊卓-鲁比

Gif 来自 Giphy.com

不仅红色是梅丽珊卓和红宝石的共同点④。比如梅丽珊卓, Ruby 可以让任何应用在一夜之间看起来年轻清新(即使,如果你以为它永远死了)。

即使 Ruby 不是一种年轻的语言,但由于 Ruby 的 web 框架,它在年轻的创业公司中越来越有名,使他们的应用程序看起来新鲜。

如果你还没有用过,可以肯定的是,以后还会遇到😃。

下一个角色,如果玛格丽·提利尔是一种编程语言呢?

玛格丽·提利尔——斯威夫特

有人记得我们是如何开始忘记目标 C 的吗,抱歉,是君临的珊莎·史塔克?

像 Swift 这样的编程工具已经被创造出来,用一种更加用户友好的编程语言取代 Objective C。可以问每个 Python 开发者;大家更喜欢斯威夫特。

Swift 是一种通用的开源编程语言,由 Apple 开发,用于取代 Objective-C。它受 Python 的影响很大,因此速度快,非常容易学习。

今天,许多程序员已经做出了改变。像斯威夫特这样的玛格丽特·提利尔用她的热情、简单、礼貌和对开发者的友好吸引了君临的人们。

但是不要小看珊莎·史塔克,她在网络中还有强大的盟友,抱歉……维斯特洛和现实世界中的很多公司还在和客观 c 打交道

第二部分将以整个系列中最糟糕的角色结束,让我们来谈谈属于最古怪的编程语言中最令人毛骨悚然的角色。

拉姆齐·博尔顿——brain f * CK

我相信没有什么可说的了——名字本身就说明了一切。对于记得他的人来说,拉姆齐·波顿是整个维斯特洛最残忍的角色。

Brainfuck(3)是一种深奥的编程语言,仅由八个简单的命令组成。如 Ramsay Bolton,它的设计不是为了实用,而是为了挑战开发者,给他们造成痛苦。

Brainf*ck 在创建几年后就去世了,没有人会后悔。

Giphy.com gif

这是这个列表的最后一个字符。我让你自由地分享你关于其他字符和编程语言的想法。

如果你想更多地了解其他角色,如瑟曦·兰尼斯特、奈德·史塔克或丹妮莉丝·坦格利安,以及哪些角色属于 Python、C++和 Javascript,我强烈推荐你阅读《T4》第一部。

特别感谢安德里亚斯·穆勒希亚拉·奥尔森 & 塞尔吉·叶夫图申科分享他们的创作思想。

我希望你喜欢这篇文章,即使它没有通常那么专业,但仍然与数据科学有关。如果你想了解更多关于编程语言的知识,你可以在下面找到一些资源。

感谢您的关注

快乐编码

成为提利昂·兰尼斯特:

正如个人数据科学家提示,如果你想从零开始学习 Python,了解更多算法交易,成为下一个提利昂·兰尼斯特,我强烈推荐这门课程:

https://www.udemy.com/course/learn-algorithmic-trading-in-one-day/?couponCode=TDSCIENCE

来源:

(1)迈向数据科学#第 1 部分:

(2)大纲— Brainfck:

https://theoutline.com/post/825/brainfuck-coding-languages?zd=1&zi=zwoxtyke

(3)维基百科— Ruby:

https://en.wikipedia.org/wiki/Ruby_(programming_language)

博弈论、Python 和晚餐

原文:https://towardsdatascience.com/game-theory-python-and-dinners-4732ff59bdbb?source=collection_archive---------43-----------------------

博弈论和纳什均衡的直观介绍

2020 年的大部分时间我们都在房子里,但一旦封锁放松,我和我的朋友们就会大约一个月见一次面,一起吃顿饭或喝喝咖啡。在哪里见面一直是一个众所周知的问题。其他两个朋友都在重要部门工作,所以他们不得不去他们的办公室,而我是被“授予”计划部分的人(我不太喜欢)。

考虑到他们对美食的偏好以及他们在城市中最喜欢去的地方,我通常会以一种我必须去的地方最少的方式提出选择(邪恶的笑声😈)

他们都住在城市的北部,所以在北部见面对他们来说是最合适的。我在中部的某个地方,更喜欢那里。此外,鉴于我们生活在一个大城市,在这个城市的任何地方都不缺乏好吃的地方,但供应他们最喜欢的菜肴的餐馆位于这个城市的不同地方。

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

食物大战(来源: Pixabay

要问的问题:给定某一天的地点和美食的倾向,我的朋友们会选择什么地方作为不联系对方而一致见面吃饭的地方?

一点背景

简而言之,博弈论是对描述理性决策者( 我这里的朋友 )之间互动( 选择在哪里见面 )的数学模型的研究。很公平!

游戏的结果——预测游戏结果的一种方法是确定每个玩家的优势策略。优势策略是对给定玩家来说最好的策略,而不管其他玩家的选择如何( 【无论哪里适合我的朋友)——所以不管朋友#2 做什么,朋友#1 的优势策略就是朋友#1 的最优策略。

玩家()选择的一组占优策略( 地点见 )称为纳什均衡。这被称为均衡,因为任何一方都不会因为改变他/她的选择而获得额外的利益。

简单来说,纳什均衡是一条法律,即使没有警察,也没有人想打破这条法律。违法对个人没有任何好处,他们不会获得任何额外的东西。人们观察交通信号并根据灯的颜色停车/前行就是这样一种现象。

让我们调查一下

我们将首先为我的朋友们关于见面地点的各种选择创建一个收益/困惑矩阵

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

选择去城市哪个部分的收益矩阵(图片由作者提供)

阅读上面的矩阵相当简单;如果朋友 1 选择“北部”,朋友 2 选择“中部”,那么回报将是 1,5(第 2 行,第 1 列),这将使朋友 2 与朋友 1 相比处于有利位置。

我们想找到每个朋友的优势策略。在这种情况下,我们可以观察到,对于这两个朋友,优势策略是到达中心部分(第一行,第一列)。如果朋友 1 的策略从中部变为北部,那么他的收益会从 2 变为 1,这是不可取的,如果朋友 2 从中部变为北部,那么她的收益也会从 2 变为 1

所以,两个朋友都选择来到城市的中心。去北部是一个 理想 结局,但理想不一定是 最优

Python 实现

让我们看看能否用 python 得出上面的结论(选择(22)即两者都选择中心部分)。要使用的库是 Nashpy,使用 pip 非常容易安装

 *pip install nashpy*

根据上面描述的支付矩阵为每个朋友创建一个单独的支付矩阵。

Nashpy 很容易地将矩阵转换成游戏。我会把这个游戏叫做“location _ war _ inter _ friends”。

它产生了一个双矩阵博弈,收益矩阵如下

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

这些收益矩阵将用于计算纳什均衡,这在本库中非常简单。

纳什均衡很重要,因为它让我们对复杂系统中的突现行为有了初步的了解。在这种情况下,平衡达到于:

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

它由两个向量组成,表示每个朋友的动作:friend_1 [1,0 ]和 friend_2 [1,0]。第一个位置的 1 表示他们都将选择’ 【中央 ',并举例说明和具体化我们上面的假设。

你可以在这里查阅 GitHub repo 中相当简单的代码。

结论

我们看到,尽管北方是最佳地点,但根据强大的博弈论,他们最终选择了中央,而我必须走的路最少 😀

这仅仅是我们在日常生活中玩的游戏的一个例子,却没有意识到。在现实世界中,由于社会条件和外部因素,我们总是最终做出妥协,最终选择不是最优的选项。这是一个有趣的观察结果,因为我们看到了我们周围的世界,例如,我们知道减少碳足迹对所有国家都是必要的,但大多数国家最终选择了次优路线。

参考文献:

  1. https://nashpy . readthedocs . io/en/latest/tutorial/index . html # creating-a-game
  2. https://simplicable.com/new/game-theory
  3. https://www . science direct . com/topics/neuroscience/game-theory

进一步阅读

我翻阅了威廉·斯巴涅尔的《博弈论 101》,发现这是一本令人愉快的书。它是根据他的 YouTube 系列改编的。

机器人游戏

原文:https://towardsdatascience.com/games-for-bots-7a73ad2c70?source=collection_archive---------33-----------------------

人工智能很难

使用 NLP 列出多组事物

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

图片由 GraphicMama-teamPixabay这个地址拍摄。

在这篇文章中,我们将深入研究在一个计算机化的系统中由人类参与者执行的任务的自动化。

在 2020 年的一次关闭期间,我为我的孩子创造了一个简单的记忆游戏,让他们在睡觉前玩。记忆游戏是这样的:

  1. 选择一个主题(例如,食物)
  2. 轮流说出适合该主题的事物的名称(如黄瓜、西红柿)。我们后来添加了一个规则,你只能给未加工的东西命名,因为我们得到了近似的复制品(例如,芝麻面包、洋葱面包、肉桂面包、十字面包等)。).
  3. 你命名的每一个事物都被隐藏起来,这样你就能记住哪些事物已经被命名了。如果你连续玩了几个游戏,记得听到了一个名字,但不记得是这个游戏还是之前的游戏,那就更难了。
  4. 如果你在游戏中说了别人已经说过的话,你就出局了,不能再轮流上场。

孩子们被鼓励编造答案以推迟就寝时间。这是游戏的代码:

是的,10 行。这就是你所需要的。它在 jupyter 笔记本上运行。

下面是游戏运行的一个简单例子:

Player 1: Cucumber
Player 2: Lettuce
Player 1: Banana
Player 2: Celery
Player 1: Apple
Player 2: Cucumber
Computer: Cucumber was on the list! You are OUT!

然后一号玩家赢了。

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

在 Collab 笔记本上运行的记忆游戏示例。图片由作者提供。

我们最终增加了第二个游戏,它更注重词汇而不是记忆,你必须猜一个单词是真是假。真词来自一个大列表,假词来自另一个大列表。

下面是第二个游戏的代码:

像第一个游戏一样,每个人在开始时轮流,越来越少的玩家幸存下来,直到只剩下一个玩家(赢家)。

今年,我对自己说,这些游戏可以作为一个机器学习项目的试验场。第二个游戏可以用字典或其他一些基于记忆的方法来解决。然而,关于第一个游戏(记忆游戏),你注意到的第一件事是,在代码中没有关于选择什么是好单词的规则。这只是我在我们玩的时候强调我认为有意义的新词。

自动化记忆游戏

我们需要做的第一件事是为更结构化的实现准备内存游戏。话题选择(如食物)不在规范范围内。在与人对战的电脑版本中,我们需要明确主题选择。我们可以在游戏开始时从主题中挑选 5 个单词来定义主题,而不是列出每个可能的主题和主题中的单词。这在学术文献中被称为 种子集 。这方面的研究工作还有很多例子,比如这个这个

为了使我们的代码能够玩游戏,我们需要让我们的计算机游戏玩家在它还没有看到的主题中选择单词。您可能想知道这项任务有什么新内容。为什么不简单地使用嵌入向量相似性,并获得与某个起始单词相似的单词集?例如,word2vec 和 fasttext 具有相似的单词方法:

[word_vectors.most_similar](https://radimrehurek.com/gensim/models/keyedvectors.html) in gensim
[model.get_nearest_neighbors](https://fasttext.cc/docs/en/unsupervised-tutorial.html) in fasttext

答案是,词语语境相似不代表话题相似。在找和‘本田’同话题的词时,我们不要‘可靠’这个词。相反,我们想要“丰田”和“特斯拉”这样的词。尽管语义的相似性正在把我们带到我们想要去的地方,但是仅仅是相似的上下文还不足以从我们的主题词种子集中产生一个主题。

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

在“Word2Vec All”数据集中嵌入单词“Toyota”的投影结果。我们可以在列表中看到飞机、发动机和车辆,它们与单词“Toyota”相关,但不在我们要表达的汽车名称的主题中。图片由作者提供。

最近的工作叫做 FUSE,有一个很好的 MIT 许可,在这里可以得到,来自论文“ FUSE:通过 Skip-grams 的相干聚类进行多面集合扩展”。虽然他们不提供数据集,但我们可以尝试使用我们自己的维基百科数据集或类似的开源文本数据集。我们首先按照保险丝安装说明中的指示,为 gloVe 和 BERT 抓取预训练模型。这个冒险的完整代码可以在 这里 : 找到

https://github.com/dcshapiro/seriously-a-repo-just-to-upload-one-file-for-an-article/blob/main/Games_for_Bots.ipynb

我的第一次尝试是使用提供的 45471 个句子的数据集来训练集合扩展模型。它太小了,因此,正如在代码说明中指出的,它无法生成簇。聚类代码删除小的聚类。我没有试图联系提到的第三方以访问他们的数据集,这似乎是一个私人数据集。

对于我的第二次尝试,我将 NLTK 数据库 gutenberg、就职、brown 和 webtext 合并成一个 186,670 个句子的语料库。FUSE 集群代码仍然会删除小的集群,所以我删除了集群删除代码。结果很差。例如,给定种子词’ apple ‘,’ orange ‘和’ grape ',返回的扩展集是[‘music ‘,’ black ‘,’ musical ‘,‘葡萄’,’ white ‘,’ gold ‘,’ live ‘,‘名人’,’ green ‘,’ red ‘,’ royal ‘,’ star ‘,’ best ‘,’ rock ‘,’ new ‘,’ commercial ‘,’ radio ‘,’ country ‘,’ tv ‘,’ national’]。所以,我计划尝试一个更大的数据集。

对于我的第三次尝试,我打算在更大的 c4 数据集上进行训练,但后来我意识到我可以尝试另一个预训练库,这一次是来自以色列英特尔实验室。实际上,我把联系到了上面的研究中,但是先尝试了 FUSE。我想那只是我的运气。

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

英特尔 set 扩展预训练模型的输出示例。图片由作者提供。

英特尔集合扩展解决方案在第一次尝试中就成功了。他们的演示包中还有一个服务器版本和一个用户界面。以下是我最初实验的一些有趣结果:

  1. 种子词:‘苹果’,‘橘子’,‘葡萄’。扩展列表:‘梨’,‘杏’,‘桃’,‘榛子’,‘石榴’,‘樱桃’,‘草莓’,‘李子’,‘薰衣草’,‘杏仁’
  2. 种子词:‘兔’,‘马’,‘鸭’。扩展列表:‘野兔’,‘狐狸’,‘野猪’,‘鹿肉’,‘狗’,‘鹧鸪’,‘鸸鹋’,‘猪’,‘鸽子’,‘鹰’
  3. **种子词:‘**椅子’,‘桌子’,‘书桌’。扩展列表:‘书桌’,‘桌子’,‘椅子’,‘书桌’,‘梳妆台’,‘木板’,‘沙发’,‘椅子’,‘小桌子’,‘抽屉’。我们现在可以看到,该模型没有认识到一个对象的单数和复数形式是同一事物(例如,“书桌”与“书桌”)。该模型还没有删除停用词(例如,“书桌”与“书桌”以及“椅子”与“椅子”)。这可以通过简单的后处理步骤来解决。
  4. **种子词:**本田、福特、奔驰。扩展列表:‘山’,‘谷’,‘盎格鲁-撒克逊词’,‘古斯堪的纳维亚语’,‘设防的地方’,‘福特’,‘格伦’,‘凯尔特词’,‘福特’,‘摩尔人’。我们可以看到这个案子非常失败。“本田”和“梅赛德斯”这两个词不在车型词汇表中。这表明该模型区分大小写。由于只剩下单词“ford ”,该模型找到了在单词“ford”附近带有向量的单词。如果我们改为利用汽车品牌名称,我们会得到更好的结果。**种子词:‘**本田’,‘福特’,‘奔驰’。扩展列表:‘丰田’,‘日产’,‘法拉利’,‘宝马’,‘保时捷’,‘雷诺’,‘捷豹’,‘马自达’,‘迈凯轮’,‘梅赛德斯-奔驰’

注意,汽车名称不像 word2vec 结果那样包含与汽车相关的其他内容。这太棒了!

结论

我们现在可以看到,人们玩的某些文字游戏也可以被电脑玩。要做到这一点,需要训练计算机理解主题中包含的单词,集合扩展是实现这一能力的一种很好的方式。这些模型可以微调,也可以从头开始训练。

这篇文章的代码是,可以在这里找到

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

下次见!

——丹尼尔
linkedin.com/in/dcshapiroT21
丹尼尔@lemay.ai

甘沃——抽象修复

原文:https://towardsdatascience.com/gan-vogh-abstract-inpainting-63ab5da53b89?source=collection_archive---------39-----------------------

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

1:左:约翰·克莱伯格(阿尔布雷特·丢勒)的肖像——右:作者的图片。时尚数据培训网络。

人工艺术合成

I npainting 是一种根据原始内容以逼真的方式填充缺失像素来重建不完整图像的方法。目前,这个问题通常用深度卷积神经网络来解决。一种常见的解决方案是利用两种鉴别器架构来实现全局和局部一致性。全局鉴别器查看发生器的全部输出,局部鉴别器仅查看丢失像素的区域。

但是我们能做的不仅仅是猜测原文内容吗?为了生成艺术上有趣的图像,我们希望修复比原来更多的细节和抽象特征。虽然内容和风格确实可以完全不同,但是新生成的补丁和它周围的上下文之间的过渡仍然应该是平滑的。

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

图二。图片作者。

在这个实验中,我只使用正方形(瓷砖)作为随机放置在图像中的缺失区域。通常,学习修补和现有内容之间的平滑过渡可以通过空间折扣遮罩来实现。通过使用合适的损失函数,例如 L1 范数,比较屏蔽的输出和屏蔽的背景真相,屏蔽仅约束丢失面片边界处的像素。

接下来,我们看一下内容表示。我们的生成器架构应该生成与原始内容不完全匹配的内容。事实上,排除全局鉴别器正是我们想要的解决方案。在大多数情况下,本地鉴别器本身就足以为发生器提供有意义的梯度。令人惊讶的是,在剪贴画和卡通等非常简单的情况下,本地鉴别器会指导生成器重建逼真的图像补丁。

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

3:左:站着的男性形象(爱德华·沃兹沃斯)——右:作者图片。网络训练分形和重复艺术。

这一想法是由于与大规模图像合成相关的过高计算要求而产生的。在我的实验中,每个数据集包含大约 2000 张 512x512 像素的图像,图像块大小为 256x256 像素。我在一个 8GB 的混合精度 GPU 上对每个数据集进行了大约 4 天的训练。

一般来说,没有全局鉴别器,该体系结构需要较少的资源。GANs 适用于小图像,因此简单的架构就足够了。此外,随机改变输入图像中的瓦片位置对应于数据扩充过程,允许小得多的数据集足以用于训练。

推论

与机器学习中的最佳实践相反,用训练数据生成抽象图像会导致最有趣和一致的结果。应用到完全不同的图像内容仍然有效,但是,每个图块的边界在最终结果中可能是可见的(图 3)。

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

图 4。作者图片

在推理时,我的脚本从左上角开始递归地修补所有的瓷砖。为了给生成器提供所需的上下文,从整个图像中裁剪出一个较大的正方形部分,如果图块与图像边界相邻,则使用反射填充进行扩展。在处理下一个补丁之前,新创建的补丁将被插入到图像中。

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

3:左:柏树和两个女人(文森特·梵高)——右:作者的图片。网络培训海绵宝宝。

独立于训练数据,全局内容仍然在输出图像中表示。适合图像的补丁越多,单个补丁覆盖的信息就越少,从而可以重建更多的内容。细节被训练集的风格和内容所取代。

如果网络训练得不够好,或者输入图像远离训练域,则输出会变得非常嘈杂,图像上可能会出现补片边界。在某些情况下,网络会产生高度冗余的模式,类似于模式崩溃。

总之,我已经证明了抽象修复可以使用有限的资源产生具有精细细节的大型艺术品。它构成了一个有趣的和娱乐性的方法,应该进一步探讨!

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

图 4:谁住在海底的菠萝里?图片作者。

加尼拉——幻想增强版

原文:https://towardsdatascience.com/ganilla-fantasy-enhanced-d4918681820c?source=collection_archive---------22-----------------------

当人工智能和出色的插图画家携手点燃我们的想象力

李奥达甘李龙索夫达芙娜***。*****

在儿童故事中,世界充满了奇迹,疯狂的事情每天都在发生,你发现自己坐在人行道上靠近精灵或仙女也并不罕见。这种魔力在儿童书籍中栩栩如生,伴随着故事可以找到精彩的插图。但是如果机器可以为我们创造这种魔力呢?GANILLA 就是这样一个神经网络,在这篇博文中,我们将向你展示如何做到这一点!

什么是加尼拉?

GANILLA 是 GAN ( 生成对抗网络)的一种,它解决了儿童书籍插图领域的图像到图像的翻译问题**。在实践中,当你提供一张照片给一个训练有素的 GANILLA 模型时,它会根据特定插图画家的风格输出输入图像的插图。
在下图中,您可以在左侧看到一个输入图像,以及十个不同的输出图像——这是将输入图像输入到十个经过训练的模型的结果,每个模型都使用不同 illustrator 的数据进行训练。**

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

行动中的加尼拉:一个输入图像,十个不同的输出结果,模仿不同的插图艺术家(图像来源:加尼拉的论文: arXiv:2002.05638v2 )

虽然在加尼拉之前就有其他伟大的图像到图像的翻译模型,但这项工作有两个主要的创新点。虽然当前最先进的图像到图像翻译模型成功地传递了风格或内容,但是它们有时不能同时传递两者。在下面的图片中,你可以看到一个例子,其中 GANILLA 保留了原始输入照片的内容和所需插画师的风格。

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

与 CycleGAN 和 DualGan 相比,GANILLA 的两个输出示例(图片来源:GANILLA 的论文: arXiv:2002.05638v2 )

除了模型本身,本文还介绍了一种新的定量方法来评估图像到插图的模型。他们不是主观地评估图像,而是通过使用单独的分类器定义考虑内容和风格的指标来制定评估过程。

用于不成对图像到图像翻译的数据集

当处理图像到图像的翻译问题时,我们的数据可以是两种类型之一:成对图像或不成对图像。配对数据集是一个集合,其中每个输入图像都有一个预定义的输出图像。这是一种标记数据的形式。 pix2pix 数据集就是成对数据的一个例子。

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

来自 pix2pix 数据集的图像对示例

不成对的数据集由来自两个不同域的两个图像池组成,它们之间没有标记,也没有预定义的相关性。领域之间的映射是一个无监督的学习问题。输入域是自然照片,预期输出域是儿童书籍插图。

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

一个不成对的数据集:风景照片(第一排)和宫崎骏(第二排)的插图****

架构概述

加尼拉发电机

模型的核心是发电机。训练时,它将用于推理,即生成器将接收风景照片作为输入,并返回插图图像作为输出。
发电机有两部分;下采样(编码)阶段基于 ResNet,负责从原始图像中提取特征(输入图像内容)。上采样(解码)阶段是特征金字塔网络(FPN),并且负责从先前提取的信息中创建输出图示(输出图像风格)。
在 GANILLA 中实现的另一个概念是跳过连接。它在下图中用蓝线表示,顾名思义,它连接模型的各个部分,但不是以直接的方式,而是通过跳过一些层,并在模型中不连续的层之间传输信息。

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

加尼拉的发电机架构(图片来源:加尼拉的论文: arXiv:2002.05638v2 )

加尼拉的 D 是首席法官

与 GAN 模型一样,训练过程需要一个鉴别器来评估发电机输出的质量。从技术上来说,鉴别器是一种分类器,用于评估生成的图像是“真”还是“假”。
随着发生器和鉴别器一起接受训练,两者的作用变得更好、更准确,发生器产生更高质量的图像,而鉴别器在区分真假图像方面变得更好。

****加尼拉的鉴别器实现了 PatchGAN,一种在 pix2pix 论文中介绍的方法。PatchGAN 鉴别器或马尔可夫鉴别器不将整个图像分类为真实或伪造,而是将图像分成 NxN 个片段,并分别对它们进行分类。鉴别器在图像上卷积运行,平均所有响应以提供结果。与对整个图像进行分类相比,PatchGAN 鉴别器具有更少的参数,运行速度更快,同时实施更多的约束,以促进生成的图像中清晰的高频细节。

下图比较了不同 n 值的结果。发现 70x70 面片产生的结果最清晰,人眼可看到的拖尾伪影较少,但代价是空间和光谱维度(细节和色彩)的准确性较低。

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

PatchGAN 对于不同 N 值的结果(图片来源:pix 2 pix paper:arXiv:1611.07004 v3)

无监督对偶学习

为了从两个域的两组未标记图像中进行训练,GANILLA 使用了在 DualGAN 论文中介绍的方法。受自然语言翻译双重学习的启发,该方法在训练过程中使用两对生成器和鉴别器。
第一个也是主要的一个,G,是将用于推理的生成器。次要生成器 F 学习相反方向的映射:从目的域(Y,插图)到源域(X,风景照片)。用于训练的损失函数类似于 CycleGAN 纸上的损失函数。

损失函数与循环一致性和恒等性

加尼拉的损失函数是几个值的和。其中两个是两台发电机的最小最大损耗(BCE)。

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

将辅助生成器 F: Y → X 训练成主生成器 G: X → Y 的反函数。这将通过两个损失函数来完成:

  • 循环一致性损失: F(G(x)) ~ x 和 G(F(Y)) ~ Y 由 L1 距离强制。
  • 身份丢失: G(Y) = Y,F(X) = X 也受 L1 距离的影响。

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

F(G(X)) ~ X 的循环一致性性质的说明同样适用于 G(F(Y)) ~Y

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

恒等性质的说明:G(Y) = Y,F(X) = X

轮到我们了!

在阅读了加尼拉的论文并理解了架构之后,我们已经从头开始实现了它,并得到了我们的结果。我们使用相同的景观图像作为我们的源域。对于目的地领域,我们选择了宫崎骏https://en.wikipedia.org/wiki/Hayao_Miyazaki的作品,那是我们从网上刮下来的。我们的代码可以在这里找到,这里是我们的一些结果:

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

我们实现加尼拉模型的例子。上面的图像是原始照片,下面的是模型输出的插图图像

轮到你了!

想开始自己的深度学习副业?不确定从哪里开始?
这篇博文只为你!

想从 GANILLA 开始吗?

以下是一些有用的网址:

从零开始

原文:https://towardsdatascience.com/gans-from-scratch-19e917edf3ea?source=collection_archive---------31-----------------------

决斗神经网络

神经网络不仅限于学习数据;他们也可以学习创造它。其中一篇经典的机器学习论文是伊恩·j·古德费勒(Ian J. Goodfellow)、让·普盖-阿巴迪(Jean Pouget-Abadie)、迈赫迪·米尔扎(Mehdi Mirza)等人撰写的 生成对抗网络 (GANs) (2014)。gan 采用两个对立的神经网络的形式,一个学习生成假样本,而另一个试图将真样本与假样本分开。

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

VQGAN 根据来自 Flickr 的数据训练生成的风景。这些图像都不是真实的。来源

复杂的 GAN 模型,如 VQGAN 和其他模型,可以生成任何东西,包括假的风景、人脸,甚至是《我的世界》世界。

这些是我对第一次介绍 GANs 的经典论文的笔记。

设置

gan 基本上是由两个神经网络模型组成的两部分二元分类问题。第一个被称为生成器的模型接受仅由噪声组成的输入,并创建与它正在学习伪造的数据形状相同的输出。另一个模型是鉴别器,它接受真实和生成的输入,并输出数据是真实还是虚假的预测。

失败

理解生成器和鉴别器之间博弈的关键是价值函数和二进制交叉熵 (BCE)损失之间的联系。

论文中的等式解释了两者的目标。暂时忽略最小值/最大值部分,等式的其余部分描述了值函数、 V(D,G) 。值函数是鉴频器输出的对数的期望值, D(x) ,其中 x 取自真实数据加上对数的期望值 1 减去作用于所产生输出的鉴频器输出, D(G(z)) ,其中发生器的输入, z 取自噪声。

现在,再次查看最小值/最大值部分,生成器的目标是最小化值函数,而鉴别器的目标是最大化值函数。

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

但是价值函数和 BCE 有什么关系呢?下面是 BCE 损失的等式,其中 y 是真实标签,ŷ是模型预测。因此,如果真数据的标签是 1,假数据的标签是 0,则价值函数变成假数据损失的总和( y=0ŷ=d(g(z))和真数据损失的总和( y=1ŷ=D(x) )。等式的一半抵消了每次损失。

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

基于最小值/最大值约定,减号消失。下面绘制的价值函数说明了这一点。生成器的目标是让鉴别器将假数据误分类为真实数据,将真实数据误分类为假数据,对应于下面蓝色和金色曲线的低(最小)值。鉴别器的目标是正确地对每一个样本进行分类,这两个样本在两条曲线上都具有零值函数(最大值)。

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

GAN 值函数,发生器工作以最小化这些曲线上的值,而鉴别器试图最大化它们

培养

这两个模型一起训练。下面的代码展示了 TensorFlow 中的一个例子。首先,通过绘制一批噪声和一批真实数据来训练鉴别器。鉴频器损耗如前所述进行计算,并更新其权重。接下来,通过绘制另一批随机噪声并使其通过生成器来训练生成器。鉴别器对生成的数据进行分类,并根据生成器欺骗鉴别器的程度对其进行评分。基于该梯度更新发生器权重,并且重复该过程。

随着两个模型的训练,生成数据的分布(绿线)变得看起来像真实数据的分布(黑色虚线),直到鉴别器预测(蓝色虚线)不再能够区分,并预测真实和虚假输入的概率为 50%。

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

变速发电机输出分配和分类(来源

以下是在不同训练阶段的一些生成器输出示例。我使用 MNIST 数数据集来构建 GAN。随着时间的推移,随着生成器开始产生看起来像训练集的图像,鉴别器对其预测哪个样本是真的哪个样本是假的越来越没有信心。

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

不同时期的发电机输出

甘人很难训练。例如,在这个使用来自 MNIST 的单个示例的测试案例中,生成器在几百个步骤之后很快学会了复制示例 5。然而,随着训练的继续,发电机输出迅速偏离。发电机也可以发散回学习率过高的噪声。

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

不良培训设置导致的示例。发电机培训出现分歧。

管理两个网络之间的平衡也很困难。如果鉴别器太好,可能会导致训练问题,因此可能需要调整训练设置中的参数。

最先进的 GANs 在生成现实内容方面非常强大,可以用于善意和恶意。希望这些笔记有助于理解它们的基本工作原理。

你可以在这里找到我用来学习甘斯的笔记本

参考

甘斯卡皮斯:用人工智能创造新的印象派绘画

原文:https://towardsdatascience.com/ganscapes-using-ai-to-create-new-impressionist-paintings-d6af1cf94c56?source=collection_archive---------11-----------------------

实践教程

我如何在公共领域用 5000 幅印象派风景画训练 StyleGAN2 ADA

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

甘斯卡皮斯样本输出,图片由作者提供

这是我的第三篇关于尝试用生成性对抗网络(GANs)来创作美术的文章。前两篇文章关注的是通过使用图像增强来创作抽象艺术,但这篇文章关注的是创作印象派风景画。

我把 GANscapes 的所有源代码贴在 GitHub 上,把原画贴在 Kaggle 上。你可以在这里使用谷歌实验室创作新的风景画。

先前的工作

已经有几个项目和论文展示了如何使用 GANs 来创作风景画。昆士兰科技大学的 Drew Flaherty 的硕士论文题为“机器学习的艺术方法”,他在论文中使用了原始的 StyleGAN [1]。爱丽丝·薛(Alice Xue)在她的论文“使用生成性对抗网络进行端到端的中国山水画创作”中描述了 SAPGAN[2]。和刘等人在他们的论文中创造了一种轻量级 GAN,“实现更快和稳定的 GAN 训练以实现高保真少量拍摄图像合成”[3]。

下面是 StyleGAN、SAPGAN、Lightweight GAN 和 GANscapes 的绘画样本。

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

甘山水样本,自上而下,德鲁·弗莱厄蒂训练的风格甘、爱丽丝·薛的萨甘、刘等人的轻灵甘、作者的甘山水

GANscapes 概述

GANscapes 是一个利用人工智能的最新进展创造新的印象派风景画的系统。这张图显示了主要的系统组件。

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

**GANscapes 系统组件,**作者提供的图表

组件概述

以下是对 GANscapes 中使用的组件的简要概述。我将在本文后面讨论每个组件的细节。

我从 WikiArt.org 收集了印象派风景画的图片,并对这些图片进行处理以调整长宽比。然后,我使用 OpenAI 的剪辑模型[5]来过滤图像,以保留“好的”

我用这些图像来训练 NVidia 的 StyleGAN2 ADA [6],它有一个生成器和鉴别器网络。生成器从形式和风格的随机“潜在”向量开始创建新图像,并试图欺骗鉴别器,使其认为输出的图像是真实的。在将真实图像和生成的图像输入鉴别器之前,会使用自适应鉴别器增强(ADA)模块对其进行轻微修改,从而在图片中创建视觉多样性。

我再次使用 CLIP 根据用户提供的文本查询过滤输出图像。我再次使用生成器来创建一个混合了用户选择的样式和形式的图像。最后一步,我对最终图像进行后处理,以调整宽高比。

请务必查看文章末尾附录中的图片集,以查看更多结果。

收集图像

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

**阿让特伊塞纳河上的克洛德·莫内和他的秋天,**来源 WikiArt.org

我开始在实验室用自定义的 python 脚本抓取 WikiArt.org 的风景画。该脚本按字母顺序遍历网站上的每个艺术家。它检查艺术家是否被标记为“印象主义”艺术运动的一部分,以及他们是否生于 1800 年之后,死于 1950 年之前。然后,脚本遍历所有艺术家的画作,寻找公共领域中可用的“风景”类型的作品。然后,脚本使用艺术家和绘画名称作为文件名下载每个符合条件的图像,即 Claude-Monet _ landscape-at-giver ny-1 . jpg。系统找到了大约 5,300 幅符合这些标准的绘画。

这是一幅 WikiArt.org 印象派绘画的样本。

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

印象派风景画,来源 WikiArt.org

调整训练图像的纵横比

你会从上面的绘画样本中注意到,它们有不同的长宽比,例如,一些图像比其他图像宽很多。由于 GAN 系统在处理完美的正方形图像时效率更高,因此需要调整源图像的纵横比。通常使用三种技术来进行调整,各有利弊。我将以德加的瓦莱里索姆河湾景观为例,展示不同的方法。

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

信箱、中心切割和压缩格式,图片由德加制作,由作者格式化

上面第一幅图像中的“信箱”格式保持了图像的不剪切和不挤压,但在上下添加了黑条,使图像具有方形形状。信箱格式的问题是,整个图像被有效地缩小了尺寸,失去了分辨率,黑色部分在 GAN 训练中被“浪费”了。

第二个图像是“中心剪切”格式,它被剪切以保持图像的正方形中心。中心切割格式的问题是左右两边的图像明显丢失。

第三个图像被水平挤压成正方形。压缩格式的问题是绘画中的对象被扭曲了。例如,在这张图片中,风车变得更薄了。而且每幅画都会被挤压不同的量,这取决于原始的长宽比。

对于这个项目,我想出了一个混合技术,这似乎是一个很好的妥协。

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

1.27:1 矩形切割和 1.27:1 挤压格式,图片由德加制作,作者格式化

我的混合解决方案需要首先确定所有原画的平均长宽比,对于数据集来说是 1.27:1。接下来,我将每张图片裁剪成 1.27:1 的纵横比,拉出一个中心矩形。然后,我将裁剪后的图像水平压缩成分辨率为 1024 x 1024 像素的正方形格式,并将结果图像用于我的训练数据集。当 GAN 产生方形输出图像时,我将其缩放回 1.27:1,以匹配原始格式。这个过程的结果将是无失真的合成生成的图像。

这种“中心矩形”格式似乎是中心切割和挤压格式之间的一个很好的妥协,特别是因为原始的风景画是风景格式。然而,这种方法不能很好地处理横向和纵向混合格式的图像,因为它倾向于中心切割格式。源代码在的实验室里

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

Durand-Ruel 画廊的主展厅,Charles-Fran ois Daubigny 的蚀刻作品,来源https://www.pubhist.com/w30198

使用剪辑判断训练图像

仅仅因为一幅画在 WikiArt 上被标记为印象派画家的风景画,并不意味着它是这样一幅画的好代表。在我之前用 GAN 生成抽象艺术的项目中,我“手动选择”了源图像,这相当耗时(并且让我觉得有点“武断”)。对于这个项目,我使用了一个新的开源人工智能系统,名为 CLIP from OpenAI [5]来进行图像过滤。

OpenAI 设计了两个模型,一个图像编码器和一个文本编码器。他们在带有相应短语的图像数据集上训练这两个模型。模型的目标是使编码图像与编码短语相匹配。

一旦经过训练,图像编码器系统将图像转换为嵌入,即捕获图像一般特征的 512 个浮点数的列表。文本编码器将文本短语转换为类似的嵌入,该嵌入可以与图像嵌入进行比较以进行语义搜索。

对于 GANscapes,我将短语“印象派风景画”中的嵌入内容与 5300 幅画中的嵌入内容进行比较,以找到最符合该短语的图像。源代码在栏的这里。

根据 CLIP 的说法,以下是符合短语“印象派风景画”的前 24 幅图像。

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

顶级印象派风景画据剪辑,图片由作者提供,来源 WikiArt.org

还不错!对树和水的描绘似乎很多,但画风各异。下面是根据剪辑的底部 24 个图像。

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

【WikiArt.org】底印象派风景画据剪辑,图片由作者提供,来源

好吧,我明白为什么 CLIP 认为这些图像不符合“印象派风景画”这个短语了除了左边的两张灰度图像,大部分都是人物、建筑、抽象画等。

我看了一下 5000 大关附近的图像,似乎还过得去。所以在这 5314 张图片中,我把最下面的 314 张移到了一个名为“拒绝沙龙”的文件夹中,并把它们排除在训练之外。

生成对抗网络

2014 年,蒙特利尔大学的 Ian Goodfellow 和他的合著者提交了一篇关于 GANs 的论文[7]。他们想出了一种方法来训练两个相互竞争的人工神经网络(ann)来创建逼真的图像。正如我在本文开始时解释的那样,第一个 ANN 称为生成器,第二个称为鉴别器。发生器尝试创建真实的输出。鉴别器试图从来自生成器的假图像中辨别来自训练集的真实图像。在训练过程中,两个 ann 都逐渐提高,效果出奇的好。

去年,我创建了一个名为 MachineRay 的项目,使用 Nvidia 的 StyleGAN2 在公共领域创作基于 20 世纪绘画的抽象艺术品。此后,Nvidia 发布了新版本的人工智能模型 StyleGAN2 ADA,旨在从有限的数据集生成图像时产生更好的结果。

StyleGAN2 ADA 的一个重大改进是在训练过程中动态改变图像增强的数量。早在 2020 年 1 月,我就写过这方面的改进。

培训风格 GAN2 ADA

我在 Google Colab Pro 上对 GAN 进行了大约三周的培训。因为 Colab 每 24 小时超时一次,所以我把结果保存在我的 Google Drive 上,从它停止的地方继续。下面是我用来开始训练的命令:

!python stylegan2-ada/train.py --aug=ada --mirror=1
--metrics=none --snap=1 --gpus=1 \
--data=/content/drive/MyDrive/GANscapes/dataset_1024 \
--outdir=/content/drive/MyDrive/GANscapes/models_1024

我注意到 ADA 变量 p 的一个问题,它决定了在训练中使用多少图像增强。因为 p 值总是从零开始,系统每天需要一段时间才能回升到 0.2 左右。我在我的 StyleGAN2 ADA 的 fork 中修复了这个问题,允许在增强设置为 ADA 时设置 p (如果在使用 ADA 时设置了 p ,NVidia 的 repo 中的实现将会抛出一个错误。)

下面是我在随后的重启中使用的命令。

!python stylegan2-ada/train.py --aug=ada --p 0.186 --mirror=1 \
--metrics=none --snap=1 --gpus=1 \
--data=/content/drive/MyDrive/GANscapes/dataset_1024 \
--outdir=/content/drive/MyDrive/GANscapes/models_1024 \
--resume=/content/drive/MyDrive/GANscapes/models_1024/00020-dataset_1024-mirror-auto1-ada-p0.183-resumecustom/network-snapshot-000396.pkl

我用最后使用的 p 值和之前保存的模型的恢复路径替换了 0.186。

这是一些来自训练有素的 GANscapes 系统的样本。

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

不错!一些生成的绘画看起来比其他的更抽象,但总体来说,质量似乎很好。该系统倾向于很好地描绘自然项目,如树、水、云等。然而,它似乎正在与建筑物、船只和其他人造物体进行斗争。

使用剪辑来过滤输出图像

我再次使用剪辑模型来过滤输出图像。该系统生成 1000 幅图像,并输入 CLIP 以获得图像嵌入。用户可以输入一个提示,比如“秋天树林的印象派绘画”,它会被转换成一个嵌入的剪辑文本。系统将图像嵌入与文本嵌入进行比较,并找到最佳匹配。以下是符合“秋日树林”提示的前 6 幅画。

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

甘斯卡皮斯秋林系列,图片由作者提供

系统不仅为提示找到了合适的匹配,而且整体质量似乎也有所提高。这是因为剪辑系统有效地根据这些画与短语“秋天树林的印象派绘画”的匹配程度来对它们进行评级剪辑将过滤掉任何“时髦”的图像。

风格混合

你有没有想过 NVidia 为什么把他们的模型命名为 StyleGAN?为什么名字里有“风格”二字?答案在架构中。该模型不仅学习如何基于一组训练图像创建新图像,还学习如何基于训练数据集创建具有不同风格的图像。您可以有效地从一个图像中复制“样式”并将其粘贴到第二个图像中,创建第三个图像,该图像保留第一个图像的形式,但采用第二个图像的样式。这叫做风格混合

我构建了一个 Google Colab,演示了 GANscapes 的风格混合。它基于 NVidia 的 style_mixing.py 脚本。Colab 为它们的形式渲染了七幅风景,为它们的风格渲染了三幅风景。然后它展示了一个由 21 幅风景组成的网格,将每种形式与每种风格混合在一起。请注意,缩略图被水平放大到 1:127 的纵横比。

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

GANscapes 风格混合,图片作者

如您所见,表单图像从左到右显示在顶部,标记为 F1 到 F7。样式图像从上到下显示在左侧,标记为从 S1 到 S3。7x3 网格中的图像是表单和样式图像的混合。你可以看到这些树是如何被放置在七种形式的图像中大致相同的位置,并且以不同风格渲染的绘画使用相同的调色板,看起来好像它们是在一年中的不同时间绘制的。

图像后处理

我执行了两个后处理步骤,一个温和的对比度调整和图像大小调整,以恢复原始的纵横比。这是代码。

import numpy as np
import PIL# convert the image to use floating point
img_fp = images[generation_indices[0]].astype(np.float32)# stretch the red channel by 0.1% at each end
r_min = np.percentile(img_fp[:,:,0:1], 0.1)
r_max = np.percentile(img_fp[:,:,0:1], 99.9)
img_fp[:,:,0:1] = (img_fp[:,:,0:1]-r_min) * 255.0 / (r_max-r_min)# stretch the green channel by 0.1% at each end
g_min = np.percentile(img_fp[:,:,1:2], 0.1)
g_max = np.percentile(img_fp[:,:,1:2], 99.9)
img_fp[:,:,1:2] = (img_fp[:,:,1:2]-g_min) * 255.0 / (g_max-g_min)# stretch the blue channel by 0.1% at each end
b_min = np.percentile(img_fp[:,:,2:3], 0.1)
b_max = np.percentile(img_fp[:,:,2:3], 99.9)
img_fp[:,:,2:3] = (img_fp[:,:,2:3]-b_min) * 255.0 / (b_max-b_min)# convert the image back to integer, after rounding and clipping
img_int = np.clip(np.round(img_fp), 0, 255).astype(np.uint8)# convert to the image to PIL and resize to fix the aspect ratio
img_pil=PIL.Image.fromarray(img_int)
img_pil=img_pil.resize((1024, int(1024/1.2718)))

代码的第一部分将图像转换为浮点型,找到每个通道的 0.1%最小值和 0.99%最大值,并放大对比度。这类似于 Photoshop 中的调整色阶功能。

代码的第二部分将图像转换回整数,并将其大小调整为 1.27 比 1 的纵横比。这里有三幅风格混合的画,分别是后期处理前后的。

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

甘斯卡皮斯 F4S1,F7S2,F1S3 ,图片由作者提供

你可以点击每张图片仔细查看。

讨论

GANscapes 创作的风景画的质量可以归功于 StyleGAN2 ADA 和 CLIP 模型。

通过设计,StyleGAN2 ADA 可以在有限的数据集上进行训练,以产生出色的结果。请注意,GANs 生成的图像在图像间连续流动。除非输入图像被标记为分类,否则结果之间没有硬中断。如果输入的潜在向量改变一点,结果图像也会改变一点。如果矢量变化很大,图像也会变化很大。这意味着系统有效地从一个场景变形到所有可能的邻居。有时,这些“中间”图像会有奇怪的伪像,就像一棵树部分溶解在云里。

这就是 CLIP 的用武之地。因为它根据图像与文本查询(即“印象派风景画”)的匹配程度对图像进行评级,所以它倾向于挑选没有奇怪伪像的完整图像。CLIP 模型有效地解决了未标记 gan 的部分变形问题。

未来的工作

有几种不同的方法来改进和扩展这个项目。

首先,绘画的质量可以通过一种叫做学习转移的技术来提高。这可以通过首先在风景照片上训练甘,然后继续在风景画上训练来完成。

我可以通过多次迭代 StyleGAN → CLIP → StyleGAN → CLIP 等来改进文本到图像的生成。这可以通过像 CLIPGLaSS [9]中的遗传算法或者梯度下降和反向传播来实现。这与 Victor Perez 在 Medium [10]的文章中描述的训练人工神经网络的方法相同。

最后,最近关于不可替换令牌(NFT)如何被用来验证数字文件所有者的新闻让我想到了一个可能的 NFTs 甘混合体。潜在的收藏者可以出价购买一系列潜在向量,而不是购买单个 JPEG 文件的所有权,这些潜在向量在经过训练的 GAN 中生成图像和/或风格的变化。嘿,你们先在这里读吧,伙计们!

源代码

我收集的 5000 幅抽象画可以在 Kaggle 这里找到。这个项目的所有源代码都可以在 GitHub 上获得。Kaggle 上绘画的图像和源代码在 CC BY-SA 许可下发布。

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

归属共享相似

感谢

我要感谢詹尼弗·林和奥利弗·斯特瑞普对本文的帮助。

参考

[1] D. Flaherty,“机器学习的艺术方法”,2020 年 5 月 22 日,昆士兰科技大学,硕士论文,https://eprints . qut . edu . au/200191/1/Drew _ Flaherty _ Thesis . pdf

[2] A .徐,《端到端的中国山水画创作运用
生成性对抗网络》,2020 年 11 月 11 日,https://open access . the CVF . com/content/WACV 2021/papers/Xue _ End-to-End _ Chinese _ Landscape _ Painting _ Creation _ Using _ Generative _ Adversarial _ Networks _ WACV _ 2021 _ paper . pdf

[3] B .刘,Y .朱,k .宋,A. Elgammal,“实现高保真少镜头图像合成的更快和更稳定的 GAN 训练”,2021 年 1 月 12 日,

[4]维基百科,2008 年 12 月 26 日,https://www.wikiart.org

[5] A .拉德福德,J. W .金,c .哈勒西,a .拉梅什,g .高,s .阿加瓦尔,g .萨斯特里,a .阿斯克尔,p .米什金,j .克拉克等人,《从自然语言监督中学习可转移的视觉模型》,2021 年 1 月 5 日,https://cdn . open ai . com/papers/Learning _ Transferable _ Visual _ Models _ From _ Natural _ Language _ Supervision . pdf

[6] T. Karras,M. Aittala,J. Hellsten,S. Laine,J. Lehtinen 和 T. Aila,“用有限数据训练生成性对抗网络”,2020 年 10 月 7 日,【https://arxiv.org/pdf/2006.06676.pdf

[7] I .古德费勒,j .普热-阿巴迪,m .米尔扎,b .徐,D .沃德-法利,s .奥泽尔,a .库维尔,y .本吉奥,《生成性对抗性网络》,2014 年 6 月 10 日,【https://arxiv.org/pdf/1406.2661.pdf】

[8] S. Bozinovskim 和 A. Fulgosi,“模式相似性和迁移学习对基本感知机 B2 训练的影响。”信息研讨会会议录,1976 年第 3-121-5 期

[9] F. Galatolo,M.G.C.A. Cimino 和 G. Vaglini,“通过剪辑引导的生成潜在空间搜索从字幕生成图像,反之亦然”,2021 年 2 月 26 日,https://arxiv.org/pdf/2102.01645.pdf

[10] V. Perez,“使用 CLIP 和 StyleGAN 从提示生成图像”,2021 年 2 月 6 日,https://towardsdatascience . com/Generating-Images-from-Prompts-using-CLIP-and-style gan-1 F9 ed 495 ddda

附录—甘斯卡皮斯画廊

这是一组已完成的画。请注意,您可以单击放大任何图像。

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

为了无限制地访问 Medium 上的所有文章,成为会员,每月支付 5 美元。非会员每月只能看三个锁定的故事。

甘沙尔:用人工智能创造和管理艺术,以获取乐趣和利润

原文:https://towardsdatascience.com/ganshare-creating-and-curating-art-with-ai-for-fun-and-profit-1b3b4dcd7376?source=collection_archive---------1-----------------------

使用 CLIP 和 VQGAN 模型生成 ChromaScapes,即在 OpenSea 上作为 NFT 出售的高质量数字绘画

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

**由 GANshare One 创建的色彩场景样本,**作者提供的图片

2020 年 8 月,我第一次写了关于使用生成性对抗网络(GANs)来创造视觉艺术的文章。为了那个项目, MachineRay ,我用公共领域的抽象画来训练 NVidia 的 style gan 21】创作新的作品。从那以后,我又写了几篇关于使用 GANs 制作艺术作品的文章。从我收到的反馈中,我可以看出一些读者想学习如何制作数字艺术作品,作为不可替代的代币(NFT)在一个新兴的市场中出售。

如果你不熟悉加密货币和 NFTs,这里有一个简单的类比。

加密货币之于贵金属,就像 NFT 之于宝石一样。

每盎司纯金的价值都是一样的,但每颗钻石都是独一无二的,因此价值也不同。

为了这个项目,我一头扎进了 NFTs 的世界。我不仅创作并出售新创作的数字艺术作品,还出售受过训练的甘的“股份”,让其他艺术家制作他们自己的数字艺术作品,作为非数字艺术作品出售。我把这个概念叫做“GANshare”,我的第一个人工智能模型叫做 GANshare One。

GANshare One 组件

这是系统的高级示意图,其中简要描述了组件。再往下,你可以找到每个部分的细节。

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

**GANshare 组件图,**作者图片

我开始在公共领域收集来自 WikiArt.org 的 50,000 多幅画。然后我训练了一个新的人工智能模型,名为 VQGAN [2],是在德国海德堡大学开发的。VQGAN 有一个图像编码器、转换器和解码器,用于创建新图像,还有一个鉴别器,用于检测生成的图像部分是真实的还是生成的。

我使用 VQGAN 根据文本提示创建新的绘画。我从文本文件中自动生成提示,这些文本文件包含绘画风格、几何形状、地理位置的列表,以及大量颜色名称的列表。我使用 OpenAI 的 CLIP model [3]来控制 VQGAN 解码器,使用 Pytorch 库中的 Adam optimizer [4]生成一幅数字绘画来匹配提示。

我使用 ISR 超分辨率 Resizer [5]将图像放大到 1024x1024,并发布到 OpenSea 上作为 NFT 出售。你可以在这里查看艺术品的样品:https://opensea.io/collection/chromascapes

GANshare One 系统详情

本节将更详细地讨论我用来构建 GANshare One 系统的组件。

收集图像

类似于我为我的磁铁项目所做的,我使用一个定制的 python 脚本从 WikiArt.org 收集绘画作为训练数据。剧本按字母顺序浏览了网站上的每个艺术家。它检查了这些艺术家是否生于 1800 年之后,死于 1950 年之前。然后,它检查每个艺术家的画,以确保它们是在公共领域,然后将它们复制到我的谷歌驱动器的文件夹中。它找到了 52,288 张符合我标准的图片。

这里有一些我用来训练 GANshare One 的原画,来自康定斯基、梵高和毕加索等艺术家。

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

训练图片,来源 WikiArt.org

VQGAN

Esser 等人的矢量量化生成对抗网络(VQGAN)模型是一种用于生成高质量图像的混合 GAN/Transformer 模型[2]。

在他们题为“驯服高分辨率图像合成的变形金刚”的论文中,作者声明他们的方法学习…

…由上下文丰富的可视部分组成的码本,其组成随后用自回归转换器架构建模。离散码本提供了这些架构之间的接口,基于补丁的鉴别器支持强压缩,同时保持高感知质量。该方法将卷积方法的效率引入到基于变换的高分辨率图像合成中。帕特里克·埃塞尔、罗宾·龙巴赫和比约恩·奥默

这是他们的 VQGAN 架构图。

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

VQGAN 架构,来自 Esser 等人的驯服变压器用于高分辨率图像合成

在我收集了我的训练图像之后,我使用我的 Google Colab Pro [7]帐户使用这个命令来训练 VQGAN:

!python main.py -b configs/custom_vqgan.yaml --train True --gpus 0,

因为 VQGAN 是一个混合变压器模型,它在训练期间向您显示原始和编码的样本。下面是一组示例图像。

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

使用 VQGAN 的原始和重新编码图像,(左)WikiArt.org,(右)作者

你可以看到模型在重建原始图像方面做得很好,但它似乎对一些面部特征做了自己的事情,如眼睛和嘴巴。

总的来说,我发现 VQGAN 工作得很好。下表比较了经典 GAN 和 VQGAN 的一些特性。

**Feature             Classic GAN             VQGAN** Discriminator:      All-or-nothing          Sub-image
Output Image Size:  Fixed Size              Variable Size
Reverse Encoding:   Iterative Process       Trained Encoder
Image Generation:   New Images Look Good    Images Need Steering

对于 VQGAN,训练很快,因为图像的每个部分都由鉴别器检查,而传统的 GAN 使用全有或全无的方法进行训练。换句话说,VQGAN 中的鉴别器查看 4x4 网格中的 16 个子图像,并对每个部分给发生器一个向上或向下的大拇指作为改进的反馈。经典 GAN 中的鉴别器为整个图像向发生器提供单个拇指向上或向下。

对于经典的 GANs,输出图像总是固定大小。因为它与“代码本”一起工作,VQGAN 可以输出不同大小的图像。例如,我用 256x256 输入图像训练 VQGAN,并用它产生 512x512 输出图像。

例如,以下是以 256x256 和 512x512 渲染的提示“起伏的农田”的生成图像。

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

起伏的农田,渲染尺寸为(左)256x256 和(右)512x512,图片由作者提供

请注意 512x512 图像中的更多功能。这是因为 VQGANs 码本中的特征是以 256x256 的比例学习的,并被渲染为对更大画面的较小贡献。512x512 图像的输出类似于将多个晕影合并在一起。

经典的 GANs 没有用于反向编码的内置模型,反向编码是一种在给定任意真实图像的情况下寻找最接近的生成图像的过程。对于经典 GAN 来说,这必须通过迭代方法来完成,并且它并不总是工作得很好。然而,反向编码对于 VQGAN 模型来说很容易,因为它实际上是一种编解码器。它有一个将图像编码成嵌入的模型和一个将嵌入解码成图像的相应模型。

前三点都是 VQGAN 的优势。然而,第四点是很容易从经典的 GANs 产生输出图像。只要给它一些随机数,它就会生成一个好看的图片。但是 VQGAN 没有制作新图像的简单方法。如果给解码器一些随机数,输出的图像就不连贯了。VQGAN 需要由一些其他过程来控制,比如使用剪辑模型生成可识别图像的文本提示。

OpenAI 的剪辑模型

OpenAI 设计并训练了一个名为 CLIP 的人工智能系统,代表对比语言-图像预训练[3]。CLIP 系统有一个图像和文本编码器,它可以用来执行跨模态语义搜索,例如,你可以使用单词来搜索图像,正如我在我的 MAGnet 项目中所做的那样。

OpenAI 在带有相应短语的图像数据集上训练编码器。训练的目标是使编码图像与编码单词相匹配。一旦经过训练,图像编码器系统将图像转换为嵌入,即捕获图像一般特征的 512 个浮点数的列表。文本编码器将文本短语转换为相似的嵌入,该嵌入可以与图像嵌入进行比较以进行语义搜索。

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

对比语言-图像预训练(剪辑),OpenAI 图像

例如,如果您有一个图像数据库,您可以通过图像编码器运行每个图像,以获得图像嵌入的列表。如果您随后通过文本编码器运行短语“绿色草坪上的小狗”,您可以找到与该短语最匹配的图像。

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

待办事项清单,作者图片说明,基于莱克西·詹尼在 Unsplash 上的一张照片

生成提示

如上所述,GANshare 系统使用文本提示创建由 CLIP 控制的图像。比如说,如果你告诉 VQGAN+CLIP 创建一幅“橙色圆圈的抽象画”,它就会创建一幅。

为了画出大量的画,我生成了包含三个不同部分的提示:风格、主题和颜色。

经过试验,我发现这九种风格相当不错:抽象、立体主义、表现主义、野兽派、未来主义、几何、印象派、后现代和超现实主义。

对于主题,我从三个类别中选择:几何形状、地理特征和物体。我从伊万·马洛平斯基的单词表开始,为我的形状和地理特征列表做了一些调整。对于我的物品列表,我组合了由 COCOCIFAR 100 检测系统识别的物品列表,得到 181 个物品的列表。

我从维基百科中抓取了一份颜色名称的详细列表,并稍微编辑了一下,得到了 805 种独特的颜色。

这是四个列表中的前七个条目。

**shapes.txt   places.txt       things.txt          colors.csv** angles       an archipelago   an airplane         absolute zero
blobs        an atoll         an apple            acid green
circles      a beach          apples              aero
cones        a bay            an aquarium fish    aero blue
cubes        a butte          a baby              african violet
curves       a canal          a backpack          alabaster
cylinders    a canyon         a banana            alice blue
...          ...              ...                 ...

这里有一个链接到 Python 代码,它通过随机选择样式、主题和颜色来生成提示。

下面是代码生成的一些提示。

Futurist Painting of a City in Vivid Burgundy Brown
Abstract Painting with Diagonals in Beige Pink
Impressionist Painting with Prisms in Carolina Blue

现在我们有了一些有趣的提示,接下来我们将看看如何引导 VQGAN 生成相应的图像。

带夹子的转向 VQGAN

在我的 MAGnet 项目中,我使用了一个定制的生成算法,让 CLIP 操纵 StlyeGAN2 的一个变体,根据文本提示创建图像。在这个项目中,我使用了凯瑟琳·克劳森设计的算法,她是一位人工智能/生殖艺术家,在 Twitter 上以 RiversHaveWings 的身份发布帖子。为了使用 CLIP 控制 VQGAN,她使用 Pytorch 库中的优化器 Adam,Adam 代表自适应矩估计[4]。下面是算法的示意图。

请注意,这里有两个嵌入空间。CLIP 系统使用 512 个数的平面嵌入(表示为 IT ),其中 VQGAN 使用 256x16x16 个数的三维嵌入,表示为 Z

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

优化算法,图片作者

优化算法的目标是产生与文本查询紧密匹配的输出图像。系统首先通过剪辑文本编码器运行文本查询,以获得目标 T 。Adam 优化器从初始 VQGAN 向量 Zi 开始。它修改向量 Zn 以产生一个嵌入了剪辑 I 的图像,该图像试图匹配原始目标 T 。随着 I 接近 T ,输出图像将更好地匹配文本查询。

让我们看看该算法与上一节中的提示配合得如何。对于每个提示,我运行系统 200 次迭代。

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

未来主义者用鲜艳的勃艮第棕色画了一座城市

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

米色粉色斜线抽象画,图片由 GANshare One 提供

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

印象派画家用卡罗莱纳蓝棱镜作画,图片由 GANshare One 提供

果然,系统创建的图像似乎与提示相符。请注意优化算法是如何即兴发挥的。例如,不清楚第三张图片本身是否包含任何棱镜。但它确实在调色板中显示了一些彩虹色,暗示了光线通过棱镜的效果。

结果

在生成了数百幅数字绘画后,我注意到它们并不都是赢家。从形状类别中的提示生成的图像似乎具有最好的产量,即,大约 33%可以被认为是合理的。但地点和事物类别中的图片效果不佳,只有大约 20%的人保留。

下面是我判断的一些样品。

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

音速银棕色的对角线几何画(左)樱花粉色的城市几何画(中)台盼蓝的女孩几何画(右),图片由甘沙尔一

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

野兽派的宝石红色池塘画(左)薰衣草粉色吹风机抽象画(中)松绿色臭鼬抽象画(右),图片由甘沙尔一

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

芦笋棕色松鼠的后现代绘画(左)最大紫色岛屿的抽象画(中)白粉色野兽派自行车的绘画(右),图片由 GANshare One 提供

你可以在这里看到更多结果

在 OpenSea 上销售 NFT

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

每一天 —前 5000 天作者:毕普,来源:beeple-crap.com

自从 2021 年 3 月被称为 Beeple 的数字艺术家以 6900 万美元的价格出售了一份 JPG 文件以来,人们对使用区块链出售数字艺术产生了浓厚的兴趣

皮普尔的拼贴 JPG 是在二月份作为一种“不可伪造的象征”或 NFT 制作或“铸造”的。一个由计算机系统组成的安全网络将销售记录在一个被称为“区块链”的数字账本上,为买家提供真实性和所有权的证明。大多数人用以太坊加密货币支付。“Everydays”是佳士得售出的第一件纯数字 NFT,它提出接受以太坊付款,这对这家有 255 年历史的拍卖行来说是第一次。——斯科特·雷伯恩, 《纽约时报》

我考虑以 NFTs 的形式出售我的数字艺术,在进行了一点研究后,我发现使用多边形区块链[10]的 OpenSea 市场是一个很好的选择。这是出于成本和环境影响的原因。

OpenSea 允许创作者在以太坊区块链或多边形区块链(也称为 MATIC)上发布待售商品。下表显示了以太坊和多边形区块链之间的一些差异。

**Feature                      Ethereum         Polygon** Account initializing:        ~US$50           Free
Selling cost:                2.5%             2.5%
Selling items in bundles:    Yes              No
Blockchain validation:       Proof of work    Proof of stake
Environmental impact:        Huge*            Minimal*expected to change in Q1/Q2 2022

从表中可以看出,在 OpenSea 上建立一个帐户来销售多边形区块链是免费的,在这里使用以太坊区块链大约需要 50 美元。OpenSea 将从区块链的销售额中抽取 2.5%的销售价格。此外,在多边形区块链上不支持捆绑销售项目。

NFTs 的环境影响

两个区块链之间的另一个巨大差异是工作证明(PoW)与利益证明(PoS)验证的环境影响。

能量消耗是两种共识机制之间的一个主要区别。因为利害关系证明区块链不要求矿工在重复的过程中花费电力(竞争解决相同的难题),利害关系证明允许网络以低得多的资源消耗运行。—coinbase.com

根据多边形…

…最大的电力公司区块链每年可消耗 35-140 太瓦时的电力,持续消耗 3-15 吉瓦的电力。如果区块链是一个国家,它的年能源消耗将排在第 27 位,高于瑞典、越南和阿根廷。…相比之下,Polygon 的验证器每年大约消耗 0.00079TWh 的电力,大约持续汲取 0.00009GW 的电力,比主要的 PoW 区块链网络的能耗低几个数量级。— 多边形技术

经营区块链以太坊的人们清楚地意识到他们对环境的严重影响。他们计划在 2022 年中期转向利益证明验证。

…[ 2022 年]的升级代表着正式转向利益相关共识。这消除了对能源密集型采矿的需求,取而代之的是使用支撑以太网来保护网络。实现 Eth2 愿景的真正激动人心的一步——更高的可扩展性、安全性和可持续性。——【ethereum.org

建立一个 OpenSea 账户

建立以 NFTs 形式销售数字艺术的平台很容易(而且使用多边形区块链是免费的)。我跟随 OpenSea 的简单指示来到这里。一旦我建立了我的账户,我就把我的数码作品上传到这里,在这里出售,https://opensea.io/collection/chromascapes

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

色彩景观,作者图片

OpenSea 的一个很酷的特性是能够为待售商品添加属性。购物者可以使用这些属性来定义他们希望看到的商品。对于我的例子,我为生成的绘画添加了以下属性。

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

NFT 房产,图片作者

如果你有半打左右的项目,用户界面是可以的。但是如果你想卖 100 样东西,直接从 OpenSea 上传并列出要卖的东西是不容易的。

使用脚本批量上传项目

尽管 OpenSea 确实有一个 API 来自动完成特定的任务,但是他们的 API 没有自动上传和在他们的市场上销售商品的功能。这是不幸的,因为上传数百个文件将是一个真正的痛苦。

在阅读了 Jim Dees 关于使用宏程序发布 NFT 的文章后,我开始用我喜欢的语言 Python 来做这件事。正确设置后,我发现的 Selenium WebDriver 与我本地笔记本电脑上运行的 Chrome 浏览器配合得很好。

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

使用 Selenium 和 Chrome 上传和销售 NFTs ,作者配图

首先,我在一个文本文件中捕获了 NFTs 的所有元数据。它包括每幅画的文件名、标题和属性。然后,我的脚本使用 MetaMask wallet 登录到我在 OpenSea 上的帐户,并运行列表中的每个项目,执行以下任务:

1\. Create a new item in my OpenSea collection
2\. Upload the image file
3\. Enter the name of the item
4\. Enter the description
5\. Enter the properties (i.e. color, style, etc.)
6\. Save the item
7\. Go to sell the item
8\. Enter the price
9\. Post the item for sale

这需要一点调整,但我让脚本运行得足够好,可以上传 1,000 个 NFT。

甘沙尔

除了以的身份出售好的形象,我还把训练有素的甘的“股份”卖给其他希望创造新形象的艺术家。我为自己保留一股,并在这里卖出另外三股。

OpenSea 在销售 NFT 时允许“锁定内容”。购买 GANshare 后,这些内容将使新的所有者能够创建新的图像,并上传到 OpenSea 或任何其他 NFT 市场进行销售。

后续步骤

我在上面提到过,“好的”生成图像的产量只有大约 20%到 33%。运行优化算法超过 200 次迭代可能会改善结果,特别是对于地点和事物类别。此外,可以将剪辑编码器用作自动艺术评论家。查看图像嵌入与“美丽的绘画”这样的短语有多接近,可以提供一种更容易的方法来区分小麦和谷壳。这可以很好地工作,除非你喜欢绿色臭鼬的邋遢画😀。

我还从我的一位评论者奥利弗·斯特瑞普那里得到了一个很好的建议。他问我是否可以训练一个基于语言的人工智能系统来生成高质量的提示,这可能会使它成为一个全自动的艺术生成系统。好主意!

源代码

一个用于试验 VQGAN 和 Clip 的 Google Colab 是这里

感谢

我要感谢詹尼弗·林和奥利弗·斯特瑞普对这个项目的帮助。

参考

[1]由 T. Karras、S. Laine、M. Aittala、J. Hellsten、J. Lehtinen 和 T. Aila 编写的 StyleGAN2,(2020)

[2]p . Esser、R. Rombach 和 B. Ommer 的 VQGAN,驯服高分辨率图像合成的变形金刚 (2020 年)

[3]a .拉德福德等人的剪辑,从自然语言监督中学习可转移的视觉模型 (2021)

[4]d . Kingma 和 J. Ba 的 Adam Optimizer,A dam:一种随机优化方法 (2017)

[5]卡迪纳尔等人的 ISR, ISR 超分辨率 Resizer (2018)

为了无限制地访问 Medium 上的所有文章,成为会员,每月支付 5 美元。非会员每月只能看三个锁定的故事。

用 Python 的 Matplotlib 制作甘特图

原文:https://towardsdatascience.com/gantt-charts-with-pythons-matplotlib-395b7af72d72?source=collection_archive---------2-----------------------

用 Python 可视化项目进度指南

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

作者图片

这种可视化已经有 100 多年的历史,对于项目管理来说仍然非常有用。

亨利·甘特最初创建了用于分析已完成项目的图表。更具体地说,他设计了这种可视化方法来衡量生产率和识别表现不佳的员工。随着时间的推移,它变成了一个计划和跟踪的工具,一旦项目结束,它就被抛弃了。

不可否认的是,自最初设计以来,甘特图已经发生了很大的变化。分析师引入了许多编码来显示部门、任务完成度、依赖性、截止日期等之间的区别。

本文将探讨如何使用 Python、Pandas 和 Matplotlib 创建甘特图。

亲自动手

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

对于这个例子,我们需要一些虚拟数据;我们将使用的数据集包含任务名称、部门、开始和结束日期以及完成时间等列。

df = pd.read_excel('../data/plan.xlsx')
df

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

作者图片

为了使我们的绘图更容易,我们需要获得一些措施。

我们将从项目开始日期的变量开始。

然后,我们将添加一列从项目开始到每个任务开始的天数;这将有助于在 x 轴上定位条形。

任务结束时也是如此;这有助于计算完成任务所需的总天数、条形图的长度,并有助于稍后定位文本。

# project start date
proj_start = df.Start.min()# number of days from project start to task start
df['start_num'] = (df.Start-proj_start).dt.days# number of days from project start to end of tasks
df['end_num'] = (df.End-proj_start).dt.days# days between start and end of each task
df['days_start_to_end'] = df.end_num - df.start_num

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

作者图片

现在我们可以绘制一个条形图。y 将是任务名称,宽度是任务开始和结束之间的天数,左边是项目开始到任务开始之间的天数。

fig, ax = plt.subplots(1, figsize=(16,6))ax.barh(df.Task, df.days_start_to_end, left=df.start_num)plt.show()

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

作者图片

酷,我们有最简单的甘特图。

我们可以添加许多细节来使我们的图表更有洞察力。我们将从最基本的开始,一个带有日期和颜色的适当的 x 轴来区分各个部门。

# create a column with the color for each department
def color(row):
    c_dict = {'MKT':'#E64646', 'FIN':'#E69646', 'ENG':'#34D05C', 'PROD':'#34D0C3', 'IT':'#3475D0'}
    return c_dict[row['Department']]df['color'] = df.apply(color, axis=1)

对于 x 轴,我们将每三天添加一个标签,我们还将为每一天添加一个小刻度。

**from matplotlib.patches import Patch**fig, ax = plt.subplots(1, figsize=(16,6))ax.barh(df.Task, df.days_start_to_end, left=df.start_num, **color=df.color**)**##### LEGENDS #####**
c_dict = {'MKT':'#E64646', 'FIN':'#E69646', 'ENG':'#34D05C',
          'PROD':'#34D0C3', 'IT':'#3475D0'}
legend_elements = [Patch(facecolor=c_dict[i], label=i)  for i in c_dict]plt.legend(handles=legend_elements)**##### TICKS #####**
xticks = np.arange(0, df.end_num.max()+1, 3)
xticks_labels = pd.date_range(proj_start, end=df.End.max()).strftime("%m/%d")
xticks_minor = np.arange(0, df.end_num.max()+1, 1)ax.set_xticks(xticks)
ax.set_xticks(xticks_minor, minor=True)
ax.set_xticklabels(xticks_labels[::3])plt.show()

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

作者图片

太好了!这张图表比我们之前的版本更有洞察力。

现在让我们将项目的完整性编码到我们的可视化中。

# days between start and current progression of each task
df['current_num'] = (df.days_start_to_end * df.Completion)

我们将向我们的绘图添加另一个条形,并使用我们刚刚创建的度量作为宽度。

为了提高精确度,我们将在条形的末尾写下完整度的百分比。为了区分完成的和未完成的,我们可以使用条形的 alpha 参数。

from matplotlib.patches import Patchfig, ax = plt.subplots(1, figsize=(16,6))# bars
**ax.barh(df.Task, df.current_num, left=df.start_num, color=df.color)**
ax.barh(df.Task, df.days_start_to_end, left=df.start_num, color=df.color, **alpha=0.5**)# texts
**for idx, row in df.iterrows():
    ax.text(row.end_num+0.1, idx, 
            f"{int(row.Completion*100)}%", 
            va='center', alpha=0.8)**##### LEGENDS #####
c_dict = {'MKT':'#E64646', 'FIN':'#E69646', 'ENG':'#34D05C', 'PROD':'#34D0C3', 'IT':'#3475D0'}
legend_elements = [Patch(facecolor=c_dict[i], label=i)  for i in c_dict]
plt.legend(handles=legend_elements)##### TICKS #####
xticks = np.arange(0, df.end_num.max()+1, 3)
xticks_labels = pd.date_range(proj_start, end=df.End.max()).strftime("%m/%d")
xticks_minor = np.arange(0, df.end_num.max()+1, 1)ax.set_xticks(xticks)
ax.set_xticks(xticks_minor, minor=True)
ax.set_xticklabels(xticks_labels[::3])plt.show()

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

作者图片

就是这样!

我们可以改进这种可视化,使其更具吸引力,用另一个轴添加更多信息,绘制网格线,添加标题,等等。

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

代号 —图片由作者提供

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

代号 —图片由作者提供

结论

总的来说,这是可视化项目的一种极好的方式,尽管它可能不适合大多数当前的项目管理方法。

甘特图在某种意义上是灵活的,它们可以有许多功能。

您可以分解任务、跟踪绩效指标、依赖性、里程碑、截止日期等等。通过更多的编码、工具提示、向下钻取和文本,可以很容易地向甘特图添加更多的信息。

所有这些信息很容易使我们的图表难以理解,甚至更难维护。

使用敏捷方法,计划是不断变化的。花那么多时间收集和维护这些信息来跟进一个项目需要太多的资源,而且往往会适得其反。

综上所述,它们擅长可视化已完成的项目,比流程图、表格或看板/ Scrum 板更有洞察力,尤其是在审查单个过程或项目时。

感谢阅读我的文章!— 在这里你可以找到更多 Python dataviz 教程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值