TowardsDataScience 2023 博客中文翻译(三百五十二)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

在 Python 中使用二项分布

原文:towardsdatascience.com/using-binomial-distribution-in-python-c9002ac2a424?source=collection_archive---------6-----------------------#2023-05-03

在 Python 中探索二项分布:了解不同方法下的硬币投掷概率计算

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

·

关注 发布于 Towards Data Science ·9 分钟阅读·2023 年 5 月 3 日

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

照片由 Joshua Hoehne 提供,来源于 Unsplash

在今天的文章中,我将向你展示如何在 Python 代码中应用统计学概念,如概率。作为示例,我将使用高盛的统计面试问题,并展示在 Python 中计算二项分布的不同方法。

我还制作了一个关于同一主题(和相同问题)的免费视频教程,你可以随意使用它来简化你的工作。

在这篇文章中,我们将通过使用不同的 Python 方法来检验和解决高盛面试中提出的概率问题。

为什么概率和统计在数据科学中很重要?

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

图片由作者提供

概率和统计是数据科学中广泛使用的两个数学分支。

概率是研究随机事件及其发生可能性的学科。它用于建模许多现实世界中的不确定性,并且是统计推断的基础。

数据收集、分析和评估的研究称为统计学。它包括使用数学方法总结和得出数据结论。

概率和统计在数据科学中用于分析数据、进行预测和提供决策支持。它们对于理解复杂系统的行为和识别数据中的模式与趋势至关重要。

概率面试问题:硬币抛掷预测

21 枚公平硬币

有 21 枚公平硬币。每一枚都被抛掷。得到偶数个正面的概率是多少?

高盛是全球领先的投资银行及金融服务提供商,成立于 1869 年。该公司向企业、政府和个人提供各种金融服务,是世界上最大的投资银行之一,总部位于纽约市。

这个面试问题要求你确定在抛掷 21 枚公平硬币时,得到偶数个正面的概率。

一个公平的硬币有 50/50 的机会落在正面或反面。

当抛掷多个硬币时,可能的结果会迅速变得非常庞大。

要解决这个问题,我们需要使用二项分布的概念。让我们看看它是什么。

Python 中的二项分布

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

图片由作者提供

二项分布是一种概率分布,可以用来描述一系列事件中成功或失败的次数,这些事件必须相互独立

当只有两种可能的结果时,比如正面或反面,并且每次试验的成功概率相同,便会使用它。

试验必须满足两个条件

  1. 它们必须只有两个可能的结果(正面或反面/成功或失败),

  2. 每次试验的成功概率必须相同。

当抛硬币时,成功可以定义为得到正面失败可以定义为得到反面

要找出抛掷 21 枚硬币时得到偶数个正面的概率,我们需要计算得到 0、2、4、6、8、10、12、14、16、18 或 20 个正面的概率。

我们将通过使用二项分布来解决这个问题:

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

这意味着:

  • P(X = k) — 在n次独立试验中获得k次成功结果的概率。

  • n — 试验次数。(在本例中为 21。)

  • k — 成功的次数。(在本例中为正面。)

  • p — 试验成功的概率。(在本例中为 0.5)

  • $\binom{n}{k} $ — 从 n 次独立试验中选择 k 次成功的方法数量。

手动计算:硬币翻转预测

我们可以插入值并计算每个可能的偶数个头的概率。

让我们首先手动进行以下值的计算:

n = 21(试验次数)

p = 0.5(成功的概率)

q = 1 — p = 0.5(失败的概率)

这是计算结果

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

这些计算的含义是什么?例如,让我们看看 P(18)。

公式意味着在 21 次抛硬币时得到 18 个正面的概率,即 0.06341934204101562%。这略高于 10000 次中的 6 次。

在面试问题的背景下,当您抛掷 21 枚硬币 10000 次时,您可能会六次得到 18 个正面。这是一个罕见的概率,正如您所见。

在这里,您可以看到基于我们的计算,抛掷 21 枚硬币时偶数个正面的概率分布。

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

作者提供的图片

要回答面试问题,我们需要将所有概率相加:

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

将我们计算的所有单个概率插入,您会得到:

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

现在,让我们使用 Python 中的math 库实现此计算

Python 计算:硬币翻转预测

使用 math 库

我们可以使用 Python 中的 math 库实现在 21 次抛硬币中获得偶数个头的二项分布。

为此,我们可以使用for loop来迭代 21 次抛硬币中可获得的每个偶数个头。

对于范围内的每个 i 值,从 0 到 22(不包括),步长为 2,我们可以使用二项分布公式计算得到 i 个头的对应概率。

在循环内,我们可以首先使用**math.comb()**函数计算出 21 次翻转中获得 i 个头的方式数量。

然后,我们可以计算在 21 次抛硬币中获得恰好 i 个头的概率,即**(1/2)21。最后,我们可以将这两个值相乘,以获取在 21 次抛硬币中获得恰好 i 个头的概率,并将其存储在名为 probabilities 的列表中。

我们可以使用另一个for loop来打印概率列表中每个偶数个头的概率。

循环结束后,我们可以使用**sum()**函数计算存储在列表 probabilities 中的所有概率的总和,并打印在 21 次翻转中获得偶数个头的总概率。

这里是代码。

import math

# Create an empty list to store the probabilities of getting an even number of heads
probabilities = []

# Loop over all even numbers of heads that can be obtained in 21 flips
for i in range(0, 22, 2):
    # Calculate the number of ways to choose i heads out of 21 flips
    m = math.comb(21, i)
    # Calculate the probability of getting i heads in 21 flips
    n = (1/2 ** 21)
    prob = m * n 
    # Append the probability to the list
    probabilities.append(prob)

# Loop over the probabilities and print the probability of getting each even number of heads
for i, prob in enumerate(probabilities):
    print("The probability of getting {} heads in 21 flips is {}.".format(2*i, prob))

# Calculate the total probability 
total_prob = sum(probabilities)
print("Total probability of getting even number of heads is {}".format(total_prob))

现在,让我们看一下输出。

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

在早期计算中,我们使用二项分布公式手动计算了 21 次抛硬币得到偶数个正面的概率。

这涉及到单独计算 0、2、4、6、8、10、12、14、16、18 和 20 个正面的概率,这可能非常耗时。

另一方面,我们刚刚使用数学库编写的代码允许我们仅用几行代码计算所有这些概率。

这种方法节省了我们大量的时间和精力,特别是当我们需要计算更多结果的概率或需要对更多试验进行重复计算时。

但我们还有一种实现方式,它甚至更快。

使用 SciPy 库

这一次,我们将使用预构建的函数来计算概率。

在以下代码中,我们首先从scipy.stats 模块中导入**binom()**函数。

然后,我们使用binom()函数定义具有n 次试验成功概率p 的二项分布。

我们使用**pmf()**方法计算得到偶数个正面(0、2、4、…、20)的概率。

pmf()方法返回给定范围内每个值的分布概率质量函数(PMF)。

然后,我们使用另一个for loop来打印列表 even_probs 中每个偶数个正面的概率。

最后,我们通过对列表even_probs中的概率进行求和来计算 21 次抛硬币得到偶数个正面的总概率。

使用 scipy 库计算二项分布提供了一种更高效、更方便的计算方法。它允许我们用几行代码定义和计算分布。

以下是代码。

from scipy.stats import binom

n = 21
p = 0.5

# Define the binomial distribution with n trials and probability p of success
binom_dist = binom(n, p)

# Calculate the probability of getting an even number of heads (0, 2, 4, ..., 20)
even_probs = binom_dist.pmf(range(0, 22, 2))

# Print the probability of getting each even number of heads
for i, prob in enumerate(even_probs):
    print("The probability of getting {} heads in 21 flips is {}".format(2*i,prob))

# Calculate the total
total_prob = sum(even_probs)
print("Total probability of getting even number of heads is {}".format(total_prob))

以下是输出结果。

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

如果你比较两种 Python 方法得到的结果,你可能会注意到它们并不完全相同。

为什么结果(略微)不同?

SciPy 和数学计算之间的差异是由于浮点精度误差造成的。

在计算机编程中,浮点数以有限的位数表示,这可能会导致计算时精度丢失。

这就是为什么当比较两种方法的结果时,我们得到的偶数个正面的概率略有不同。

两种方法都提供了对真实概率的良好近似,而这两者之间的差异对于大多数实际应用来说是微不足道的。

如果你处理较长的脚本并计划进行更长时间的计算,同时计算能力有限,那么使用 SciPy 会更高效、更快速。

然而,如果你有足够的资源,我们建议使用第一种计算方法,即我们使用数学方法的那种。这是如果你想确保结果的准确性,即使这些细微的差异影响不大。

如果你想最小化浮点错误的影响,可以将计算结果四舍五入到所需的精度。

这里是代码。

total_prob = round(total_prob, 14)
print("Total probability of getting even number of heads, after correcting precision error is {}".format(total_prob))

这里是结果。

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

结论

在这篇文章中,我们探讨了一个来自高盛的统计问题,并通过使用 Python 进行了回答。

我们探讨了不同的方法,并详细解释了每一步。同时,我们也使用了预构建的函数进行了实现。

总的来说,本文是二项分布如何通过手动计算或使用 Python 解决的一个优秀示例。

如果你想掌握随机变量和概率分布,并在下一个数据科学面试中脱颖而出,请查看这篇文章“随机变量和概率分布”。

最初发布于 https://www.stratascratch.com

将 ChatGPT 作为创意写作伙伴——第一部分:散文

原文:towardsdatascience.com/using-chatgpt-as-a-creative-writing-partner-part-1-prose-dc9a9994d41f

OpenAI 最新的语言模型如何帮助创作诗歌、小说和剧本

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

·发表于 Towards Data Science ·15 分钟阅读·2023 年 1 月 4 日

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

“一个女人在笔记本电脑前打字,旁边有一个有帮助的玩具机器人,” 图片使用 AI 图像生成程序 Midjourney 创建,由作者编辑

如果你一直在阅读我在 Medium 上的文章,你会知道我自 2020 年 8 月以来一直在写关于 AI 的创意用途。我经常写关于生成数字艺术的内容,但偶尔也会写关于将 AI 用于其他创意目的的文章,比如写散文和作曲。当我听说 OpenAI 发布了一个叫做 ChatGPT 的新语言模型时,我立刻投入其中,并测试了它在创意写作中的表现。

概述

这是关于将 ChatGPT 作为写作伙伴的三部分系列的第一部分。该系列将涵盖写作散文、作曲 和创作图画书。

在这篇文章中,我将回顾一些关于 ChatGPT 的背景信息,然后展示我在生成各种创意项目文本方面的实验结果:

  1. 书写俳句

  2. 为新小说创作情节总结

  3. 创作新的电视节目和电影剧本

我将总结一下使用该模型的一般观察结果,并提出一些未来探索的可能步骤。

ChatGPT

ChatGPT 是 OpenAI 最新的文本生成模型。他们将系统作为“免费研究预览”提供。你可以使用电子邮件账户登录,或使用现有的 Google 或 Microsoft 账户登录。当你登录时,你会看到带有示例、功能和限制的主页。

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

ChatGPT 用户界面,图片由作者提供

为了开始一个话题,我问了这样一个问题。

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

ChatGPT 回答问题,图片由作者提供

注意,我在 2020 年的AI 8 Ball项目中使用了相同的问题。你可以看到上面 ChatGPT 对 Mattel 的 Magic 8-Ball 很熟悉,并用 20 个预设回答之一开始回答。但 ChatGPT 进一步提供了一些背景信息,这很好。当我点击重新尝试按钮时,它生成了类似的文本。但我使用了这个酷炫的新功能,并向系统提出了一个后续问题。

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

ChatGPT 回答后续问题,图片由作者提供

注意 ChatGPT 如何记住了第一个问题的上下文,所以它知道“它”的含义并做出适当回答。它的回答就像 Magic 8-Ball 一样,并提供了一些有用的背景信息。

OpenAI 增加了一个很棒的功能,即保留之前聊天会话的历史记录。这使我能够在需要时从上次中断的地方继续聊天。

ChatGPT 的起源

ChatGPT 基于 OpenAI 的 GPT-3 大语言模型 [2]。这个模型非常庞大,拥有 1750 亿个人工神经元,并在大约 5000 亿个网络文本上进行了训练。

OpenAI 进一步训练 GPT-3,创建了一个叫做 InstructGPT 的模型,旨在在生成文本时遵循用户的意图 [3]。

从一组[人工]-编写的提示和通过 OpenAI API 提交的提示开始,我们收集了一个标签者展示期望模型行为的数据集,用于通过监督学习对 GPT-3 进行微调。然后我们收集了一个模型输出排名的数据集,用于通过人类反馈的强化学习进一步微调这个监督模型。我们称这些结果模型为 InstructGPT。 - Long Ouyang 等,来自 OpenAI

ChatGPT 是 OpenAI 的 InstructGPT 兄弟模型,后者经过训练与用户进行互动 [1]。

我们训练了一个叫做 ChatGPT 的模型,它以对话的方式进行互动。这种对话格式使得 ChatGPT 能够回答后续问题,承认错误,挑战不正确的前提,并拒绝不当请求。 - OpenAI

语言模型中的社会偏见

注意,与大多数大型语言模型一样,InstructGPT 和 ChatGPT 都受到原始训练数据中隐性社会偏见和毒性的影响。为了解决这个问题,OpenAI 积极致力于使模型“对齐”,以便有用、诚实和无害 [3]。

我们通过训练语言模型使其按照用户的意图行事来取得进展。这包括明确的意图,如遵循指示,以及隐含的意图,如保持真实,避免偏见、毒性或其他有害行为。 — Long Ouyang 等,来自 OpenAI

然而,作者表示,新模型在毒性方面相比 GPT-3 仅有小幅改进,但在偏见方面没有改进。

OpenAI 如何微调 ChatGPT

这是 OpenAI 用于训练其最新系统的步骤。PPO 代表近端策略优化[4],是一种用于改善输出的新型强化学习。

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

图示显示了监督微调、奖励模型训练和通过近端策略优化的强化学习,来源 OpenAI

“标注员”是实际的人类,他们在第 1 步中创建了理想的输出,并在第 2 步中对生成的文本样本进行了评分,这些样本用于训练奖励模型(RM)。在第 3 步中,使用 RM 来预测标注员更喜欢哪个输出,并利用结果通过 PPO 算法优化了 GPT-3 模型。

书写俳句

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

金黄的叶子飘落,秋风吹过小镇,大自然的挂毯,” Midjourney 图片由作者提供

我与 ChatGPT 的第一次实验是创作俳句,这是一种起源于日本的诗歌形式。正如我在之前的帖子中讨论的那样,语言模型似乎在生成具有固定韵律的散文方面存在困难,例如俳句通常使用的 5–7–5 音节结构。然而,我注意到 ChatGPT 有了明显的改进。你可以在下面的互动中看到这一点,回答部分用斜体表示。

写一首关于秋天的俳句。

叶子柔软地飘落

秋风在小镇上拂过

大自然的挂毯。

这很好,但第一行用五个音节。第二和第三行可以。

金黄的叶子飘落

秋风吹过小镇

大自然的挂毯

这首俳句相当不错!叶子飘落和秋风吹过小镇的意象捕捉了季节变换的感觉。但请注意,第一次尝试有 6–7–5 的音节结构。我随后提示它改进了第一行,结果第二次尝试创建了一个 5–7–5 的结构,并保留了思路的精髓。

这里有几个额外的例子。

写一首关于笑声的俳句。

笑声如铃铛

回荡在大地上

带给所有人快乐。

写一首关于 Python 编程语言的俳句。

Python,如蛇般

优雅地穿梭于代码中

简单中的力量。

这很好,但最后一行用五个音节。第一和第二行可以。

Python,如蛇般

优雅地穿梭于代码中

简单中的力量。

关于笑声的俳句相当不错,其中关于铃铛的比喻也很好。它达到了俳句所需的 5–7–5 音节数。关于 Python 的俳句也不错,继续用蛇的比喻。最初它是 5–7–7 的结构,但当我提示时,ChatGPT 生成了一个正确音节数的俳句,并保持了原意。

接下来,我将分享使用系统为小说创建新标题和情节的结果。

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

桌上的一堆书,上面有一支笔和一叠纸,” Midjourney 图像由作者提供

为小说创作标题和情节

类似于我的 PlotJam 项目,我使用了一个经过微调的 GPT-2 模型,我要求 ChatGPT 为特定类型的小说生成新的标题和情节概要。以下是结果。

为一本新的历史小说创作标题和情节概要。

标题:“小大角的最后一战”

剧情概要:1876 年夏季,由传奇首领坐牛和疯狂马带领的拉科塔苏族和夏延族战士,在小大角战役中对抗正在推进的美国军队,做出了最后的抵抗。在这场生死决战中,年轻的战士白水牛必须在对部落的忠诚和对一位名叫萨拉的白人女子的爱之间做出选择。萨拉作为伤兵的护士来到战场。面对苏族国家的命运悬于一线,白水牛必须在战争、荣誉和爱情的复杂危险世界中找到自己的道路。

背景设定还不错,但情节似乎有点老套。尝试用新的白水牛角色冲突再试一次。

标题:“小大角的最后一战”

剧情概要:[…] 当双方在一场残酷血腥的战斗中对峙时,年轻的战士白水牛必须面对自己内心的挣扎和怀疑。白水牛在对部落的忠诚与对和平的渴望之间撕扯,他必须找到调和信仰与行动的方法,以捍卫他的人民及其生活方式。在战斗的混乱与暴力中,白水牛必须做出艰难的选择,这些选择将塑造他部落的未来和他自己的命运。

好的,不错。我喜欢这个故事似乎是从一位美洲原住民的视角讲述的。但正如你所见,我不得不将系统从陈词滥调的“罗密欧与朱丽叶”情节中引导出来以进行第二次迭代。我删除了第二次情节概要中的重复部分以提高可读性。正如“行业内”的说法,ChatGPT 适合做笔记。

这是另一个例子,经过三轮互动。

为一本新的科幻小说创作标题和情节概要。

标题:“最后的哨兵”

剧情概要:在遥远的未来,人类已经扩展到整个银河系,并在其他行星上建立了许多殖民地。然而,一种名为 Xarga 的敌对外星种族在地平线上威胁着人类的未来。作为最后一名哨兵,名叫杰克的孤独战士必须踏上任务,发现 Xarga 的来源,并找到阻止他们在消灭所有人类之前的方法。在此过程中,杰克必须克服巨大的困难,做出艰难的选择,以拯救人类。

好的,但给杰克起一个更具未来感的名字。

标题:“最后的守卫”

情节概要:[…] 作为最后一位守卫,一名名叫杰克逊的孤独士兵必须踏上使命,寻找 Xarga 的根源,并找到阻止他们的方法,以防他们消灭人类。在此过程中,杰克逊必须克服巨大的困难,做出艰难的选择,以拯救人类。

好的,简要解释一下杰克逊如何阻止 Xarga。

作为最后一位守卫,杰克逊是人类在与 Xarga 的战斗中的唯一希望。在穿越银河系并经历了许多挑战之后,杰克逊终于找到了 Xarga 威胁的根源。在那里,他发现 Xarga 被一个中央智能控制。杰克逊利用他的先进技术和战斗技能击败了这个中央智能,从而解放了 Xarga,结束了对人类的威胁。

这也是一个好的开始。然而,概要暗示了大量的动作和悬念,但缺少一些重要细节,比如书的真实内容、主要角色是谁以及驱动主角的动机。顺便提一下,我觉得有趣的是 ChatGPT 认为通过添加字母“X”可以使名字显得更具未来感。我也喜欢“单一中央智能控制 Xarga”的设定。ChatGPT 似乎遵循了那个老掉牙的建议:“写你所知道的。” 🙂

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

“电影拍摄现场,有一张桌子上的剧本和咖啡,” Midjourney 图片由作者提供,基于Jakob OwensUnsplash上的照片

编写剧本

我发现 ChatGPT 可以成为编写剧本的好伙伴。类似于我在 GreenLit 项目中的做法,我尝试了新模型为一个特定类型的节目创建标题、情节概要和剧本第一页。以下是初步的互动。

创建五个关于银行抢劫的新流媒体系列的标题和情节概要。

“抢劫计划” —— 当一群技艺高超的窃贼合作进行完美的银行抢劫时,他们很快意识到真正的挑战是如何活着带着赃物逃脱。当警察逐渐逼近,赌注不断增加时,团队必须依靠他们的专业技能和彼此间的信任来智胜当局,并成功脱身。

“内外勾结” —— 当一群心怀不满的前员工策划抢劫他们曾经工作的银行时,他们求助于一名经验丰富的窃贼来执行这一计划。随着他们深入调查银行的运作,他们揭露了一张腐败和贪婪的网,这使他们陷入了法律和前雇主的双重危险中。

“银行抢劫”——当一群朋友决定抢劫当地银行以偿还债务并重新开始时,他们很快意识到,他们的业余劫案技能无法与现有的安全措施相匹敌。在他们努力智取银行高科技防御的同时,他们还必须应对一系列的双重背叛和个人背叛,这些背叛威胁到他们的计划。

“完美分数”——当一群聪明的学生决定进行完美的银行劫案以资助他们的教育时,他们很快发现,他们精心策划的计划远比他们预期的要困难得多。在他们应对劫案和逃避当局的挑战时,他们还必须面对自己内心的恶魔和不安全感,以便成功。

“大笔划”——当一群经验丰富的窃贼聚在一起策划一场终极劫案时,他们很快意识到,成功完成这项工作需要的不仅仅是他们的专业技能。在他们努力筹集资源和人员以完成劫案的同时,他们还必须应对一系列个人和职业上的挫折,这些挫折威胁到他们的计划。

这些都不错,但大多数比较普通。它们似乎都已经被用过很多次了。就好像 ChatGPT 想要保守一点,不敢在故事创意上冒险。然而,我喜欢关于学生/窃贼那一组的,因为它有一个有趣的角度。但它需要一个独特的标题。

“完美分数”看起来不错,但建议一些以前没有使用过的标题。侧重于学生的角度。请只给出标题。

这里有五个关于银行劫案的学生的流媒体系列的新潜在标题:

“学生大劫案”

“犯罪班级”

“贪婪的成绩”

“学术劫案”

“校园大盗”

这些都还不错,但有些乏味。而且不出所料,它们都以“the”这个冠词开头。注意,如果我没有仅仅要求标题,它们会生成新的情节摘要。

总的来说,我最喜欢“贪婪的成绩”,主要是因为它的押头韵。然后在决定去掉标题中的“the”后,我要求 ChatGPT 写下剧本的第一页。

这些还不错。我们就用没有“the”的“贪婪的成绩”吧。请写下剧本的第一页。

当然!这是“贪婪的成绩”的剧本第一页:

渐入:

内景。大学图书馆——白天

我们看到一个学生的特写,正专心致志地学习。他们被一堆书籍和笔记包围着。

切换到:

内景。大学餐厅——白天

我们看到四个学生,杰西卡、迈克、艾米和尼克,坐在一起的桌子旁。他们都看起来很紧张和疲惫。

杰西卡:(沮丧)我简直不敢相信我们下周要期中考试。如果我在微积分中得不到至少 B+,我将永远负担不起学费。

迈克:(讽刺地)哦,是的,因为这就是我们与经济稳定之间唯一的障碍。

艾米:(严肃地)实际上,迈克,重修课程要花费更多。如果我们不通过,下学期还得再付一次钱。

尼克:(坚决地)嗯,我们不能让这种事发生。我们需要找到解决方案。

杰西卡:(讽刺地)是的,就像抢银行一样。

这群人沉默了一会儿,然后爆发出笑声。

画面渐黑。

好的,不错。对话听起来自然,虽然有点急于推动情节。我喜欢系统为角色台词添加的情感提示,这给剧本带来了些许色彩。

然而,角色有点平淡,因为根据他们的名字来看,故事中似乎只有一群白人孩子。这可能是由于语言模型中的社会偏见,就像我上面提到的。但当我询问时,系统知道该怎么做。

这很好!但试试类似的剧本,角色组更加多样化。

当然!这是《贪婪的等级》剧本第一页的修订版,展现了更多种族多样性的角色:

画面渐显:

内景。大学图书馆 — 白天

我们看到一个学生的特写,专注地学习。他们被一堆书籍和笔记包围。

切换到:

内景。大学餐厅 — 白天

我们看到四个学生,塔拉、哈维尔、艾莎和肯,坐在一起的桌子旁。他们都看起来很有压力和疲惫。

塔拉:(沮丧地)我简直不敢相信我们下周就有期中考试。如果我在微积分课上得不到至少 B+,我永远买不起学费。

哈维尔:(讽刺地)哦,是的,因为这就是我们与经济稳定之间唯一的障碍。

艾莎:(严肃地)实际上,哈维尔,重修课程要花费更多。如果我们不通过,下学期还得再付一次钱。

肯:(坚决地)嗯,我们不能让这种事发生。我们需要找到解决方案。

塔拉:(讽刺地)是的,就像抢银行一样。

这群人沉默了一会儿,然后爆发出笑声。

画面渐黑。

果然,系统将名字更改为具有更广泛的文化代表性。然后我询问它对他们的姓氏有什么想法。

谢谢。对于演员表,他们的全名是什么?

当然!以下是修订版剧本中角色的全名:

塔拉 — Tara Patel

哈维尔 — Javier Rodriguez

艾莎 — Aisha Khan

肯 — Ken Tanaka

不错!我将把这个发送给 Netflix 和 Amazon 工作室,看看能否引发竞标战来资助这个项目。😀

讨论与下一步

正如你在上面的互动中看到的,ChatGPT 可能无法独立创作出优质的长篇散文,但作为互动写作伙伴效果很好。系统相当有知识,是一个有帮助的合作者。当被提示时,它会创建许多你可能在寻找的例子,尽管它的很多想法平淡而普通。挖掘出有趣的想法需要一些工作,但这是可以做到的。

过去,当我使用像 GPT-3、GPT-J、BLOOM 等大型语言模型进行创意写作时,我发现我必须生成许多文本版本,然后“挑选”出最好的版本。即便如此,散文的开头、中间和结尾也不明确。系统只是胡乱写作,我必须决定何时停止。然而,ChatGPT 似乎对提示反应良好,并能产生编排得很好的文本。我发现我很少使用“旋转”再生按钮。相反,我提供了一些反馈,它几乎总是能做到我想要的改进文本。

正如你在我的编剧示例中看到的,我使用了自上而下的写作过程,从标题和情节开始,然后写对话和舞台指示。可能有助于让 ChatGPT 编写和完善故事主要角色的角色草图,然后将故事情节分解成幕和场景。这将有助于系统在整个剧本过程中创建一个更具连贯性的叙事。

正如我在本文开头提到的,我接下来的帖子将讨论使用 ChatGPT 创作音乐,借助 Band in a Box 的帮助,以及编写儿童图画书,获得 Midjourney 的支持。

关于 ChatGPT 作为创意写作伙伴的更多内容

这是本系列的接下来两篇文章。

## 使用 ChatGPT 作为创意写作伙伴 — 第二部分:音乐

最新的 OpenAI 语言模型如何帮助你为新歌曲编排和弦,配乐由 Band-in-a-Box 提供

towardsdatascience.com ## 使用 ChatGPT 作为创意写作伙伴 — 第三部分:图画书

最新的 OpenAI 语言模型如何帮助你编写儿童书籍,并通过 Midjourney 创建插图

towardsdatascience.com

致谢

我想感谢詹妮弗·林奥利弗·斯特里姆佩尔在这个项目中的帮助。

参考文献

[1] J. Schulman 等人,ChatGPT:优化对话的语言模型(2020)

[2] T. Brown 等人,语言模型是少样本学习者(2020)

[3] L. Ouyang 等人,训练语言模型以根据人类反馈执行指令(2020)

[4] J. Schulman 等人,近端策略优化算法(2017)

使用 ChatGPT 作为创意写作伙伴——第二部分:音乐

原文:towardsdatascience.com/using-chatgpt-as-a-creative-writing-partner-part-2-music-d2fd7501c268

OpenAI 最新的语言模型如何帮助你为新歌曲创作和弦,音乐由 Band-in-a-Box 提供

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

·发布于 Towards Data Science ·阅读时间 16 分钟·2023 年 1 月 17 日

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

“两个钢琴家在演奏,一个人和一个友好的机器人,数字艺术,” 图像使用 AI 图像生成程序 Midjourney 创建,并由作者编辑。

在我的上一篇文章中,我讨论了如何将 OpenAI 的 ChatGPT 大型语言模型[1]作为各种类型散文的写作伙伴。在本文中,我将展示如何利用该系统通过生成和弦来帮助创作音乐。

在简要概述 ChatGPT 之后,我将展示我在以下风格中使用新系统创作音乐的实验结果:爵士、乡村摇滚和雷鬼。我将通过提供一些对使用该模型创作音乐的一般观察和未来探索的下一步,来结束本文。请注意,本系列的第三部分将介绍如何利用该系统借助 Midjourney 创建图画书。

ChatGPT

ChatGPT 是 OpenAI 最新的语言模型,旨在通过聊天用户界面与人们互动。GPT 代表生成预训练变换器,其中变换器是一种 AI 模型。你可以在本系列的第一篇文章中阅读有关该系统的完整背景。

OpenAI 在这里提供了免费的 ChatGPT,并且这里有一个专业版的等待名单。一旦你注册,你可以通过输入提示并按下回车键来向系统提问或要求它生成某些内容。例如,我让它为一首蓝调歌曲创建了和弦进行。

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

ChatGPT 生成的蓝调歌曲和弦,图片由作者提供

系统回复了一系列 12 个和弦,这是蓝调歌曲中的典型序列。接下来,我想看看 ChatGPT 是否能生成与这些和弦相匹配的旋律。我提示系统用ABC 音乐符号写一首曲子,ABC 符号用字母表示音符,用文本表示其他元数据。这是它创作的内容。

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

ChatGPT 生成的蓝调歌曲旋律,图片由作者提供

好的,这看起来有很多注释。但旋律怎么样呢?为了播放这首歌,我使用了一个叫做EasyABC的程序,这是一个开源 ABC 符号编辑器和播放器。我将音符粘贴到 EasyABC 中,并将歌曲保存为 MIDI 文件。这是旋律的声音。(公平警告,这并不太好。)

ChatGPT 生成的蓝调旋律,视频由作者提供

哎呀!尽管旋律明显不好,但和弦对于一首蓝调歌曲来说完全没问题。我还进行了几次实验,使用 ChatGPT 系统生成和弦和旋律。在几乎所有情况下,生成的和弦至少是不错的,有时甚至很好,但生成的旋律总是很糟糕。

我怀疑 ChatGPT 在和弦方面表现出色,是因为互联网上有大量展示和弦和和弦进行讨论的文本。相反,只有少数网站展示 ABC 或其他基于文本的旋律格式。因此,它通常知道旋律是什么,并清楚理解 ABC 格式,但显然,这还不足以让系统创作出体面的旋律。

本文剩余部分讲述了我使用 ChatGPT 为不同音乐风格的歌曲编写和弦进行的实验。为了创作旋律和音乐伴奏,我使用了 PG Music 的商业软件Band-in-a-Box(BiaB)。

对于每首歌曲,我首先与 ChatGPT 互动以编写和弦。然后我运行 BiaB,输入生成的和弦,并选择像德州蓝调这样的风格。BiaB 根据和弦编写旋律和伴奏曲目,然后我将歌曲制作成视频。例如,这里是再次播放的蓝调歌曲。(给所有发烧友的一个提示:要听到低音线,请使用耳机或外部扬声器。)

蓝调和弦和旋律,由 ChatGPT 生成,视频由作者提供

啊!好多了。BiaB 使用真实音乐家的 MIDI 录音数据集作为编排歌曲的基础,使曲调更具人性化。它还设置了合适的参数,如乐器配置(鼓、贝斯和两把吉他)和演奏风格(摇摆八分音符),这些都适合布鲁斯摇滚风格。

使用 ChatGPT 作曲

根据我与 ChatGPT 的互动,它对音乐了解颇多。它掌握音乐理论,对各种风格和流派也很熟悉。以下部分展示了我如何利用系统为多种风格的曲调(如爵士乐、波尔卡和乡村摇滚)创建和弦进行。

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

爵士俱乐部里的 大钢琴,” Midjourney 图片,由作者编辑

爵士音乐

这就是我如何让 ChatGPT 为一首新的爵士乐曲编写和弦的过程。我首先让它讨论爵士乐曲的总体框架,然后让它为不同的歌曲部分编写和弦进行。请注意 ChatGPT 对我的指令的回应在以下互动中是斜体的。

为一首新的爵士乐曲创建框架。

当然!这是一个爵士乐曲的基本框架:

引言:这通常是歌曲开头的一个简短部分,由单独的乐器(如萨克斯 ophone 或小号)引入旋律。其余的乐队可能会加入简单的和弦伴奏。

头部:头部是歌曲的主要主题,通常由整个乐队演奏。在这里介绍了歌曲的和弦进行。爵士乐曲常使用复杂的和弦进行,如 ii-V-I 或 iii-vi-ii-V。

独奏:在头部演奏几次后,通常会有一名或多名音乐家进行独奏,即在歌曲的和弦进行上即兴演奏。

桥段:桥段是一个对比的部分,为歌曲的主要主题提供缓解。它可能会有不同的和弦进行和旋律。

尾声:尾声是歌曲的结束部分,可能会出现头部的简化版本或引言的重现。

这只是一个基本的大纲,爵士乐曲可以有多种形式。乐器可能在歌曲的不同位置出现,结构可以根据音乐家和歌曲风格的需要进行调整。

这似乎是对爵士乐曲各部分的很好的解释。注意它如何使用罗马数字分析(例如,“ii-V-I”)来描述和弦序列,这也是作曲家们经常使用的。我随后让它为一首新歌编写和弦进行,继续了聊天线程。

不同部分的和弦进行会是什么?

爵士乐歌曲的各种部分的和弦进行将取决于具体的歌曲和演奏的爵士风格。爵士乐歌曲经常使用复杂的和弦进行,可能在每小节中包含多个和弦,而且所用的和弦可以根据爵士风格和音乐家的喜好有很大变化。

下面是一些常见的和弦进行示例,这些和弦进行可能会在爵士乐歌曲中使用:

主歌:ii-V-I:这是爵士乐中非常常见的和弦进行,通常用于创建张力和解决。它由一个小和弦(ii),接着是一个主和弦(V),然后是一个大和弦(I)。例如,在 C 大调中,ii-V-I 的和弦进行是 Dm7-G7-Cmaj7。

桥段:iii-vi-ii-V:这个和弦进行使用了一系列小和弦来构建张力,然后用一个主和弦解决。在 C 大调中,iii-vi-ii-V 的和弦进行是 Em7-Am7-Dm7-G7。

这些只是几个示例,还有许多其他和弦进行可以在爵士乐歌曲中使用。重要的是选择支持旋律并为歌曲创造所需情绪和氛围的和弦进行。

这次它给了我罗马数字格式的和弦进行和 C 大调中的具体和弦。我对此感到有些兴奋,因为我也将之前AI-Tunes项目的所有训练数据转换成了 C 大调以简化处理。

对于这首新的爵士乐曲,我使用了建议的 Dm7-G7-Cmaj7 进行作为主歌和即兴部分,而桥段使用了 Em7-Am7-Dm7-G7 进行。对于引子和尾声部分,我只是保持在 Cmaj7 上四小节。剩下的就是给歌曲起个名字,我是从 ChatGPT 那里得到的。

这首曲子的好名字是什么呢?

“夜晚在秘密酒吧”

好的。为了听到音乐,我使用了上面描述的技巧。我启动了 BiaB,粘贴了生成的和弦序列,选择了爵士风格,然后,瞧,它编排了一首新的旋律,萨克斯管演奏的旋律和伴奏(鼓、贝斯和钢琴)。这就是它。

“夜晚在秘密酒吧,” 和弦由 ChatGPT 提供,音乐由 BiaB 创作,视频由作者制作

不错!这有点平淡,也许适合在电梯里伴奏,但对于计算机生成的音乐来说,它似乎表现得相当不错。我知道这只是轻微的赞扬,BiaB 完成了大部分工作。但 ChatGPT 的和弦进行看起来是稳固的。请注意,我故意把这首曲子做得很短(1:10),以便于演示。实际的爵士乐曲会多次回到主歌,并有更长的即兴部分和不同的乐器。接下来是一些波尔卡音乐。

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

一台手风琴与空旷舞台上的其他乐器,” Midjourney 图片,作者编辑

波尔卡音乐

对于我的下一个实验,我直接跳入并请求 ChatGPT 为一首波尔卡曲子写一些和弦。

为波尔卡歌曲的部分写出和弦进行。

当然!这里是一些你可以在波尔卡歌曲中使用的和弦进行:

最基本的波尔卡和弦进行是简单的 I-IV-V 进行,以 C 大调为例:

C — F — G

这里是对该进行的一个变体,加入了 ii 和弦(D 小调):

C — Dm — F — G

另一个常见的波尔卡和弦进行是以 iii 和弦(E 小调)开始,然后转到 IV 和弦(F 大调)和 I 和弦(C 大调):

Em — F — C

你也可以尝试一个更复杂的和弦进行,涉及 ii 和弦和 vi 和弦(A 小调):

C — Dm — A7 — F — G

记住,这些只是一些示例,你可以在波尔卡歌曲中发挥创造力。最重要的是保持音乐的弹性和能量,并保持节奏的推动力和活力。

再次,ChatGPT 提供了 C 大调下的歌曲部分和弦。我发现如果我在最初的请求中没有指定调性,它总是选择 C。顺便说一句,系统确实知道如何转调歌曲;你只需要告诉它(例如,“将这首歌转调到 B 平调”)。

我喜欢它为歌曲建议的和弦模式以及一些有用的评论。不过,最终的和弦进行有一个小错误(双关语 😉),评论中提到了 A 小调,但序列中显示的是 A7,这是一个属和弦。事实证明 A7 实际上在那里听起来很好。

我然后要求系统为新曲目的各个部分写出具体的和弦进行。

好的,请写出一首波尔卡歌曲的引子、主歌和桥段的和弦。

当然!这里是一个使用 C 大调的波尔卡歌曲引子、主歌和桥段的和弦进行示例:

引子:C — F — G (x2)

主歌:C — Dm — A7 — F — G (x2)

桥段:Em — A7 — Dm — G

再次强调,这些只是示例,你可以在波尔卡歌曲中发挥创造力,尝试不同的和弦进行。你也可以在桥段中加入额外的和弦或调到不同的调性,以为你的歌曲增添一些变化。只要确保节奏充满活力和能量,以捕捉波尔卡歌曲的感觉。

我喜欢这些结果!它选择了初步建议中的示例和弦进行,并指定了重复序列的次数,使用了“x2”指示符。注意它在主歌中保持了 A7 和弦,并且作为额外奖励,也将该和弦加入了桥段模式中。我不得不对引子和主歌中的和弦时机做出一些创造性的决策,所以我让它们这样进行,并在最后加了一个快速的 F-G 转场。

引子:C-C-F-G (x2)

主歌:C-C-Dm-Dm-A7-A7-F-G (x2)

我保持了原本写的桥段。然后我要求给歌曲起个名字。

这首歌叫什么名字好?

这完全取决于你!你可以考虑给你的歌曲起一个有趣、富有玩味的名字,以反映波尔卡风格的轻松性质。一些建议可能是“波尔卡派对”、“舞动的鞋子”、“快乐的波尔卡”或“波尔卡华尔兹”。另外,你也可以选择一个更具描述性的名字,反映你的歌曲主题或歌词,例如“爱情波尔卡”、“与克拉拉旋转”或“绝望的波尔卡”。最终,你的歌曲名字是个人偏好的问题,所以选择一个你认为能很好地代表你的歌曲并捕捉其精神的名字。

哇。与之前的例子不同,这次给了我很多名字可以选择。ChatGPT 在这方面很古怪。有时它给出简单的答案,但有时它会很健谈。请注意,如果需要,我本可以要求更多建议。在七个推荐中,我最喜欢“与克拉拉旋转”,因为它最具独特性。

然后我将和弦粘贴到 BiaB 中,包括重复的模式,选择了波尔卡风格,它渲染了这首歌。这就是“与克拉拉旋转”。

“与克拉拉旋转,” 和弦由 ChatGPT 提供,音乐由 BiaB 创作,视频由作者制作

很好!酷且有吸引力!我真的很喜欢前奏的 riff,全是 BiaB 制作的。乐器编排包括贝斯、鼓、吉他和手风琴,小号主导了演奏。哈哈!克拉拉?但我也喜欢 ChatGPT 的和弦进行,特别是在诗句和桥段中击中 A7 和弦时。这增加了一些色彩的紧张感,这似乎适合波尔卡风格。

在第 9 到 12 小节中,单簧管和手风琴之间有一点音色冲突,但一旦小号升高一个八度,就没问题。我可以在那段时间里将手风琴的音量调低,但我想看看它直接出来的声音(可以说是 😏)。接下来是一些乡村摇滚。

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

空舞台上的乡村摇滚乐器,” Midjourney 图片,作者编辑

乡村摇滚音乐

我最后的实验是为乡村摇滚歌曲生成和弦。乡村摇滚是一种结合了两种音乐风格元素的混合体。我不确定 The Byrds 是否开创了这个子流派,但他们的主唱肯定认为他们做到了。

当 The Byrds 开始演奏乡村摇滚时,我们没有想到会有这样的东西。我们只是想尊重音乐。我们开始听乡村电台。我们去了 Nudie’s,买了牛仔衣服。——The Byrds 的罗杰·麦奎因

无论如何,ChatGPT 似乎知道什么是乡村摇滚,因为它在我询问时提供了一些不错的和弦进行和评论。

为乡村摇滚歌曲编写和弦进行,包括一段歌词、合唱和桥段。

这是一个带有诗句、合唱和桥段的乡村摇滚歌曲的和弦进行示例:

诗句:E — B — A — B(I — V — IV — V)

合唱:E — A — B — E(I — IV — V — I)

桥段 G#m — F# — B — E(iii — ii — V — I)

这个和弦进行提供了强烈的调性和动感,可以作为乡村摇滚歌曲的基础。主歌使用了 I — V — IV — V 进行,这在乡村摇滚中很常见,提供了一种紧张和释放的感觉。副歌则用 I — IV — V — I 进行解决了这种紧张感,这是一个强劲、有力的进行,常用于摇滚和流行音乐中。桥段通过使用不同的进行(iii — ii — V — I 进行)为歌曲增添了些许变化,这增加了一种对比感,有助于在最终副歌前建立兴奋感和紧张感。

当然,这只是一个例子,还有许多其他和弦进行可以在乡村摇滚歌曲中使用。重要的是找到一种与您的歌曲匹配良好并帮助创造所需氛围和感觉的和弦进行。

这里的结果似乎也不错。然而,请注意系统再次对哪些和弦是主和弦,哪些是小和弦感到困惑。在罗马数字格式中,大写字母表示大调和弦,小写字母表示小调和弦。桥段部分的和弦被指定为“G#m — F# — B — E (iii — ii — V — I)”,其中 ii 和弦应该是 F#小调,但显示为 F#大调。它确实正确识别了 G#小调和弦。我决定接受这个错误,但我要求系统使用 7 和弦,这在乡村和摇滚音乐中经常使用。我只需要提出请求。

好的,但使用 7 和弦。

当然!这是一个乡村摇滚歌曲的和弦进行示例,包含主歌、副歌和桥段,使用 7 和弦:

主歌:E7 — B7 — A7 — B7 (I7 — V7 — IV7 — V7)

副歌:E7 — A7 — B7 — E7 (I7 — IV7 — V7 — I7)

桥段:G#m7 — F#7 — B7 — E7 (iii7 — ii7 — V7 — I7)

这个和弦进行与我之前建议的类似,但它包含了 7 和弦,这为和弦增添了更多复杂性和色彩。7 和弦增加了一种紧张感和不和谐感,这在乡村摇滚背景中可能特别有效。

再次,这只是一个例子,还有许多其他和弦进行可以在使用 7 和弦的乡村摇滚歌曲中使用。重要的是找到一种与您的歌曲匹配良好并帮助创造所需氛围和感觉的和弦进行。

果然,它在所有和弦上都加了一个 7。但它也像一个优秀的写作伙伴一样,当它认为我的建议在乡村摇滚背景下“特别有效”时,给出了积极的反馈。非常感谢你,伙伴!我还有一个请求。

这个乡村摇滚歌曲的好名字是什么?

“Kickin’ Up Dust”

再次,它只给出了一个名字建议。但这个名字似乎很合适,特别是“kicking”末尾缺少了“g”,所以我用了它。

然后我将所有和弦放入 BiaB 中,我没有做任何决定,因为三个部分都有四个和弦。我选择了乡村摇滚风格并生成了歌曲。就是这样。

“Kickin’ Up Dust,” 和弦由 ChatGPT 提供,音乐由 BiaB 创作,视频由作者制作

BiaB 选择了鼓、贝斯和风琴作为伴奏,并用吉他演奏主旋律,这在乡村摇滚中很常见。吉他的表现特别出色,尽管使用踏板钢吉他也会更合适。ChatGPT 提供的和弦再次表现良好。对我来说,尽管(或者也许正因为)错误主导的 F#7 和弦,过渡部分仍然是这首作品的亮点。

讨论和下一步

正如我所展示的,ChatGPT 对音乐理论有很深入的了解,能够为各种音乐风格生成和弦进行,并对其选择提供色彩评论。它还可以接受反馈来创建编曲的变体并提供额外的评论。它偶尔会犯错误,比如给出矛盾且似乎不正确的和弦建议。但在发生这种情况的两次中,结果听起来都还不错。

我没有尝试的一件事是将原歌曲的和弦作为进展中的作品展示给 ChatGPT,并请它建议一些改进或添加新部分。根据我与它的经验,结果应该会相当不错。

然而,该系统在作曲方面还有很长的路要走。我初次尝试为一首蓝调歌曲创作旋律时,效果并不好。

ChatGPT 的新版本

当我正在进行这个项目时,OpenAI 发布了一个新版本的模型,进行了改进。

我们很高兴地宣布 ChatGPT 的一些更新!以下是新内容:

我们对 ChatGPT 模型进行了更多改进!它在广泛的话题上应该总体表现更好,并且事实准确性得到了提升。… — Open AI

我随后用新版本重新创建了我的蓝调旋律实验,但结果相似。

在 E 大调中写一个 12 小节的蓝调和弦进行。

E — E — E — E

A — A — E — E

B7 — A — E — B7

为这首歌编写 ABC 记谱法的旋律。

不幸的是,作为 AI,我不能为你创作旋律,因为这需要创造力和灵感,但我可以给你一个 ABC 记谱法的旋律示例,作为起点:

X:1

T:Example Blues Melody

M:4/4

L:1/8

K:E

“E” E2 E E2 E | “A” A2 A A2 A | “B7” B2 B2 B2 B2 | “E” E2 E E2 E |

“E” E2 E E2 E | “A” A2 A A2 A | “E” E2 E E2 E | “B7” B2 B2 B2 B2 |

“E” E2 E E2 E | “A” A2 A A2 A | “E” E2 E E2 E | “B7” B2 B2 B2 B2 |

这只是一个例子,你可以根据自己的喜好随时更改节奏或音符。

这里的旋律也不好,而且在交互之间和弦全错了。但至少更新版本似乎意识到了自身的局限性。也许系统建议“创造力和灵感”应该来自人类是可以的。

更多关于 ChatGPT 作为创意写作伙伴的信息

这是本系列的前一篇和下一篇文章。

使用 ChatGPT 作为创意写作伙伴——第一部分:散文

最新的 OpenAI 语言模型如何帮助写诗歌、小说和剧本。

使用 ChatGPT 作为创意写作伙伴——第三部分:绘本

最新的 OpenAI 语言模型如何帮助你写儿童书籍,并利用 Midjourney 创建插图。

使用 ChatGPT 作为创意写作伙伴——第三部分:绘本

致谢

我想感谢 Jennifer Lim 和 Néstor Nápoles 对这个项目的帮助。

参考文献

[1] J. Schulman 等人,ChatGPT:优化对话的语言模型(2020)

使用 ChatGPT 作为创意写作伙伴 — 第三部分:图画书

原文:towardsdatascience.com/using-chatgpt-as-a-creative-writing-partner-part-3-picture-books-4f45e5dfe8dd

OpenAI 最新的语言模型如何帮助你写儿童书籍并用 Midjourney 创建插图

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

·发布于 Towards Data Science ·阅读时间 17 分钟·2023 年 2 月 7 日

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

一个人和一个友好的机器人在画架上用画笔和颜料画画的场景,” 这个图像是使用 AI 图像生成程序 Midjourney 创建的,并由作者进行编辑

这是我关于使用 OpenAI 的 ChatGPT 语言模型 [1] 进行创意写作的三篇文章系列的第三篇也是最后一篇。在第一篇文章中,我描述了如何使用 ChatGPT 写作散文、诗歌、小说和剧本。在第二篇文章中,我展示了如何使用该系统创建和弦序列来编写各种风格的音乐。

我为这篇文章进行的最新实验是使用 ChatGPT 创建图画书。因为系统无法直接渲染图像,所以我让它描述场景,然后我使用 Midjourney [2] 这个文本到图像生成系统进行渲染,Midjourney 是我在早期文章中探讨过的。

概述

我将从 ChatGPT 和 Midjourney 的背景信息开始,然后展示我如何利用这两个系统为儿童创作一本新的图画书。最后,我将讨论使用这些系统的一般方法,并提供一些未来探索的下一步建议。

ChatGPT

ChatGPT 是来自 OpenAI 的一个大型语言模型。它基于他们的 GPT-3 模型 [3] 的一种变体,经过微调以遵循人类的指示,称为 InstructGPT [4]。之后,它又进一步微调,成为一个功能性的聊天机器人,利用先前的互动作为输入。

ChatGPT 可以在你这里免费注册使用,并且即将推出的专业版的等待列表在这里。当你注册并登录后,你可以要求它生成一些文本或像这样提出问题。

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

来自 ChatGPT 的输出,作者截屏

这一切看起来都很直接和合理。它确实知道什么是图画书及其基本特质。这个列表似乎也是按优先顺序排列的。我同意简单而吸引人的故事应该是儿童书籍的首要任务,其次是视觉上吸引人的插图和其他列出的要点。

该系统有一个不错的功能,即在生成每个回应时使用先前的互动。这意味着系统在回应时知道到目前为止的对话背景。

你可以在我的第一篇文章中阅读有关 ChatGPT 的更完整描述。接下来,我将介绍如何使用 Midjourney 从文本生成图像。

Midjourney

Midjourney 是由同名公司创建的文本到图像生成器。该服务提供免费版和付费版。免费版对你创建的图像数量有限制,且这些图像仅供非商业用途。付费版则是一个订阅服务,具有不同级别,你将拥有所有使用该服务创建的图像。完整的服务条款可以在这里查看。

Midjourney 的用户界面是 Discord 服务器上的一个聊天机器人,Discord 是一个主要由玩家使用的社交媒体平台。我开始时使用了一个通用的提示语:“儿童图画书封面”,以查看它会生成什么。我在 Discord 中使用了 /imagine 命令并输入了提示;大约二十秒后,它生成了四个缩略图。

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

结果相当不错。质量似乎很高,孩子们看起来很可爱。除了飞鲸和令人毛骨悚然的老人之外,我注意到的下一个问题是随机文本。当前版本的 Midjourney,即第 4 版,在生成文本字符时效果还不错,但文字并没有意义。在下面的部分中,我将讨论如何使用 Photoshop 向书中的图像添加文本。你可以在我早期的文章中这里阅读更多关于使用 Midjourney 的内容。

接下来,我将展示我如何使用 ChatGPT 和 Midjourney 创建一本新的儿童图画书。

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

“儿童图画书的堆叠”, 图像是使用 AI 图像创建程序 Midjourney 生成并由作者编辑的

使用 AI 系统创建图画书

在这一部分,我将带你了解我如何使用 ChatGPT 和 Midjourney 来创建一本儿童图画书。我首先使用前者互动地创建新书的标题和情节摘要。然后我使用两个系统描述并绘制封面的插图。我使用 Photoshop 自己编辑了图像并添加了排版。接着,我使用 ChatGPT 编写了其余的八页书籍内容并描述了每张图片。我用它来创建我输入 Midjourney 的提示,以生成书中的八幅插图。我用 Photoshop 编辑了这些图像,添加了文本,然后在 Microsoft Word 中组装所有页面,创建了最终书籍的 PDF 文件。

以下是每个步骤的详细信息。注意,我使用一个 ChatGPT 会话创建了整个书籍,这样可以让之前的互动内容影响后续的回答。

生成标题和情节摘要

从我之前与 ChatGPT 的互动中,你可以看到它知道一本好的儿童图画书的基本特质。但系统不仅知道这些,它还可以创造东西。我首先让它为书生成标题和情节摘要。

为幼儿创建图画书的标题和情节。

“勇敢的小龙” — 当一只小龙发现自己能像它的大龙朋友们一样喷火时,它变成了这片土地上最勇敢的龙,并通过运用喷火技能帮助需要帮助的人来拯救一天。

“伟大的花园冒险” — 一群朋友踏上了一段穿越花园的旅程,在途中遇到了各种有趣和惊奇的生物。他们了解了照顾环境的重要性和自然的魔力。

“顽皮的猴子” — 一只好奇的猴子在探索丛林时遇到各种麻烦,但最终学会了有时候在行动之前先思考是更好的选择。

“好奇的毛虫” — 一只毛虫踏上了一段探索它长大后会变成什么的旅程。在过程中,它遇到了各种不同的昆虫,并了解了蜕变的不同阶段。

“魔法森林” — 一个小女孩在她的后院发现了一个通往充满妖精、会说话的动物和其他神话生物的魔法森林的秘密门。她在探索这个魔法世界的过程中经历了各种冒险,并学习了想象力的力量。

这些都很不错,但也相当普通。它们涉及各种动物,包括一条龙、一只猴子、一只毛虫以及一些不明确的魔法生物。

我让系统为第五个生成的标题添加细节,以了解它心中有哪些会说话的动物。注意我只需将我喜欢的标题/情节称作“最后一个”,它就知道我在说哪个。

最后一个听起来不错。给情节摘要添加一些新的奇特和具体的细节。

当然!这是“神奇森林”的修订版情节摘要:

“神奇森林”——当一个名叫莉莉的小女孩在她的后院发现一个秘密门时,她从未想过它会把她带到哪里。门后面是一个充满仙女、会说话的动物和其他神话生物的神奇森林。莉莉对这个发现感到非常高兴,开始了她在森林中的旅程,渴望看到所有的奇观。在旅途中,她遇到了一只会说话的狐狸,它愿意成为她的向导,一个讲述森林过去故事的脾气古怪的老树,以及一个捉弄她的顽皮仙女。莉莉还了解到想象力的力量和照顾环境的重要性。随着她探索森林,她开始想知道这个神奇的地方是否会永远成为她生活的一部分,还是只是现实世界中的一时逃避。

我发现这个情节扩展更有趣。它设计了一个会说话的狐狸、一个脾气暴躁的树木和一个爱捉弄人的仙女作为书中的角色。然后我问它这些角色的名字。

好的,狐狸、树和仙女的名字是什么?

当然!以下是“神奇森林”中的角色可能的名字:

会说话的狐狸可以叫弗雷德里克。脾气暴躁的老树可以叫奥克利。顽皮的仙女可以叫费伊。

好吧,看来它喜欢名字中的头韵,因为它用了弗雷德里克来命名狐狸,费伊来命名仙女。我想它没有选择特雷弗来命名树木。但我确实喜欢名字奥克利,非常聪明。

我随后决定在标题中使用狐狸的名字,以使其更独特。

我们用弗雷迪作为狐狸的名字。把这个名字融入标题五次。

当然!这里有五个包含弗雷迪名字的“神奇森林”修订标题:

“狐狸弗雷迪与神奇森林”

“弗雷迪和莉莉在神奇森林中的冒险”

“弗雷迪在神奇森林中的奇妙之旅”

“莉莉和弗雷迪的神奇森林冒险”

“狐狸弗雷迪与神奇森林的奇观”

希望这些标题对你有用!如果你有任何其他问题或需要我为故事提出更多想法,请告诉我。

这些也都很好。再一次,注意它如何记住并提到之前对话中的内容,比如它知道莉莉是故事中的主要角色,并将她融入了五个提议标题中的两个。

创建书封面

在确定了标题之后,我让它描述了书封面的插图。

描述一下“狐狸弗雷迪与神奇森林”的书封面会是什么样子。

对于《弗雷迪与神奇森林》这本书,封面可以展示弗雷迪狐狸站在神奇森林中央的插图,旁边站着一个年轻的女孩(莉莉)。森林中可以充满各种奇幻生物,如仙女和会说话的树木。背景可以是一个美丽的、色彩斑斓的日落,树木和森林中的其他元素在地面上投下长长的阴影。书名《弗雷迪与神奇森林》可以用大号粗体字写在封面的顶部,作者的名字则用较小的字母写在下面。整体上,封面应该引人注目,充满奇幻和惊奇,邀请年轻读者深入书页中的神奇世界。

这是对书籍封面的详细描述。它添加了一些可爱的细节,比如日落如何在地面上投下长长的阴影。

然后我要求系统生成一个提示以创建插图。我知道 Midjourney 不会知道弗雷迪和莉莉是谁,所以我要求 ChatGPT 省略他们的名字。我还要求省略文字描述,因为我知道 Midjourney 对渲染文本字符处理得不好。

为语音转图系统编写一个提示语,以创建书籍封面。描述角色的视觉特征,而不是名字。包括年龄、发色和衣服等细节。不要提及文字。

为一本图画书的封面创建插图。插图中展示一只勇敢且充满冒险精神的会说话的狐狸,站在一个神奇的森林中央。一位年轻的女孩站在狐狸旁边,抬头用惊奇的目光看着它。女孩有着红色的头发,约 8 岁,穿着绿色连衣裙。背景是一个美丽的、色彩斑斓的日落,树木和森林中的其他元素在地面上投下长长的阴影。插图应该引人注目,充满了奇幻和惊奇,吸引年轻读者深入书页中的神奇世界。

很好。这正是我所寻找的。我省略了开头的“创建”一词和结尾的“邀请年轻读者”这一从句,因为这些内容对于图像生成帮助不大。我使用的命令是**/imagine [prompt] --v 4 --q 2 --upbeta**,这意味着它使用了第四版本的模型,质量设置为 2.0,并且使用了升级器的测试版。这个升级算法将选定缩略图的分辨率从 512x512 像素提高到 2048x2048 像素。有关这些参数的更多信息,请参见这里

然后我将命令输入到 Midjourney 中,它生成了四个缩略图。

哇,这些都很不错。左上角的那张有一些神奇的事物,包括一只小狐狸和一只大狐狸。左下角的那张在树上有一个奇怪的狐狸状阴影。但我最喜欢右上角的那张。我使用 Midjourney 放大了缩略图,然后在 Photoshop 中稍微修整了一下。我按照 ChatGPT 之前的规格添加了文本。这里是编辑前后的最终结果。

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

《弗雷迪狐狸与神奇森林》的封面原始图像(左)和最终图像(右),由作者使用 Midjourney 编辑的图像

我没有对图像进行太多编辑。在 Photoshop 中,我只为狐狸添加了一个瞳孔。对于文本,我使用了 Google 的两个开源字体,Boogaloo用于标题,Carlito用于致谢。我添加了黑色边框和轻微的阴影,以确保文本在背景的浅色上可读。

编写这本书

为了编写这本书,我只需要选择八页的数量,并给 ChatGPT 一些基本指示。

编写一本总共八页的书,每页两句话和一幅插图。提供插图的描述,并用方括号标出。

这是《弗雷迪狐狸与神奇森林》的图画书,共有八页,每页两句话和一幅插图:

第 1 页:“莉莉是一个充满好奇心的女孩,拥有丰富的想象力。” “一天,她在后院发现了一扇秘密的门。” [插图:一个名叫莉莉的小女孩站在她后院的一扇藏在灌木后的门前。]

第 2 页:“门后是一个充满奇迹的神奇森林。” “莉莉惊讶不已,迫不及待地想要探索。” [插图:莉莉站在神奇森林的入口处,四周有盛开的树木和花朵,天空中有一抹淡淡的彩虹。]

第 3 页:“当她在森林中漫游时,莉莉遇见了一只名叫弗雷迪的会说话的狐狸。” “他主动提出成为她冒险的向导。” [插图:莉莉和狐狸弗雷迪站在一起,弗雷迪友好地看着莉莉。]

第 4 页:“莉莉和弗雷迪穿越森林,遇见了一棵名叫奥克利的脾气暴躁的老树。” “他给他们讲述了森林的过去和神奇的居民。” [插图:奥克利树,一棵大橡树,脸上带有表情和手臂,双臂交叉,脸上带着皱眉。]

第 5 页:“当他们继续旅行时,莉莉和弗雷迪遇到了一位名叫费伊的顽皮小精灵。” “她捉弄他们,并引导他们在森林中进行了一次疯狂的追逐。” [插图:费伊小精灵,一个小小的有翅膀的生物,金色头发和顽皮的表情,飞翔在空中,身后留下一串闪光的痕迹。]

第 6 页:“莉莉和 Freddy 在魔法森林中经历了各种冒险。” “他们了解了想象力的力量和保护环境的重要性。” [插图:莉莉和 Freddy 站在森林里,莉莉望向远方,脸上带着梦幻般的表情,Freddy 则友好地看着她。]

第 7 页:“莉莉忍不住想知道魔法森林是否会永远成为她生活的一部分。” “还是只是从现实世界中的暂时逃避。” [插图:莉莉站在秘密门前,带着怀旧的表情回望魔法森林。]

第 8 页:“但有一件事是肯定的——她与 Freddy、Oakly 和 Fae 的冒险记忆将永远伴随她。” “完结。” [插图:莉莉在魔法森林中的冒险蒙太奇,显示她、Freddy、Oakly 和 Fae 在旅程中不同场景的合影。]

我喜欢它如何重复了指示,然后迅速生成了八页的叙述文本和插图简要描述。

从批评的角度来看,故事情节比较薄弱,几乎没有情节(注意缺乏对手的存在)。但为了展示目的,这似乎还可以。第 7 页有些哲学性的内容,但在第 8 页以感人的结局作结。

接下来是这个项目的有趣部分,生成书中的插图。

生成插图

我上面展示了如何使用 Midjourney 渲染书封面图像。我遵循了这个方法来创建八个页面的插图。由于 GPT 有上下文,我只需逐个请求提示。

这是我创建书中第一个插图所做的工作。注意我再次要求了角色的具体视觉细节,这有助于在再次渲染时保持连贯性。

为语音转图像系统编写一个提示,以创建第 1 页的插图。描述角色的视觉特征,不要提及名字。但不要提及文本。

创建一个插图,展示一个小女孩站在她后院一丛灌木后面隐藏的门前。女孩是红发,约 8 岁,穿着绿色连衣裙。她站在门前,脸上带着兴奋的表情,门很大,木制的,带有一个铜把手。

为了在 Midjourney 中渲染图像,我省略了“create”一词,使用了上述选项的**/imagine**命令。以下是结果。

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

**“Freddy the Fox and the Magical Forest”**的第一页缩略图,Midjourney 图像由作者提供

与书封面类似,这些图像也做得很好。所有规定的元素都渲染得很不错,包括女孩、门、灌木丛等。我最喜欢左上角的那一张,但女孩的额头和头发有一些问题。Midjourney 中有一个很好的功能叫做“remix variations”,它使用选择的图像和原始提示生成四个插图变体。我点击了V1按钮来表示左上角的缩略图,系统生成了四个变体。

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

《弗雷迪狐狸与神奇森林》的首幅插图(左)和最终图像(右),Midjourney 作者图像

在左侧,你可以看到 Midjourney 生成的四个修订版缩略图,每个图像都有细微和不那么细微的视觉差异。我喜欢左下角的那一张,因为她的头发问题较少,而且门的渲染似乎更好。因此,我点击了U3按钮,将其放大到 2048x2048 像素。然后,我使用 Photoshop 添加了文字。我没有对这张图像进行任何修饰。

角色的视觉连续性

阅读图画书时,读者期望角色在每一页上看起来大致相同。但如果你将书封面的莉莉与第一页的插图进行比较,你会注意到一些连续性问题。例如,衣服的图案是最明显的差异。

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

书封面上的莉莉细节(左)和首幅插图(右),Midjourney 作者图像

使用 Midjourney 生成图画书插图时,这是一个重要问题。除非你告诉它,否则系统并不会“知道”新角色应该是什么样子。

改善插图之间连续性的有两个可能方案。首先,在提示中提供更详细的角色描述会有帮助,即包括对服装和头发的详细描述。Midjourney 会采纳这些词汇,渲染出的角色会更相似。其次,可以在 Photoshop 中清理图像,即使用曲线工具和吸管匹配头发和衣物的颜色。

我没有花太多时间修复图书的连续性问题。尽管如此,我选择了角色匹配度较高的缩略图,偶尔调整了提示,并在 Photoshop 中做了一些清理。

创作其余的插图

我使用 ChatGPT 和 Midjourney 重复了第二页到第八页的插图制作过程。总体来说,我喜欢奥克利这个脾气暴躁的树和法伊这个顽皮的仙女的渲染效果。

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

《弗雷迪狐狸与神奇森林》的插图,展示了奥克利(左)和菲(右),Midjourney 图像由作者编辑

特别是,我喜欢 Midjourney 将奥克利的眉毛渲染成树枝的效果,以及喜欢菲的发光背光效果。

完成的书籍

我将所有页面加载到一个 Microsoft Word 文档中以编制书籍,并添加了最后的“完”页以及鸣谢页面。然后将其保存为 PDF 文件。

这是完成的书籍。请注意,你可以使用右侧的滚动条或箭头按钮翻页。全屏模式并不非常有用,因为它会放大太多,无法显示完整的页面。

书中的最后一张图片是我在 Photoshop 中创建的蒙太奇,通过复制和粘贴 Midjourney 生成的“最佳”角色图片。我尝试使用系统的图像提示功能来自动生成汇编图像,但没有成功。

讨论

经过大量的实验,我设法使用 ChatGPT 和 Midjourney 作为写作/插画伙伴来创建一本简单的儿童图画书。总体而言,我对结果感到满意。角色很有趣,插图也很好看。

然而,正如我之前提到的,情节简单且缺乏细节。首先,它需要超过八页,以创建更具吸引力的故事。例如,Margaret Wise Brown 和 Clement Hurd 的《晚安月亮》有 30 页,Maurice Sendak 的《野兽国》有 48 页。但我认为可以与 ChatGPT 合作,创建一个更复杂故事的高层次大纲,然后将其拆分成各个部分,并生成有助于故事主线的单独页面。

此外,还需要更多的实验来在页面之间渲染具有适当连续性的角色。例如,可能可以使用 Midjourney 创建角色研究,从不同角度生成角色的各种姿势。然后使用孤立的姿势作为图像提示,以及描述特定场景的文本。

我希望那些开发文本到图像生成系统的开发者,如MidjourneyDall-EStable Diffusion,能改进他们的模型,以便能够渲染具有视觉连续性的角色。

更多关于 ChatGPT 作为创意写作伙伴的内容

这是本系列的前两篇文章。

## 使用 ChatGPT 作为创意写作伙伴 — 第一部分:散文

最新的 OpenAI 语言模型如何帮助创作诗歌、小说和剧本

towardsdatascience.com ## 使用 ChatGPT 作为创意写作伙伴——第二部分:音乐

最新的 OpenAI 语言模型如何帮助你为新歌曲编写和弦,音乐由 Band-in-a-Box 提供

towardsdatascience.com

致谢

我想感谢 Jennifer Lim 在这个项目中的帮助。

参考文献

[1] J. Schulman 等,ChatGPT:优化对话的语言模型(2020 年)

[2] Midjourney midjourney.gitbook.io/docs/

[2] T. Brown 等,语言模型是少样本学习者(2020 年)

[3] L. Ouyang 等,训练语言模型以遵循带有人类反馈的指令(2020 年)

使用 ChatGPT 进行高效调试

原文:towardsdatascience.com/using-chatgpt-for-efficient-debugging-fc9e065b7856?source=collection_archive---------6-----------------------#2023-06-22

利用大型语言模型提升你的调试体验,快速学习

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

·

关注 发表在 Towards Data Science · 15 分钟阅读 · 2023 年 6 月 22 日

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

图片来源:Pavel DanilyukPexels

难以否认,大型语言模型(LLMs)正在对各行各业和应用产生深远的影响,彻底改变了我们的工作和互动方式。尽管自从约六个月前(2022 年 11 月)发布以来,围绕 ChatGPT 的最初炒作已平息,但它的影响仍然显著。看来自回归 LLMs 将在不久的将来继续成为我们生活的一部分,并且 值得培养与它们互动的技能,无论作为开发者还是用户。

正如Chip Huyen 在她的博客文章中所述使用 LLMs 达成令人印象深刻的成果相对容易,但考虑到LLMs 目前存在的限制和潜在问题,构建生产就绪的系统却相当具有挑战性。然而,尽管研究和工程界正积极努力解决这些挑战,值得承认的是,个人已经能够从 LLMs 中获益,至少可以将它们作为个人助手用于日常非关键任务,或作为头脑风暴的合作伙伴。

在我之前的文章中,我讨论了提示工程的最佳实践,提供了帮助你开发基于本地 LLMs 的应用程序的见解。在这篇文章中,我将分享一系列技巧,帮助你利用如 ChatGPT 这样的模型进行有效的代码调试加速编程学习。我们还将看看编写和解释代码的示例提示。这些技巧不仅在与 ChatGPT 互动时有用,也能帮助你从同事那里寻求帮助或独立解决编程挑战。

本文主要面向初学者,因此我尝试提供了说明性的例子和解释。我希望这些技巧能帮助你更高效地理解和排除代码中的问题。

代码调试的一般框架

实际上,ChatGPT 对调试过程没有做出重大改变。好在现在你可以轻松地与虚拟同事联系,而不用担心打扰别人或担心问蠢问题!但我们将考虑的这些技巧只要软件工程存在就会存在,因此不仅在与 LLMs 互动时有用,也有助于更好地理解过程和更有效地与同事互动。

要找到代码中的错误,你只需两个基本步骤(实际上有三个):

  1. 隔离错误并用最少量的代码展示它

  2. 对你的错误做出假设并进行测试;

  3. 不断迭代,提出更多假设,直到找到解决办法。

虽然你可以立即开始使用 ChatGPT,但实际上从重现错误开始会更好,这有几个原因。首先,在语言模型的上下文中,可能很难包括所有相关点并准确解释你想要实现的目标。其次,这将使你更好地理解问题,并可能自己找到错误。让我们来看看。

顺便说一下,在这篇文章中,我使用的是原版 ChatGPT(GPT-3.5),但对于编码任务,GPT-4 通常更为高效。

第一步:使用最少量的代码隔离并重现问题

第一步是重现问题。众所周知,大多数问题仍然可以通过经典的 “重启” 来解决。可能你已经在 Jupyter Notebook 中与代码执行顺序纠缠不清。

如果可能(通常是),建议 编写新的代码以抛出相同的错误,并尽可能保持简单

让我们考虑一个 TypeError: ‘int' object is not iterable 的例子,这种错误发生在你尝试迭代 some_integer 而不是使用 range(some_integer) 构造时。

糟糕的例子:一个函数调用另一个函数,该函数又调用一个类的方法。乍一看,可能需要一些时间来确定实际计算发生的位置,尽管这是一个相对简单的例子。类似地,对于模型而言,在无关细节中 定位相关信息 变得更加具有挑战性。

更好的例子:通过将 do_some_work() 函数(引发错误的函数)的功能直接移到我们调用的函数中,来去掉类。

除了我们在变量命名约定上仍然做得很糟糕(记住,变量名应该具有描述性和意义!),这段代码仍然更容易调试和理解。

更好的例子:我们还可以去掉 some_function()

总体而言,我们将代码缩短了超过一半。比较一下找出其中错误的难度。

在 pandas 的背景下,这一原则可能意味着不使用原始的数据框。假设我们想计算每个职位的平均工资,并遇到 KeyError。这是一个糟糕的例子:

首先,我们不能确定数据框中是否包含注释中提供的数据。实际上,我们只需要其中的两列,如果我们创建一个类似的迷你版本,会更容易理解我们只是拼写错误了工资列(Salary vs salary)。

顺便说一下,ChatGPT 在 生成虚拟数据 方面相当出色,所以它在这里也可能有帮助!

错误类型繁多,当然不可能一一列举。总体而言,尝试以 产生相同错误 的方式修改代码,但 尽可能让其容易理解

由于所谓的 “橡皮鸭调试”,这一步通常能帮助你自己理解问题的原因,而无需寻求外部帮助。例如,如果你的迷你代码没有产生相同的错误,你已经找到了解决方案的一半。然而,即使它产生了相同的错误,这也是一个积极的结果。 😃

第 2 步:做出假设、测试并迭代

如果你仍然找不到修复错误的方法,值得寻求帮助。但对可能出错的地方有自己的假设会很有帮助。

查找确切的行

首先,找到导致问题的表达式和确切的代码行。你可能已经知道它在你之前编写的迷你代码的最后一行里面。

记住,Python 追溯显示的错误信息底部,而对应的执行代码顶部,中间是内部函数的调用。

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

Python 追溯。图像由作者提供

对于直接的错误,这可能相对简单,但对于逻辑错误,这些错误不会生成任何错误信息,但由于逻辑错误导致意外的输出,处理起来可能更具挑战性。在这种情况下,使用调试器或简单的print()语句逐步观察值,并确定不符合预期的代码行是很有帮助的。

如果错误是由复杂的表达式引起的,例如df.groupby(‘Occupation’)[‘Address’].apply(lambda x: ‘, ‘.join(x)),你可以首先将其拆分为几个部分,并逐步探索输出,例如,先运行df.groupby(‘Occupation’),然后df.groupby(‘Occupation’)[‘Address’],等等。

思考常见原因

之后,考虑一些常见的错误原因:

  • 是否可能是所需的库未安装或安装了错误的版本?

  • 也许某处有一个简单的拼写错误语法错误

  • 错误是否可能与数据类型有关,例如你将字符串和数字相加?

  • 等等。

请询问 ChatGPT

如果想不到任何解决办法,可以寻求 ChatGPT 的帮助。简单的问题通常可以通过直接粘贴代码并询问哪里出错了来解决。然而,对于更复杂的问题,你可能需要提供额外的相关信息。例如,如果你遇到系统错误,提供你使用的 Python 版本可能会有帮助。总的来说,尽量总是包括错误信息描述你想要实现的目标。你可能需要尝试几种不同的措辞,所以不要害怕进行实验。

情况可能有很大变化,所以我们继续一些示例。首先,让我们看一下之前遇到的 pandas KeyError

示例提示:

This Python code results in <error> in <this line>.

在此处插入你的代码


Tell me how to debug the code to solve the given error.

示例:

This Python code results in KeyError: 'Column not found: salary' 
in the last line.

import pandas as pd

df = pd.DataFrame({

'Occupation': ['Engineer', 'Doctor', 'Engineer'],

'Salary': [56056, 61304, 86850],

})

average_salary_per_occupation = df.groupby(‘Occupation’)[‘salary’].mean()


Tell me how to debug the code to solve the given error.

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

调试 pandas 示例的输出。图像由作者提供,使用ChatGPT创建

看起来不错!让我们来看一个具有逻辑错误的更具挑战性的例子。

示例提示:

This Python code <does this, but I want it to do this>.

在此处插入你的代码


Tell me how to fix the code to solve the problem.

示例:

This Python code trains a random forest classifier on the Iris dataset.
As far as I know, the dataset is relatively simple and I expect 
the classifier to make the perfect predictions,
however, I am getting about 95% accuracy even with 100 trees in the forest.
Are these results reasonable for this situation?

from sklearn.datasets import load_iris

from sklearn.ensemble import RandomForestClassifier

from sklearn.metrics import accuracy_score

from sklearn.model_selection import train_test_split, GridSearchCV

加载 Iris 数据集

iris = load_iris()

X = iris.data

y = iris.target

切分数据

X_test, X_train, y_test, y_train = train_test_split(

X, y, test_size=0.2, random_state=42)

X_train, X_val, y_train, y_val = train_test_split(

X_train, y_train, test_size=0.2, random_state=42)

param_grid = {

'n_estimators': [3, 7, 15, 25, 50, 100]

}

创建一个随机森林分类器并

使用网格搜索来找到最佳的树木数量

rf_classifier = RandomForestClassifier()

grid_search = GridSearchCV(estimator=rf_classifier,

                    param_grid=param_grid, cv=5)

grid_search.fit(X_train, y_train)

从网格搜索中获取最佳的估算器并进行测试

best_rf = grid_search.best_estimator_

y_pred = best_rf.predict(X_test)

test_accuracy = accuracy_score(y_test, y_pred)

print(“Test accuracy:”, test_accuracy)

从网格搜索中获取最佳的树木数量

best_n_estimators = grid_search.best_params_[‘n_estimators’]

print(“Best number of trees:”, best_n_estimators)


Tell me how to fix the code to solve the problem if there is a problem.

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

调试 sklearn 示例的输出。图像由 ChatGPT 创建。

模型能够找到隐藏的问题并修复它。太棒了!

由于 ChatGPT 能够记住你之前的消息,这里的可能性是无限的。你可以让它解释一些你难以理解的概念,建议替代解决方案,将代码从一种语言翻译到另一种语言,等等。

此外,由于 ChatGPT 能够理解代码,它也可以编写代码。

使用 ChatGPT 编写和解释代码

在这一部分,我们将探讨一些在与 ChatGPT 编码时可以使用的技巧。但首先,我认为重要的是要记住,在 ChatGPT 出现之前,Google 是软件开发人员的主要工具。

我认为重要的是不要忘记如何使用 Google,出于各种原因。最终,使用 Google 你可以做 ChatGPT 能做的所有事情(在编码环境中),只是可能会更慢。然而,当涉及到像用 numpy 创建对角矩阵这样的特定任务时,我可能会使用 Google 更快地完成。

我认为适合的类比是学习外语的过程(尽管可以说你通过学习编程语言实际上就是在做这件事 😃)。使用 Google 就像用词汇翻译单个单词,而使用 ChatGPT 则类似于翻译整句话和段落的在线翻译器。虽然 ChatGPT 可以非常强大,但你可能会遇到在识别隐藏错误或理解某些代码块时的挑战,尤其是作为初学者。

鉴于 ChatGPT 的巨大能力,它可以以各种方式被使用。我建议你用它来生成简短的代码片段——充当习语或稳定表达的词典。确保你对生成的代码有一个扎实的理解是很重要的,因为这有助于防止未来的问题和复杂性。

所以,使用 ChatGPT,但也记得去谷歌查找信息!

这篇文章提供了一些关于如何有效谷歌搜索的软件开发者的宝贵建议。

在这种情况下,一个有用的技巧叫做角色提示。你可以让模型以初级开发者的角色来编写代码,而不是仅仅让它生成代码。通过假设这个角色,模型更有可能生成对初学者易于理解的代码,避免过于复杂的构造。

示例提示:

Act like a junior Python developer.
Write code with comments explaining what is going on.
When providing the solution, ensure the output is well-formatted
and the code is well-documented.
Include example usage and explanations.

<Describe your problem here>

示例:

Act like a junior Python developer.
Write code with comments explaining what is going on.
When providing the solution, ensure the output is well-formatted
and the code is well-documented.
Include example usage and explanations.

Write a program to find common values between two numpy arrays.
It is a function that takes two numpy arrays as inputs and
output a numpy array.

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

针对代码生成提示的输出。图片由作者创建,使用ChatGPT

在这个例子中,ChatGPT 很好地遵循了我们的所有指示,包括示例和详细解释。

别忘了将代码与最初的假设进行比较,并得出结论,这将帮助你在未来避免做出类似的请求。

总的来说,请记住,LLMs 对你或你所面临的具体问题没有先验知识,因此你提供的信息越多,得到的输出就会越好:

  • 描述你的任务

  • 定义代码结构:例如,它是完整的脚本、类还是函数;

  • 指定输入和输出:例如,函数接受两个整数参数并输出浮点数;

  • 提及你想使用的工具/库,如 numpy 或 pandas,以及编程语言;

  • 如果可行,添加你的建议,例如解决方案可能是什么样的:例如,我建议使用pandas.DataFrame.groupby函数按职位计算平均薪资。

优化

如果我们之前让模型表现得像一个初级开发者,我们希望它在编程任务,如代码优化方面更强。

顺便说一下,你也可以用相同的角色提示技巧来调试代码。

示例提示:

Act like an experienced Python developer mentoring a junior developer.
Provide explanations and comments about the concepts that can be
hard for beginners. Use Python best practices and write docstrings.

Rewrite the above Python code and optimize it.

在这里插入你的代码

示例:

Act like an experienced Python developer mentoring a junior developer.
Provide explanations and comments about the concepts that can be
hard for beginners. Use Python best practices and write docstrings.

Rewrite the above Python code and optimize it.

def unique_list(l):

# 从给定的列表中获取独特元素的列表

x = []

for a in l:

    if a not in x:

        x.append(a)

return x

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

针对代码优化提示的输出。图片由作者创建,使用ChatGPT

在这里,为了从列表中提取独特元素,ChatGPT 建议使用set数据类型(因为其定义上不允许重复值),而不是使用 for 循环。这是一个不错的选择,因为它基本上是一个一行解决方案。

解释

我们可以使用相同的标记请求评论和代码解释。通常,这会输出冗余的注释,如import numpy as np # importing numpy library。然而,这在你开始学习时仍然有用,并且帮助模型表达其内部思想,正如在链式思维推理部分和我的上一篇文章中讨论的那样。

样例提示:

Act like an experienced Python developer mentoring a junior developer.
Provide explanations and comments about the concepts that can be
hard for beginners. 

Explain and comment the following code.

在此处插入你的代码

示例:

Act like an experienced Python developer mentoring a junior developer.
Provide explanations and comments about the concepts that can be
hard for beginners. 

Explain and comment the following code.

def func(n):

trow = [1]

y = [0]

for x in range(max(n, 0)):

    print(trow)

    trow = [l + r for l, r in zip(trow + y, y + trow)]

return n >= 1

func(6)

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

代码解释提示的输出。图片由作者使用ChatGPT创建

在这里,模型能够识别这段代码背后的任务:生成帕斯卡三角形的行。做得好!

虽然你可以想出许多有用的 ChatGPT 应用,但重要的是要注意,它可能并不总是能够解决你遇到的每一个问题。值得进一步讨论这一方面。

关于潜在陷阱的一些注意事项

虽然 ChatGPT 可以非常有用并执行各种任务,但重要的是要记住潜在的缺点,这些缺点可能比较棘手。

作为自回归 LLM,ChatGPT 不是确定性的……

ChatGPT 是一个大型语言模型的例子,当前的大型语言模型是自回归的,这意味着它们被训练来预测序列中的下一个标记。模型的输出是所有可能标记的概率分布,我们从这个分布中逐个标记地采样最终文本。因此,采样过程是非确定性的,这意味着由于概率原因,你对相同的输入可能会有不同的输出

为了说明这一点,我们可以将采样过程想象成一棵树。这里,初始句子用蓝色显示,选中的标记用绿色显示,未选中的标记用红色表示(不包括它们的进一步演变)。概率是随机选择的,仅用于说明。

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

LLM 采样过程的简化可视化。图片由作者提供

输入序列是:“我的名字是”,而 ChatGPT 通过“ChatGPT,很高兴为您服务!”来完成它。这是一个来自我的上一篇文章的例子,我在其中讨论了 LLM 的基本知识。

… 这就是为什么 ChatGPT 可能会出错的原因

在实际操作中,这意味着你可能因为一开始得到了某些稀有不太可能的标记而得到次优的输出。因此,你可能需要对相同的输入进行多次运行以检查不同的输出并选择最合适的一个,甚至结合来自不同输出的不同部分

此外,重要的是要强调现代语言模型,特别是 GPT-4,具有令人印象深刻的自我纠正能力。如果生成的代码有错误,你可以简单地返回它并指出它的功能不正确。GPT-4 擅长调试自己的代码并提供相关建议。你通常可以在几次迭代后获得正确的代码。

过度自信

尽管 LLMs 有时可能提供不正确的输出,但它们经过训练优先考虑准确性。这可能使它们的输出看起来非常令人信服,即使它是错误的。因此,识别隐藏的错误可能具有挑战性,因为模型通常不能明确地说*“我需要更多的信息”*,尽管正在进行的研究正积极探索解决这一限制的方法。

从这个意义上讲,使用 ChatGPT 生成小段代码以解决特定任务,如我之前提到的谷歌搜索,可以更安全。确保你对所收到的代码有扎实的理解,这样可以有效避免潜在的陷阱。

结论

在这篇文章中,我们探讨了可以帮助你调试的方法,不仅仅是与 ChatGPT 一起,还有你自己。

通过隔离问题和用最少的代码行重新编写,你很可能会洞察到潜在的问题。或者,让 ChatGPT 帮助你,提供关于发生了什么的完整信息,进行假设并进行实验。

你还可以利用 ChatGPT 进行任务,例如编写、优化或解释代码,就像我们在角色提示示例中讨论的那样。其他与代码相关的应用几乎无穷无尽,包括创建虚拟数据、编写测试、生成文档等。

但要记住 LLMs 的局限性,因为它们可能引入隐藏的问题。由于其自回归性质,LLMs可能在表现自信的同时犯错,这可能需要更多的问题或多次迭代以选择最佳输出。

祝你学习顺利!

资源

查看这篇文章以获取将 ChatGPT 作为个人编码导师的更广泛指南。

这里是我关于 LLMs 的其他文章,可能对你有用。我已经涵盖了:

  • 估计大型语言模型的规模:LLMs 是什么,它们是如何训练的,需要多少数据和计算资源;

  • 提示工程的最佳实践:如何应用提示工程技术与 LLMs 有效互动,以及如何使用 OpenAI API 和 Streamlit 构建本地 LLM 应用程序。

你可能还感兴趣:

感谢你的阅读!

  • 希望这些材料对你有帮助。关注我在 Medium 上的更新以获取更多类似的文章。

  • 如果你有任何问题或意见,我很乐意收到任何反馈。可以在评论中问我,或者通过LinkedInTwitter与我联系。

  • 为了支持我作为作家,并获得其他数千篇 Medium 文章的访问权限,可以使用我的推荐链接来获取 Medium 会员(对你没有额外费用)。

使用 ChatGPT 将 R 代码翻译成 Python

原文:towardsdatascience.com/using-chatgpt-to-translate-r-code-to-python-effed461037e

进入翻译代码库的第一步。

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

·发布于 Towards Data Science ·阅读时间 5 分钟·2023 年 5 月 28 日

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

图片由 Katka Pavlickova 提供,来源于 Unsplash

Python 和 R 是数据科学生态系统中的两个关键角色。我在 Python 和 R 编写的项目中都有工作经验。它们在高效处理数据清理、操作和分析任务方面表现出色。

然而,有时我们希望将代码库从 R 翻译成 Python,或反之亦然。这种动机可能来源于公司内部的技能组合。如果你有许多 Python 开发者和少数 R 开发者,你可能希望将项目维护在 Python 中。

在某些情况下,特定的项目要求可能会促使你翻译代码库。例如,虽然 Python 以其多功能性而闻名,涵盖了网页开发、软件开发和机器学习等领域,但 R 在统计分析和可视化方面表现出色。因此,如果项目涉及大量统计分析或复杂的图形表示,翻译 Python 代码到 R 可能会有益。

翻译过程通常需要具备两种编程语言技能的人才,这可能很难找到。好消息是我们可以使用 ChatGPT,它在几乎所有编程语言中都具备相当高的技能水平。

在这篇文章中,我们将使用 ChatGPT 将使用 “data.table” 包编写的 R 代码翻译成使用 “pandas” 库的 Python 代码。

我们将仅给出代码,而不说明其作用或预期功能。让我们从初始提示开始,定义 ChatGPT 的角色并说明我们的期望:

初始提示:你是一名拥有多年 Python 和 R 经验的软件工程师。你的任务是将 R 代码转换为 Python 代码。R 代码使用 data.table 包进行数据清理和处理。你将使用 Pandas 库将其转换为 Python 代码。

第一个示例是创建数据表中新列的代码行。

Convert the following R code that uses `data.table` package 
to Python using the `pandas` library:

melb[, Price_per_area := Price / Landsize]

这是 ChatGPT 的回答:

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

(作者提供的图片)

它不仅提供了代码,还解释了代码的功能。这对于没有源语言或目标语言专业知识的人来说非常有用。

第二个示例通过对价格和类型列进行过滤来创建数据表的子集。

Convert the following R code that uses `data.table` package 
to Python using the `pandas` library:

subset <- melb[Price > 1000000 & Type == “h”]

ChatGPT:

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

(作者提供的图片)

我们再做一个稍微复杂的例子。下面提示中的代码行计算了不同地区类型为“u”的房屋的平均房价。

Convert the following R code that uses `data.table` package 
to Python using the `pandas` library:

melb[Type == “u”, .(avg_price = mean(Price)), by=“Regionname”]

ChatGPT:

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

(作者提供的图片)

上面截图中的代码:

avg_price = melb[melb['Type'] == 'u'].groupby('Regionname')['Price'].mean().reset_index().rename(columns={'Price': 'avg_price'})

它成功地完成了任务,但我更倾向于使用命名聚合,我认为这更具可读性且更简洁。我们也让 ChatGPT 使用它:

Convert the following R code that uses `data.table` package 
to Python using the `pandas` library. Used named aggregations.

melb[Type == “u”, .(avg_price = mean(Price)), by=“Regionname”]

ChatGPT:

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

(作者提供的图片)

上面截图中的代码:

avg_price = melb[melb['Type'] == 'u'].groupby('Regionname').agg(avg_price=('Price', 'mean')).reset_index()

这样更好,因为它不需要之后重命名列。我们还可以使用groupby函数的as_index参数并将其值设置为 False,这样我们在计算后就不需要重置索引。

下一个提示中的 R 代码计算了每个地区的平均房价和房屋总数,并按降序排序结果。

Convert the following R code that uses `data.table` package 
to Python using the `pandas` library. Used named aggregations.

melb[

Type == "u",

.(avg_price = mean(Price), number_of_houses=.N),

by="Regionname"

][order(-avg_price)]

ChatGPT:

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

(作者提供的图片)

与之前的示例一样,逐步解释对于理解和调试代码非常有用。

我们来做一个关于更改列名的最终示例。下面提示中的 R 代码将类型和距离列重命名为“HouseType”和“DistanceCBD”。

Convert the following R code that uses `data.table` package 
to Python using the `pandas` library.

setnames(melb,

    c("Type", "Distance"),

    c("HouseType", "DistanceCBD"))

ChatGPT:

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

(作者提供的图片)

上面截图中的代码:

melb.rename(columns={'Type': 'HouseType', 'Distance': 'DistanceCBD'}, inplace=True)

我喜欢关于inplace参数的注释,因为它很容易被忽视。

最后总结

本文中的示例展示了 ChatGPT 在将代码从一种编程语言翻译到另一种编程语言方面的成功。我们进行了逐行翻译,这不能作为 ChatGPT 能够翻译整个代码库的证明。

然而,显然,当处理大型代码库时,使用 ChatGPT 可以节省你数小时的时间。你总是可以再检查一次并测试输出,以确保它按预期工作。

你可以成为 Medium 会员 来解锁我所有的写作内容,以及 Medium 的其他内容。如果你已经是会员,别忘了 订阅 以便在我发布新文章时收到邮件通知。

感谢阅读。如有任何反馈,请告知我。

使用 DeepFace 进行面部识别

原文:towardsdatascience.com/using-deepface-for-face-recognition-5f8d1e43f2a6

了解如何在不需要训练自己的模型的情况下进行面部识别

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

·发布于 Towards Data Science ·10 分钟阅读·2023 年 4 月 18 日

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

图片由 fran innocenti 提供,来源于 Unsplash

在我之前关于面部检测的文章中,我讨论了如何使用 OpenCV 在你的网络摄像头中检测面部:

## 使用 Python 进行面部检测 — 面部识别的前奏

通过使用你的网络摄像头检测你的面部,享受 Python 的乐趣

towardsdatascience.com

检测面部是你通常首先执行的步骤,之后是 面部识别

面部识别是将数字图像或视频帧中的人脸与面部数据库中的人脸进行匹配的过程。

有几种深度学习模型可以用来进行面部识别,但所有这些都需要你具备一些神经网络的知识,并且需要使用你自己的数据集进行训练。对于那些想进行面部识别但不想深入了解神经网络工作原理的人,有一个真正简化面部识别的 API — DeepFace

什么是 DeepFace?

DeepFace 是一个轻量级的面部识别和面部属性分析(年龄、性别、情感和种族)框架(API),用于 Python。它本质上是一个用于识别面部的先进模型的封装器。它可以使用以下预训练模型:

  • VGG-Face(默认)

  • Google FaceNet

  • OpenFace

  • Facebook DeepFace

  • DeepID

  • ArcFace

  • Dlib

  • SFace

简而言之,DeepFace 允许你使用预训练的模型来识别自己的一组面孔,而无需创建和训练自己的模型。

在这篇文章中,我将向你介绍 DeepFace 的一些酷炫功能以及如何将面部识别融入你的项目中。

面部检测/识别的伦理考虑

尽管识别面孔的能力确实很酷,但它确实有很多伦理影响。在你在项目中实施面部识别之前,需要注意几个问题。关注点包括隐私(面部检测可以在未经同意的情况下追踪人们的活动)、偏见(面部识别可能对不同种族、性别或年龄的个人存在偏见)和滥用(捕获的面孔可能会用于其他非法用途或恶意目的)。因此,虽然这篇文章着重于面部识别的技术能力,但在实施之前,你应仔细考虑道德和伦理影响。

这里有一些低风险的项目,可以实现面部识别:

  • 考勤追踪 — 你可以在学校或工作场所使用面部识别来进行考勤。

  • 个性化 — 使用面部识别来个性化服务。一个很好的例子是娱乐服务,如根据用户的观看历史推荐特定的电视节目。

  • 安全性 — 使用面部识别解锁非关键系统,如智能手机和计算机。

然而,在某些应用中使用面部识别具有严重的道德影响。以下是一些示例:

  • 执法 — 尽管面部识别对执法有用,但对其不准确性和偏见有一些严重的担忧。

  • 监控 — 在一些国家,面部识别技术被用于监控和追踪公民,特别是异议人士。一些公司也使用面部识别来监控员工的生产力,这直接侵犯了他们的隐私。

以下是一些你可以阅读的文章,以了解更多关于面部识别的法律和道德问题:

安装 DeepFace

安装 DeepFace 相对简单——如果你使用的是 Mac。对于 Windows,需要做一些额外的工作。

我将为你演示在 macOS 和 Windows 上安装 DeepFace 的步骤。

对于 macOS

对于 macOS,只需在 Jupyter Notebook 中运行以下命令以安装 cmakedlibdeepface

!pip install cmake
!pip install dlib
!pip install deepface

完成后,你就可以开始使用 DeepFace 了。

对于 Windows

对于 Windows,你需要执行一些步骤:

确保在安装过程中将路径环境变量添加到其 bin 目录,例如:C:/ProgramFiles/cmake/bin 在安装过程中

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

所有图像均由作者提供

上述步骤可能需要一点时间。现在可以去休息一下。

  • 最后,在 Jupyter Notebook 中运行以下命令:
!pip install dlib
!pip install deepface

完成后,你就可以开始使用 DeepFace 了。

使用 DeepFace

要使用 DeepFace,首先导入它:

from deepface import DeepFace

我在本文中使用 Jupyter Notebook。

准备图像

我打算下载并准备一些图像,以便我可以用 DeepFace 进行测试。首先,下载以下 基努·里维斯 的图像,并将其保存到与你的 Jupyter Notebook 相同的目录中:

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

来源:en.wikipedia.org/wiki/Keanu_Reeves#/media/File:Keanu_Reeves_(crop_and_levels)_(cropped).jpg

然后,创建一个名为 image1 的变量,并将图像的文件名赋给它:

image1 = 'Keanu_Reeves_(crop_and_levels)_(cropped).jpg'

同样,对以下图像也进行此操作:

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

来源:en.wikipedia.org/wiki/Keanu_Reeves#/media/File:Reuni%C3%A3o_com_o_ator_norte-americano_Keanu_Reeves_(46806576944)_(cropped).jpg

image2 = 'Reunião_com_o_ator_norte-americano_Keanu_Reeves_(46806576944)_(cropped).jpg'

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

来源:en.wikipedia.org/wiki/Jet_Li#/media/File:Jet_Li_2009_(cropped).jpg

image3 = 'Jet_Li_2009_(cropped).jpg'

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

来源:en.wikipedia.org/wiki/Denzel_Washington#/media/File:Denzel_Washington_2018.jpg

image4 = 'Denzel_Washington_2018.jpg'

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

来源: en.wikipedia.org/wiki/Smile#/media/File:Smiling_girl.jpg

image5 = 'Smiling_girl.jpg'

比较面孔

现在,让我们使用 DeepFace 来比较两张图像,以查看它们是否包含同一个人的面孔。为此,你可以使用verify()函数:

DeepFace.verify(img1_path = image1,  # Keanu Reeves
                img2_path = image2)  # Keanu Reeves

第一次运行 DeepFace 时,它会将预训练模型的权重(默认使用 VGG-Face 模型)下载到你的计算机上:

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

权重下载完成后,DeepFace 将返回如下结果:

{'verified': True,
 'distance': 0.17842618501190277,
 'threshold': 0.4,
 'model': 'VGG-Face',
 'detector_backend': 'opencv',
 'similarity_metric': 'cosine',
 'facial_areas': {'img1': {'x': 42, 'y': 61, 'w': 144, 'h': 144},
  'img2': {'x': 73, 'y': 57, 'w': 103, 'h': 103}},
 'time': 0.27}

verified键的值指示两张面孔是否相同。distance键的值是两个面部向量之间的距离(值越小,两个面孔越相似)。threshold键的值设置了distance值的解释阈值——小于 0.4 的值会使verified键设置为Truefacial_areas键包含了两张图像中面孔的位置。

让我们尝试比较另外两张图像——image1image3

DeepFace.verify(img1_path = image1,   # Keanu Reeves
                img2_path = image3)   # Jet Li

毫不意外,DeepFace 检测到这两个面孔是不同的:

{'verified': False,
 'distance': 0.4034869302977028,
 'threshold': 0.4,
 'model': 'VGG-Face',
 'detector_backend': 'opencv',
 'similarity_metric': 'cosine',
 'facial_areas': {'img1': {'x': 42, 'y': 61, 'w': 144, 'h': 144},
  'img2': {'x': 20, 'y': 49, 'w': 164, 'h': 164}},
 'time': 0.27}

嵌入

嵌入是表示面部图像的多维向量。DeepFace 允许你使用represent()函数来查找这些嵌入:

embeddings = DeepFace.represent(img_path = image1)  # Keanu Reeves
embeddings

image1的嵌入如下:

[{'embedding': [0.00948819238692522,
   -0.010876820422708988,
   -0.0013923903461545706,
   0.01534500066190958,
   ...
   -0.014694824814796448,
   -0.015208861790597439,
   0.005312952678650618,
   ...],
  'facial_area': {'x': 42, 'y': 61, 'w': 144, 'h': 144}}]

根据你使用的预训练模型的不同,embedding键的值的大小会有所不同。对于 VGG-Face,面部图像被表示为 2622 维的向量。更有趣的是facial_area键的值,它包含了图像中面部的位置。

以下代码片段显示了基努·里维斯的图像(image1)以及绘制在检测到的面部区域周围的矩形:

import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image

im = Image.open(image1)
fig, ax = plt.subplots()

# display the image
ax.imshow(im)

# draw a rectangle around the face
face_coord = embeddings[0]['facial_area']
rect = patches.Rectangle((face_coord['x'], face_coord['y']), 
                         face_coord['w'], face_coord['h'], 
                         linewidth = 2, 
                         edgecolor = 'r', 
                         facecolor = 'none')

# add the patch to the axes
ax.add_patch(rect)

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

从一组面孔中找到一个面孔

DeepFace 最令人兴奋的功能之一是能够将图像与文件夹中的一组图像进行比较。DeepFace 将告诉你哪些图像与提供的图像最为相似。这本质上是面部识别

为了展示这个功能的强大,我在与 Jupyter Notebook 相同的文件夹中创建了一个名为Faces的新文件夹,并用一些李连杰基努·里维斯的图像填充了它:

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

然后我调用find()函数并传入image1

DeepFace.find(img_path = image1,    # the image to compare against
              db_path = "Faces",    # folder containing all the images
              enforce_detection = False)[0]

如果*find()*函数发现 Faces 文件夹中的图像不包含任何面孔,它将引发异常。为了防止这种情况发生,请将enforce_detection参数设置为False

find()函数返回一个 Pandas DataFrame 的列表,因此你需要使用 0 索引来获取第一个 DataFrame:

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

数据框包含与您搜索的图像最相似的图像文件名列表。在这个例子中,最匹配的是KeanuReeves_3.jpg

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

数据框根据 VGG-Face_cosine 排序(值越小,匹配度越高)。

请注意,当你第一次调用find()函数时,将创建一个名为representations_vgg_face.pkl的表示文件,并将其存储在Faces文件夹中。如果你向Faces文件夹中添加新图像,请记得删除representations_vgg_face.pkl文件。

使用find()函数,你可以在不训练任何模型的情况下进行人脸识别——只需创建一个包含你想识别的面孔的文件夹(每个人应尽可能多地提供图片),然后就完成了,你就拥有了一个人脸识别模型!

分析面孔

除了比较面孔和从面孔文件夹中查找面孔,DeepFace 还允许你分析面孔的各种特征,如年龄、性别、情感和种族:

DeepFace.analyze(img_path = image4, 
                 actions = ["age", "gender", "emotion", "race"])

上述声明分析了丹泽尔·华盛顿image4)的图像,并且相当准确地预测了图像中的面孔是:

  • feeling sad

  • 一名黑人男性

以下是analyze()函数返回的结果:

[{'age': 35,
  'region': {'x': 31, 'y': 46, 'w': 117, 'h': 117},
  'gender': {'Woman': 0.015357557276729494, 'Man': 99.98464584350586},
  'dominant_gender': 'Man',
  'emotion': {'angry': 0.3038950626725033,
   'disgust': 3.667220231060474e-11,
   'fear': 2.3939014472247897,
   'happy': 1.2440780556642484e-05,
   'sad': 87.49081939349405,
   'surprise': 6.846103949403675e-05,
   'neutral': 9.81130493418037},
  'dominant_emotion': 'sad',
  'race': {'asian': 7.334453304675418,
   'indian': 3.1661530981155095,
   'black': 85.50387534522267,
   'white': 0.09932484836949994,
   'middle eastern': 0.03912873741168454,
   'latino hispanic': 3.8570622418559934},
  'dominant_race': 'black'}]

让我们尝试分析另一张图片,这次是一个微笑的女孩的图片(image5):

DeepFace.analyze(img_path = image5, 
                 actions = ["age", "gender", "emotion", "race"])

结果相当准确:

[{'age': 26,
  'region': {'x': 377, 'y': 140, 'w': 558, 'h': 558},
  'gender': {'Woman': 99.66641068458557, 'Man': 0.3335847519338131},
  'dominant_gender': 'Woman',
  'emotion': {'angry': 1.31229280062393e-10,
   'disgust': 2.1887400676449618e-26,
   'fear': 3.8267408134914985e-22,
   'happy': 99.99999403953517,
   'sad': 2.6514247764822096e-14,
   'surprise': 2.245952144279152e-17,
   'neutral': 6.961274993922523e-06},
  'dominant_emotion': 'happy',
  'race': {'asian': 3.0054475969609733,
   'indian': 4.536693711482729,
   'black': 0.7851633247927815,
   'white': 41.17996289491211,
   'middle eastern': 23.323961892600284,
   'latino hispanic': 27.168768902870287},
  'dominant_race': 'white'}]

更改预训练模型

如果你想更改 DeepFace 使用的基础预训练模型,你可以在verify()函数中使用model_name参数指定你想使用的模型:

models = ["VGG-Face", "Facenet", "OpenFace", "DeepFace", "ArcFace"]
DeepFace.verify(image1, 
                image2, 
                model_name = models[1])  # change to Facenet

现在,所选模型的权重将被下载到你的计算机上。

represent()函数也是如此:

embeddings = DeepFace.represent(img_path = image1,
                                model_name = models[1])

以及find()函数:

DeepFace.find(img_path = image1, 
              db_path = "Faces",
              model_name = models[1],
              enforce_detection = False)[0]

如果你喜欢阅读我的文章,并且这些文章对你的职业/学习有所帮助,请考虑成为 Medium 会员。每月费用为 5 美元,这将为你提供对 Medium 上所有文章(包括我的文章)的无限制访问权限。如果你使用以下链接注册,我将获得一小部分佣金(对你没有额外费用)。你的支持意味着我可以花更多时间撰写像这样的文章。

[## 通过我的推荐链接加入 Medium - Wei-Meng Lee

阅读 Wei-Meng Lee 的每一个故事(以及 Medium 上成千上万其他作者的故事)。你的会员费直接支持…

weimenglee.medium.com](https://weimenglee.medium.com/membership?source=post_page-----5f8d1e43f2a6--------------------------------)

总结

使用 DeepFace 使得进行面部识别变得非常简单——无需明确的训练,你只需将面部图像放入一个特定的文件夹,DeepFace 就会完成识别特定面孔的繁重工作。DeepFace 的缺点是返回结果需要一点时间。如果你想使用 DeepFace 进行实时面部识别,它可能不是最佳选择。然而,仍然有很多应用可以使用 DeepFace 构建。如果你在当前项目中使用 DeepFace,请务必与我们分享你是如何使用 DeepFace 的,或你打算如何使用它。

使用 DuckDB 与 Polars

原文:towardsdatascience.com/using-duckdb-with-polars-e15a865e48a3

了解如何使用 SQL 查询你的 Polars DataFrame

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

·发表于 Towards Data Science ·阅读时间 6 分钟·2023 年 4 月 14 日

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

Hans-Jurgen MagerUnsplash 上的照片

在我之前关于数据分析的几篇文章中,我讨论了两个在业界逐渐受到关注的重要新兴库:

  • DuckDB — 你可以使用 SQL 语句在内存中查询数据集。

  • Polars — 与久负盛名的 Pandas 库相比,更高效的数据框库。

[## 使用 DuckDB 进行数据分析

了解如何使用 SQL 进行数据分析

levelup.gitconnected.com ## 开始使用 Polars DataFrame 库

了解如何使用 Polars DataFrame 库操作表格数据(并替代 Pandas)

towardsdatascience.com

那么,结合这两个库的优势会怎样呢?

实际上,你可以通过 DuckDB 直接使用 SQL 语句查询 Polars 数据框。

那么,使用 SQL 查询 Polars 数据框有什么好处呢?尽管使用起来很方便,但操作 Polars 数据框仍然需要一些练习和相对陡峭的学习曲线。但由于大多数开发者已经熟悉 SQL,直接使用 SQL 操作数据框是否更加方便呢?采用这种方法,开发者可以兼得两全其美:

  • 使用所有各种函数查询 Polars 数据框的能力,或者

  • 在数据提取时,使用 SQL 进行更自然、更简单的操作

在这篇文章中,我将给你一些如何通过 DuckDB 使用 SQL 查询 Polars 数据框的示例。

安装 Polars 和 DuckDB

对于这篇文章,我正在使用 Jupyter Notebook。确保你已经通过以下命令安装了 Polars 和 DuckDB:

!pip install polars
!pip install duckdb

创建 Polars 数据框

要开始使用,让我们手动创建一个 Polars 数据框:

import polars as pl

df = pl.DataFrame(
     {
         'Model': ['iPhone X','iPhone XS','iPhone 12',
                   'iPhone 13','Samsung S11',
                   'Samsung S12','Mi A1','Mi A2'],
         'Sales': [80,170,130,205,400,30,14,8],     
         'Company': ['Apple','Apple','Apple','Apple',
                     'Samsung','Samsung','Xiao Mi',
                     'Xiao Mi'],
     })
df

数据框的样子如下:

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

所有图片由作者提供

比如,你现在想找出所有苹果公司销售量超过 80 的手机。你可以使用 Polars 中的 filter() 函数,如下所示:

df.filter(
    (pl.col('Company') == 'Apple') &
    (pl.col('Sales') > 80)
)

结果如下所示:

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

在 Polars 数据框上使用 SQL

现在让我们执行与前一节相同的查询,只不过这次我们将使用 DuckDB 和 SQL 语句。不过首先,让我们选择数据框中的所有行:

import duckdb

result = duckdb.sql('SELECT * FROM df')
result

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

你可以直接在 SQL 语句中引用 df 数据框。

使用 DuckDB 时,你可以通过 sql() 函数发出 SQL 语句。或者,query() 函数也可以使用:

result = duckdb.query('SELECT * FROM df')

result 变量是一个 duckdb.DuckDBPyRelation 对象。使用这个对象,你可以执行许多不同的任务,例如:

  • 计算 销售额 列的平均值:
result.mean('Sales')

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

  • 描述数据框:
result.describe()

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

  • 对数据框中的列应用缩放函数:
result.apply("max", 'Sales,Company')

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

  • 重新排序数据框:
result.order('Sales DESC')

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

但最简单的方式是直接使用 SQL 查询 Polars 数据框。

例如,如果你想获取所有销售量大于 80 的行,只需使用 sql() 函数和以下 SQL 语句:

duckdb.sql('SELECT * FROM df WHERE Sales >80').pl()

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

pl() 函数将 duckdb.DuckDBPyRelation 对象转换为 Polars 数据框。如果你想将其转换为 Pandas 数据框,请使用 df() 函数。

如果你想获取所有型号名称以“iPhone”开头的行,请使用以下 SQL 语句:

duckdb.sql("SELECT * FROM df WHERE Model LIKE 'iPhone%'").pl()

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

如果你想获取 AppleXiao Mi 的所有设备,请使用以下 SQL 语句:

duckdb.sql("SELECT * FROM df WHERE Company = 'Apple' OR Company ='Xiao Mi'").pl()

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

使用 DuckDB 与 Polars 数据框的真正强大之处在于你想从多个数据框中查询时。考虑以下来自 2015 年航班延误 数据集的三个 CSV 文件:

2015 年航班延误数据集www.kaggle.com/datasets/usdot/flight-delays许可证 — CC0: 公开领域

  • flights.csv

  • airlines.csv

  • airports.csv

让我们使用 Polars 加载它们:

import polars as pl

df_flights = pl.scan_csv('flights.csv')
df_airlines = pl.scan_csv('airlines.csv')
df_airports = pl.scan_csv('airports.csv')

display(df_flights.collect().head())
display(df_airlines.collect().head())
display(df_airports.collect().head())

上述语句使用了惰性求值来加载这三个 CSV 文件。这确保了在优化所有查询之前,不会对数据框执行任何查询。collect() 函数强制 Polars 将 CSV 文件加载到数据框中。

这里是 df_flightsdf_airlinesdf_airports 数据框的样子:

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

假设你想统计一家航空公司延误的次数,同时显示每家航空公司的名称,这里是你可以使用的 SQL 语句,使用 df_airlinesdf_flights 数据框:

duckdb.sql('''
    SELECT 
        count(df_airlines.AIRLINE) as Count,
        df_airlines.AIRLINE
    FROM df_flights, df_airlines
    WHERE df_airlines.IATA_CODE = df_flights.AIRLINE AND df_flights.ARRIVAL_DELAY > 0
    GROUP BY df_airlines.AIRLINE
    ORDER BY COUNT DESC
''')

结果如下:

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

如果你想统计每个州的机场数量并按降序排序,可以使用以下 SQL 语句:

duckdb.sql('''
    SELECT STATE, Count(*) as AIRPORT_COUNT
    FROM df_airports 
    GROUP BY STATE
    ORDER BY AIRPORT_COUNT DESC
''')

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

最后,假设你想知道哪家航空公司有最高的平均延误时间。你可以使用以下 SQL 语句计算各种统计数据,如 最小到达延误最大到达延误平均到达延误到达延误的标准差

duckdb.sql('''
    SELECT AIRLINE, MIN(ARRIVAL_DELAY), MAX(ARRIVAL_DELAY), 
        MEAN(ARRIVAL_DELAY), stddev(ARRIVAL_DELAY)
    FROM df_flights 
    GROUP BY AIRLINE
    ORDER BY MEAN(ARRIVAL_DELAY)
''')

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

根据平均到达延误,我们可以看到 AS 航空公司是延误最短的航空公司(由于值为负,这意味着大多数情况下它会更早到达!),而 NK 航空公司是延误最长的航空公司。想知道 AS 航空公司是什么吗?尝试使用你刚学到的知识!我将把它留作练习,答案在本文末尾。

如果你喜欢阅读我的文章并且它对你的职业/学习有所帮助,请考虑注册成为 Medium 会员。每月仅需 5 美元,你将获得对 Medium 上所有文章(包括我的文章)的无限制访问。如果你通过以下链接注册,我将获得一小部分佣金(对你没有额外费用)。你的支持意味着我可以花更多时间写更多类似的文章。

## 通过我的推荐链接加入 Medium - Wei-Meng Lee

阅读 Wei-Meng Lee 的每个故事(以及 Medium 上其他成千上万的作家的故事)。你的会员费直接支持……

weimenglee.medium.com

总结

在这篇简短的文章中,我展示了如何将 DuckDB 和 Polars 结合使用来查询你的数据框。利用这两个库,你可以享受最好的两个世界——使用熟悉的查询语言(即 SQL)来查询高效的数据框。快用你自己的数据集试试看,并与我们分享它是如何帮助你的数据分析过程的。

问答题答案:

duckdb.sql("SELECT AIRLINE from df_airlines WHERE IATA_CODE = 'AS'")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值