KDNuggets 博客中文翻译(五十二)

原文:KDNuggets

协议:CC BY-NC-SA 4.0

2022 年人工智能项目创意

原文:www.kdnuggets.com/2022/01/artificial-intelligence-project-ideas-2022.html

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

背景矢量图由 starline 创建 - www.freepik.com

作为数据科学行业的初学者,你一定读过无数篇描述创建数据科学项目重要性的文章。事实上,我因为展示了我的项目而获得了我的第一份数据科学职位。

然而,并不是每个数据科学项目都能让你获得行业职位。

我曾经审查过数据科学申请者的简历,大多数人都在初级职位申请中被拒绝,甚至没有进入面试阶段。

其中一些候选人在简历中确实包括了项目——但他们展示的项目过于简单。这些是他们在训练营或在线课程中创建的项目,对他们的申请反而起到了负面作用。

招聘人员会快速浏览数百份简历来寻找相同的职位。如果每个候选人在申请的项目部分都展示了一个泰坦尼克号生存预测模型,那么他们之间就没有任何区别了。

要在求职时真正脱颖而出,构建独特且富有创意的项目是很重要的。

招聘经理知道你在申请入门级职位时不可能掌握整个机器学习工具链。这不是他们所寻找的。技能可以随着时间的推移得到磨练,而许多东西可以在工作中学习。

你只需比其他申请者多做一步。展示一个有创意的项目,并围绕它讲述一个故事。这表明你对学习充满热情——你愿意花时间创建一些东西,并不是因为你能立即获得收益,而是因为你喜欢这样做。这种学习的愿望是大多数优秀经理和招聘人员积极寻找的特质,因为其他技能可以随着时间的推移得到磨练。

在这篇文章中,我将为你提供一份人工智能项目创意列表,这些项目会在你的简历上显得非常出色。

我自己想出了这些项目并亲自构建了它们,如果有相关链接的话,我会提供给你。我希望你能从这些项目中获得灵感,甚至可能会创建出你自己的版本。

名人长相模型

这是我去年创建的一个项目。我创建了一个网页应用,允许用户上传自己或他人的照片,底层的机器学习模型会预测他们的名人长相。

我使用了这个名人数据库来构建模型。后端使用了 Flask,前端使用了 Javascript 和 HTML。模型训练使用了 VGG16——一个流行的预训练神经网络。

你可以在这里找到这个项目的详细说明。

哈利·波特性格预测

这是我之前创建的另一个项目。我构建了一个文本预测模型,该模型可以根据用户输入的句子预测他们的哈利·波特性格双胞胎。

我使用了 MBTI 性格预测数据集来完成这个任务,并且根据我从 Google 搜索中获得的信息,将每个哈利·波特角色映射到他们各自的 MBTI 类型。

高度准确?可能不是。不过,创建这个模型还是很有趣的。

为了完成这个任务,我尝试了一个 LSTM 模型(这是一个常用于预测序列(如文本数据)的递归神经网络架构)。我还尝试使用了 FastAI 库中内置的预训练模型,并使用 MBTI 数据集进行了再次训练。

最终,我创建了一个网络应用程序,用户可以输入一句话,预测结果会显示在屏幕上。这个界面是使用名为 JupyterDash 的包创建的。

年龄检测模型

这是一个在许多现实世界场景中都有应用的项目想法。很多时候,未成年人或掠夺者试图在社交或约会平台上隐藏他们的年龄。这些应用程序中的许多并没有很好地进行审核,很多这些档案最终未被检测到,导致不幸的情况发生。

一个能够基于用户的头像准确预测年龄的模型可以帮助过滤和限制年龄不合适的用户。

这里是一些可以帮助你开始构建这个模型的资源。

约会/友谊匹配算法

你是否曾经在约会网站上向右滑动过某个人,却在几小时的无聊对话后才意识到你们之间完全没有共同点?

你可以创建一个匹配算法来解决这个问题!如果你是机器学习的新手,你可以从一个简单的基于相关性的解决方案开始。

创建一个用户档案数据集和一个针对每个用户的问卷,包括基本的人口统计信息和兴趣细节。然后你可以创建一个相关性矩阵来评分每个用户回答之间的相似性,并相应地提供推荐。

这里有一个我找到的关于创建你自己匹配算法的教程。试试,然后加入你自己的创意吧!

结论

上述列出的项目并不复杂。它们简单,可以使用像 OpenCV 这样的包中可用的预训练模型和模块构建。

这些项目与我在候选人简历上常见的项目的主要区别在于创造力。这些项目有所不同。它们尝试解决现实世界中经常遇到的问题,或者它们本身很有趣。

在为你的简历构建数据科学项目时,可以考虑这些思路。创建一个用户可以互动的界面。注重数据展示和讲故事的技能,不要让这些项目只是静静地放在你的 GitHub 仓库里。

Natassha Selvaraj 是一位自学成才的数据科学家,对写作充满热情。你可以在LinkedIn上与她联系。

更多相关主题

人工智能和聊天机器人的语音识别:入门指南

原文:www.kdnuggets.com/2017/01/artificial-intelligence-speech-recognition-chatbots-primer.html

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

对话用户界面(CUI)是当前人工智能发展的核心。尽管许多应用和产品仅仅是“机械土耳其人”——即表面上自动化的机器,而实际工作却由隐藏的人完成——但在符号或统计学习方法中,语音识别有许多有趣的进展。


我们的前三个课程推荐

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 2. 谷歌数据分析专业证书 - 提升你的数据分析技能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT 工作


尤其是,深度学习在增强机器人的能力方面远远超过了传统的自然语言处理(即词袋模型、TF-IDF 等),并且创造了“对话即平台”的概念,这正在颠覆应用市场。

我们的智能手机目前代表了每平方厘米最昂贵的购买领域(甚至比比佛利山庄房屋的每平方米价格还要贵),不难想象,拥有一个独特的机器人界面将使这个领域几乎没有价值。

但这一切都不可能实现,如果没有大量投资于语音识别研究。深度强化学习(DFL)在过去几年里一直是主宰,它依靠人类的反馈。然而,我个人认为,我们很快将转向 B2B(机器人对机器人)训练,原因很简单:奖励结构。如果人们的付出得到足够的回报,他们会花时间训练他们的机器人。

这不是一个新概念,李登(微软)及其团队对此非常了解。他实际上提供了一个很好的人工智能机器人三重分类

  • 寻找信息的机器人;

  • 寻找信息以完成特定任务的机器人;

  • 具有社交能力和任务的机器人(他称之为社交机器人聊天机器人

对于前两项,奖励结构确实比较容易定义,而第三项则更复杂,这使得现在更难以处理。

当这第三类技术完全实现时,我们将发现自己生活在一个机器彼此之间和与人类之间以相同方式沟通的世界。在这个世界里,机器人对机器人的商业模式将成为一种常态,并且将由两种类型的机器人构成:主控机器人跟随机器人

我相信,语音识别领域的研究以及该特定领域的技术堆栈将不断积累。这将导致一些玩家创建“通用”机器人(主控机器人),其他人将使用这些机器人作为其(外围)接口和应用程序的网关。然而,这种集中(几乎是垄断)的情境的好处是,尽管有两级复杂性,我们不会遇到影响当前深度学习运动的黑箱问题,因为机器人(无论是主控还是跟随)将以简单的英语而非任何编程语言相互沟通。

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

图片来源:blog.dlvrit.com/2016/05/facebook-messenger-chatbots/

通往主控机器人的挑战

传统上,我们可以将语音识别的深度学习模型视为基于检索的模型生成模型。第一类模型使用启发式方法从预定义的响应中提取答案,根据输入和上下文进行回答,而后者则每次从头生成新的响应。

目前语音识别的最先进技术已经自 2012 年以来有了很大进展,包括深度 Q 网络(DQN)、深度信念网络(DBN)、长短期记忆 RNN、门控循环单元(GRU)、序列到序列学习(Sutskever 等,2014)和张量乘积表示(关于语音识别的出色概述,请参见 Deng 和 Li,2013)。

所以,如果深度学习突破能够提高我们对机器认知的理解,那是什么阻碍了我们实现完美的社交机器人呢?我能想到至少有几个原因。

首先,机器翻译仍处于起步阶段。谷歌最近创建了“神经机器翻译”,这是该领域的一个重要进展,新版本甚至支持零样本翻译(即在没有训练的语言中进行翻译)。

其次,语音识别仍主要是一个监督过程。我们可能需要在无监督学习方面做更多的努力,并最终更好地整合符号和神经表示。

此外,关于人类语音识别还有许多细微差别,我们尚未能够完全嵌入到机器中。MetaMind 在这一领域做得很出色,并且最近推出了联合多任务(JMT)和动态共注意力网络(DCN),分别是一个端到端可训练的模型,允许不同层之间的协作,以及一个通过文档阅读的网络,它拥有根据正在尝试回答的问题的文档内部表示

最终,到目前为止创建的自动语音识别(ASR)引擎要么缺乏个性,要么完全没有时空背景。这两个方面对于通用的 CUI(对话用户界面)至关重要,目前为止只有少数几个研究尝试过(Yao 等人,2015 年;Li 等人,2016 年)。

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

图片来源:www.assafelovic.com/

市场如何分布?

这最初并不是本文的部分内容,但我发现快速浏览一下这个领域的主要参与者是有用的,以便理解语音识别在商业环境中的重要性。

机器人的历史可以追溯到 Eliza(1966 年,首个机器人)、Parry(1968 年),然后是 ALICE 和 Clever 在九十年代以及最近的微软小冰,但在过去 2–3 年中有了很大的发展。

我喜欢根据这个 2x2 矩阵来思考这个市场。实际上,你可以将机器人分类为原生机器人或使能机器人,设计用于特定应用或通用应用。这一分类的边界仅仅是粗略的,你可能会发现有公司在这两个象限之间交集的地方运营:

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

机器人分类矩阵

根据这一分类,我们可以识别出四种不同类型的初创公司:

  • 员工型机器人: 这些机器人是在特定行业或应用领域内创建的。它们是独立的框架,不需要额外的训练,准备好即插即用;

  • 通用用户界面:这些是代表对通用对话界面最纯粹的追求的本地应用程序;

  • 机器人承包商:这些是被“聘用”来完成特定任务的机器人,但它们是作为通用型机器人创建的。通常比其员工型机器人便宜且不那么专业,与主应用程序以某种共生方式存在。考虑将这一类别视为功能性机器人而非行业专家(第一类)可能更有用;

  • 机器人工厂:这些是促进你创建自己机器人的一类初创公司。

提供了一些(并非详尽的)每组中运作的公司的例子,但可以明显看出市场正在变得拥挤且非常有利可图。

最终思考

在深度学习语音识别领域工作是一个令人兴奋的时刻。不仅研究界,市场也迅速认识到这一领域作为 AGI 发展的关键步骤的重要性。

当前 ASR 和聊天机器人的状态很好地反映了狭义 AI 和通用智能之间的区别,我认为我们应该谨慎管理投资者和客户的期望。我也相信,并非每个人都会在这个领域分得一杯羹,只有少数玩家会占据大部分市场,但这个领域变化如此迅速,很难对其做出预测。

参考文献

Deng, L., Li, X. (2013). “语音识别的机器学习范式:概述”。 IEEE 音频、语音和语言处理学报 21(5)。

Li, J., Galley, M., Brockett, C., Spithourakis, G., Gao, J., Dolan, W. B. (2016). “基于角色的神经对话模型”。 ACL (1)

Sutskever, I., Vinyals, O., Le, Q. (2014). “序列到序列学习与神经网络”。 NIPS 2014: 3104–3112.

Yao, K., Zweig, G., Peng, B. (2015). “带意图的注意力神经网络对话模型”。 CoRR abs/1510.08565

个人简介: Francesco Corea 是一位基于英国伦敦的决策科学家和数据战略师。

原文。经许可转载。

相关内容:

  • 激发聊天机器人的 10 种关键机器学习能力

  • 人工智能分类矩阵

  • 关于人工智能的 13 个预测

更多内容

人工智能如何改变数据集成

原文:www.kdnuggets.com/2022/04/artificial-intelligence-transform-data-integration.html

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

由 vectorjuice 创建的部署向量 - www.freepik.com

数据集成的世界已经变化多年。特别是考虑到全球越来越多的员工远程工作,企业现在比以往任何时候都更需要实时访问数据。借助人工智能(AI),组织可以更有效地分析大量信息,并在整个业务中共享其分析结果。


我们的三大课程推荐

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 1. Google 网络安全证书 - 快速进入网络安全职业生涯。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 2. Google 数据分析专业证书 - 提升你的数据分析能力

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 3. Google IT 支持专业证书 - 支持你的组织在 IT 领域


人工智能(AI)和机器学习(ML)现在使企业能够创建数据集成平台,从而减少做出数据驱动的组织决策所需的时间。通过这些平台,企业还可以更好地保护敏感用户数据,防止恶意行为者的泄露。人工智能和机器学习还使公司更容易遵守重要的数据隐私和使用规定,例如 GDPR 和 HIPAA。

为了最大化人工智能和机器学习分析大量数据的潜力,企业必须利用其数据智能能力来创建和扩展数据集成平台。让我们来看看创建企业级数据智能基础所涉及的内容,以及人工智能和机器学习如何永久性地改变数据集成。

人工智能提升信息质量

人工智能已被证明能够加快业务执行特定操作序列以为业务参与者创造价值的过程。这种 流程自动化,虽然只是人工智能在利用数据智能提供一致、可靠结果时众多好处之一;人工智能还可以大大提高数据质量,解决基于数据质量的问题。

人工智能使组织能够提高数据的一致性,从而最终提升其全企业的数据管理能力。借助 AI 和 ML,组织可以主动应对数据质量相关的问题,而不是以临时、无结构的方式做出反应。例如,一个组织可以不断将大量数据写入用户设备,并利用 AI 更好地预测用户何时会将设备断开网络,从而使自己易受不良行为者的攻击。

此外,AI 还允许企业监控用户设备——即使是离线的设备——以提醒他们何时停止向这些设备发送数据。企业的 AI 系统能够监控的设备越多,它就能越好地预测用户在设备使用方面的模式,以预期用户何时会离线,知道何时停止数据传输,从而降低整体维修成本。这种监控策略还为企业提供了检测异常的保护,考虑到数据隐私法规限制了他们对用户如何与设备互动的控制。

更快的数据映射和处理

实时数据驱动决策的一个重要部分是客户数据映射。借助 AI,企业现在可以比以往更快地进行数据映射。更快的客户数据映射加快了组织转化数据和做出相应数据驱动决策的速度。

工具如 AI 映射系统允许用户概述复杂的客户数据映射,这些映射依赖于 ML 算法。这些 AI 驱动的工具使得商业领袖能够指导更准确的过程,通过这些过程他们可以绘制客户数据图谱——即使是非技术用户也可以使用这些创新工具来绘制客户数据图谱,而他们的信息技术同事则可以从事其他更技术性的任务。

AI 还可以加快企业处理大量数据的速度。ML 算法使得数据分析更快,即使这种分析涉及企业级的大数据。这种改进的数据处理最常应用于传统解决方案,但它也可以用于解析更现代的商业解决方案,如商业短信;改进的 AI 驱动的大数据处理甚至可以在应用于组织的大数据内部结构时,利用 ML 算法创建数据模型。

AI 和 ML 技术解决传统数据整合问题

不久之前,大多数企业处理大量数据都是手动操作的。现代的大数据来源通常来自物联网(IoT)和流数据——简单来说,来自这些来源的大量数据无法通过传统的数据整合过程处理。幸运的是,依赖于机器学习(ML)技术的人工智能可以在应用于如物联网和流数据等来源时,改善数据整合的流动性。

人工智能和机器学习还提供了其他几个好处,解决了业务数据整合中的常见问题。例如,人工智能和机器学习降低了使用复杂度,同时使非技术专业人员更容易处理数据整合任务,而不需要寻求他人帮助。这种情况导致数据整合对用户的拥有成本降低。

此外,人工智能和机器学习技术提供了相对易于使用的数据整合(DI)模板,用于处理可配置数据。在人工智能的帮助下,这些数据整合模板变得适合提供直观的、逐步的过程,非技术专业人员可以按照这些步骤进行数据整合任务。

结论

展望未来,值得注意的是,人工智能和机器学习技术将不可避免地增加对数据工程专业人员的高需求。企业应为未来的数据工程角色做好准备,这些角色将需要能够理解如何训练机器学习模型,以识别客户设备和数据使用中的数据质量相关异常的专业人员。

这意味着数据工程角色即将成为机器监督者的职位——数据工程师将负责训练机器,并确保它们准确地关联和分类属于大数据结构的资产。幸运的是,人工智能能够减少手动数据整合任务的时间,使数据工程师能够更好地监督机器训练背景下的数据分类任务。

Nahla Davies 是一位软件开发人员和技术作家。在全职从事技术写作之前,她曾担任 Inc. 5000 名录中的一家具体验品牌化公司的首席程序员,该公司的客户包括三星、时代华纳、Netflix 和索尼。

更多相关话题

人工智能 vs. 机器学习 vs. 深度学习:有什么区别?

原文:www.kdnuggets.com/2019/08/artificial-intelligence-vs-machine-learning-vs-deep-learning-difference.html

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

ActiveWizards 提供

实际上,未来 10,000 个初创公司的商业计划很容易预测:拿到 X 并加入 AI。找到那些通过添加在线智能可以改进的东西。

— 凯文·凯利,《不可避免:理解将塑造我们未来的 12 大技术力量》

过去几年,人工智能继续成为最热门的话题之一。最顶尖的人才参与 AI 研究,最大的公司为这一领域的发展分配了巨额资金,而 AI 初创公司每年都获得数十亿美元的投资。

如果你从事业务流程改进或寻找新的商业创意,那么你很可能会接触到 AI。为了有效地与其合作,你需要了解其组成部分。

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

人工智能

让我们了解一下人工智能的本质。弗朗索瓦·肖莱在他的书《Python 深度学习》中做了简要描述:“这是将通常由人类执行的智力任务自动化的努力。因此,AI 是一个包含机器学习和深度学习的通用领域,但也包括许多不涉及任何学习的方法。”

例如,今天聊天机器人的前身,ELIZA,这是在 MIT 人工智能实验室创建的。这个程序能够与人进行长时间对话,但不能在对话过程中学习新词汇或修正其行为。ELIZA 的行为是通过一种特殊的编程语言明确指定的。

人工智能在现代意义上的历史始于 1950 年代,当时艾伦·图灵的工作和达特茅斯研讨会汇集了这一领域的首批爱好者,并制定了 AI 科学的基本原则。此后,该领域经历了几次兴趣激增和随后的萧条(所谓的“AI 冬天”),以至于今天成为世界科学的关键领域之一。

值得提及的是强人工智能和弱人工智能的假设。强人工智能能够思考并将自己意识到作为一个独立的个体。弱人工智能则没有这些能力,只能执行某些范围的任务(例如下棋、识别图像中的猫或以$432,500 绘制一幅画)。所有现有的人工智能都是弱的,不必担心。

如今,很难想象任何一种活动没有人工智能的使用。无论是开车、自拍、在网上商店挑选运动鞋,还是规划假期,你几乎在每个地方都得到一个小巧、弱小但已经非常有用的人工智能的帮助。

机器学习

智能(无论是人工的还是非人工的)的一个关键特性是学习的能力。对于人工智能来说,这种能力由一系列机器学习模型负责。它们的本质很简单:与传统算法不同,传统算法是将输入数据转化为结果的明确指令集,而基于数据示例和相应结果的机器学习则在数据中找到模式,生成一个将任意数据转化为期望结果的算法。

机器学习主要分为三类:

  • 监督学习 - 系统基于具有先前已知结果的数据示例进行训练。机器学习中有两种最受欢迎的任务:回归和分类任务。回归是对连续结果的预测,例如房价或制造业排放水平。分类是对类别(类)的预测,例如电子邮件是否为垃圾邮件,或者书籍是侦探小说还是百科全书。

  • 无监督学习 - 系统在数据中发现内部关系和模式。在这种情况下,每个示例的结果是未知的。

  • 强化学习 是一种方法,在这种方法中,系统因正确的行动而获得奖励,对错误的行动则给予惩罚。因此,系统学习制定一个算法,以获得最高奖励和最低惩罚。

一个理想的机器学习模型可以分析任何数据,发现所有模式,并创建一个实现任何期望结果的算法。但这个理想模型尚未创建。你可以在 Pedro Domingos 的《大师算法》中了解创建它的过程。

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

目前的机器学习模型专注于特定任务,它们都有各自的优点和缺点。这些模型包括以下几种:

  • 线性回归 是一种经典的统计模型。顾名思义,它用于回归任务,即对连续值的预测。例如,根据天气预测会售出多少柠檬水。

  • 逻辑回归 用于分类任务。它预测给定样本属于某个特定类别的概率。

  • 决策树 是一种常用于分类任务的方法。在这种方法中,给定对象的类别被定义为一系列问题,每个问题通常涉及“是”或“否”的回答。

  • K-Nearest Neighbors 是一种简单且快速的方法,主要用于分类。在这种方法中,数据点的类别由与数据点示例最相似的 k 个(k 可以是任何数字)确定。

  • 朴素贝叶斯 是一种流行的分类方法,它利用概率论和贝叶斯定理来确定在给定条件下(例如邮件中出现“免费贷款”这一短语 20 次)某个事件(如邮件是否为垃圾邮件)的可能性。

  • SVM 是一种监督机器学习算法,常用于分类任务。它能够有效地分离不同类别的对象,即使每个对象具有许多相关的特征。

  • 集成学习 结合了许多机器学习模型,并通过对每个模型的响应进行投票或平均来确定对象的类别。

  • 神经网络 基于人脑的原理。神经网络由许多神经元及其之间的连接组成。一个神经元可以表示为一个具有多个输入和一个输出的函数。每个神经元从输入中获取参数(每个输入可能具有不同的权重,这决定了其重要性),对其进行特定的操作,并将结果提供给输出。一个神经元的输出可以作为另一个神经元的输入。因此,形成了多层神经网络,这就是深度学习的主题。我们将更详细地讨论这一点。

神经元结构图:

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

具有两个隐藏层的人工神经网络:

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

通过学习给定示例,神经网络调整神经元之间的权重,以便给予对获得期望结果影响最大的神经元最大的权重。例如,如果一个动物是有条纹的、蓬松的并且在喵喵叫,那么它可能是只猫。与此同时,我们将最大权重分配给喵喵叫这个参数。所以即使动物没有条纹也不蓬松,但如果它喵喵叫 - 它仍然很可能是只猫。

深度学习

深度学习涉及深度神经网络。关于深度的意见可能有所不同。一些专家认为,如果网络具有多个隐藏层,它就可以被视为深度的,而其他专家则认为只有当网络具有许多隐藏层时,才算深度网络。

现在有几种类型的神经网络正在被广泛使用。其中最受欢迎的包括:

  • 长短期记忆网络(LSTM) - 用于文本分类和生成、语音识别、音乐创作生成和时间序列预测。

  • 卷积神经网络(CNN) - 用于图像识别、视频分析和自然语言处理任务。

结论

那么人工智能、机器学习和深度学习之间有什么区别呢?我们希望,阅读本文后,你已经知道这个问题的答案。人工智能是自动化智力任务(如阅读、下围棋、图像识别和创造自动驾驶汽车)的一个广泛领域。机器学习是一组负责 AI 学习能力的人工智能方法。深度学习是机器学习方法的一个子类,研究多层神经网络。

ActiveWizards 是一个数据科学家和工程师团队,专注于数据项目(大数据、数据科学、机器学习、数据可视化)。核心专长领域包括数据科学(研究、机器学习算法、可视化和工程)、数据可视化(d3.js、Tableau 等)、大数据工程(Hadoop、Spark、Kafka、Cassandra、HBase、MongoDB 等)以及数据密集型 Web 应用开发(RESTful API、Flask、Django、Meteor)。

原文。已获许可转载。

相关:

  • 2018 年数据科学领域前 20 大 Python 库

  • 金融领域数据科学的 7 大应用案例

  • 前 6 大 Python 自然语言处理库比较


我们的前三大课程推荐

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 1. 谷歌网络安全证书 - 快速开启网络安全职业生涯。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 2. 谷歌数据分析专业证书 - 提升你的数据分析技能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 3. 谷歌 IT 支持专业证书 - 支持你的组织 IT


更多相关主题

使用 NumPy 和图像分类的人工神经网络实现

原文:www.kdnuggets.com/2019/02/artificial-neural-network-implementation-using-numpy-and-image-classification.html/2

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

ANN 实现

下一图展示了目标 ANN 结构。输入层有 102 个输入,2 个隐藏层分别有 150 和 60 个神经元,输出层有 4 个输出(每个水果类别一个)。

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

在任何层中,输入向量通过与下一层连接的权重矩阵(矩阵乘法)进行乘法操作,产生一个输出向量。这个输出向量再次通过与下一层连接的权重矩阵进行乘法操作。该过程持续到达输出层。矩阵乘法的总结见下图。

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

输入向量的大小为 1x102,需与第一隐藏层的权重矩阵(大小为 102x150)相乘。记住这是矩阵乘法。因此,输出数组的形状为 1x150。该输出用作第二隐藏层的输入,再与大小为 150x60 的权重矩阵相乘。结果大小为 1x60。最后,这样的输出与第二隐藏层和输出层之间的权重(大小为 60x4)相乘。最终结果大小为 1x4。每个结果向量中的元素表示一个输出类别。根据最高分的类别对输入样本进行标记。

实现这些乘法的 Python 代码如下所示。


import numpy
import pickle

def sigmoid(inpt):
  return 1.0 / (1 + numpy.exp(-1 * inpt))

f = open("dataset_features.pkl", "rb")
data_inputs2 = pickle.load(f)
f.close()

features_STDs = numpy.std(a=data_inputs2, axis=0)
data_inputs = data_inputs2[:, features_STDs > 50]

f = open("outputs.pkl", "rb")
data_outputs = pickle.load(f)
f.close()

HL1_neurons = 150
input_HL1_weights = numpy.random.uniform(low=-0.1, high=0.1,
    size=(data_inputs.shape[1], HL1_neurons))

HL2_neurons = 60
HL1_HL2_weights = numpy.random.uniform(low=-0.1, high=0.1,
    size=(HL1_neurons, HL2_neurons))

output_neurons = 4
HL2_output_weights = numpy.random.uniform(low=-0.1, high=0.1,
    size=(HL2_neurons, output_neurons))

H1_outputs = numpy.matmul(a=data_inputs[0, :], b=input_HL1_weights)
H1_outputs = sigmoid(H1_outputs)
H2_outputs = numpy.matmul(a=H1_outputs, b=HL1_HL2_weights)
H2_outputs = sigmoid(H2_outputs)
out_otuputs = numpy.matmul(a=H2_outputs, b=HL2_output_weights)

predicted_label = numpy.where(out_otuputs == numpy.max(out_otuputs))[0][0]
print("Predicted class : ", predicted_label)

在读取之前保存的特征及其输出标签并过滤特征后,定义层的权重矩阵。它们被随机赋值在-0.1 到 0.1 之间。例如,变量**“input_HL1_weights”**保存了输入层和第一隐藏层之间的权重矩阵。该矩阵的大小根据特征元素的数量和隐藏层中神经元的数量定义。

创建权重矩阵后,接下来是应用矩阵乘法。例如,变量**“H1_outputs”**保存了将给定样本的特征向量与输入层和第一隐藏层之间的权重矩阵相乘后的输出。

通常,对每个隐藏层的输出应用激活函数,以在输入和输出之间创建非线性关系。例如,将矩阵乘法的输出应用于 sigmoid 激活函数。

生成输出层输出后,进行预测。预测的类别标签被保存到 “predicted_label” 变量中。这些步骤对每个输入样本重复。下面是适用于所有样本的完整代码。


import numpy
import pickle

def sigmoid(inpt):
  return 1.0 / (1 + numpy.exp(-1 * inpt))

def relu(inpt):
  result = inpt
  result[inpt < 0] = 0
  return result

def update_weights(weights, learning_rate):
  new_weights = weights - learning_rate * weights
  return new_weights

def train_network(num_iterations, weights, data_inputs, data_outputs, learning_rate, activation="relu"):
  for iteration in range(num_iterations):
    print("Itreation ", iteration)
    for sample_idx in range(data_inputs.shape[0]):
      r1 = data_inputs[sample_idx, :]
      for idx in range(len(weights) - 1):
       curr_weights = weights[idx]
       r1 = numpy.matmul(a=r1, b=curr_weights)
       if activation == "relu":
         r1 = relu(r1)
       elif activation == "sigmoid":
         r1 = sigmoid(r1)
    curr_weights = weights[-1]
    r1 = numpy.matmul(a=r1, b=curr_weights)
    predicted_label = numpy.where(r1 == numpy.max(r1))[0][0]
    desired_label = data_outputs[sample_idx]
    if predicted_label != desired_label:
      weights = update_weights(weights,
        learning_rate=0.001)
  return weights

def predict_outputs(weights, data_inputs, activation="relu"):
  predictions = numpy.zeros(shape=(data_inputs.shape[0]))
  for sample_idx in range(data_inputs.shape[0]):
    r1 = data_inputs[sample_idx, :]
      for curr_weights in weights:
        r1 = numpy.matmul(a=r1, b=curr_weights)
      if activation == "relu":
        r1 = relu(r1)
      elif activation == "sigmoid":
        r1 = sigmoid(r1)
    predicted_label = numpy.where(r1 == numpy.max(r1))[0][0]
    predictions[sample_idx] = predicted_label
  return predictions

f = open("dataset_features.pkl", "rb")
data_inputs2 = pickle.load(f)
f.close()

features_STDs = numpy.std(a=data_inputs2, axis=0)
data_inputs = data_inputs2[:, features_STDs > 50]

f = open("outputs.pkl", "rb")
data_outputs = pickle.load(f)
f.close()

HL1_neurons = 150
input_HL1_weights = numpy.random.uniform(low=-0.1, high=0.1,
size=(data_inputs.shape[1], HL1_neurons))

HL2_neurons = 60
HL1_HL2_weights = numpy.random.uniform(low=-0.1, high=0.1,
size=(HL1_neurons, HL2_neurons))

output_neurons = 4
HL2_output_weights = numpy.random.uniform(low=-0.1, high=0.1,
size=(HL2_neurons, output_neurons))

weights = numpy.array([input_HL1_weights,
  HL1_HL2_weights,
  HL2_output_weights])

weights = train_network(num_iterations=10,
  weights=weights,
  data_inputs=data_inputs,
  data_outputs=data_outputs,
  learning_rate=0.01,
  activation="relu")

predictions = predict_outputs(weights, data_inputs)
num_flase = numpy.where(predictions != data_outputs)[0]
print("num_flase ", num_flase.size)

“weights” 变量保存了整个网络中的所有权重。根据每个权重矩阵的大小,网络结构被动态指定。例如,如果 “input_HL1_weights” 变量的大小是 102x80,那么我们可以推断出第一个隐藏层有 80 个神经元。

“train_network” 是核心功能,它通过遍历所有样本来训练网络。对于每个样本,应用了在列表 3-6 中讨论的步骤。它接受训练迭代次数、特征、输出标签、权重、学习率和激活函数。激活函数有两个选项,即 ReLU 或 sigmoid。ReLU 是一个阈值函数,只要输入大于零,就返回相同的输入。否则,它返回零。

如果网络对给定样本做出了错误预测,则使用 “update_weights” 函数更新权重。没有使用优化算法来更新权重。权重根据学习率简单地更新。准确率不会超过 45%。为了获得更好的准确率,可以使用优化算法来更新权重。例如,你可以在 scikit-learn 库的 ANN 实现中找到梯度下降技术。

在我的书中,你可以找到使用遗传算法(GA)优化技术来优化 ANN 权重的指南,这种技术提高了分类准确率。你可以从我准备的以下资源中了解更多关于 GA 的内容:

遗传算法优化介绍

遗传算法(GA)优化 - 步骤示例

遗传算法在 Python 中的实现

联系作者

原文。已获许可转载。

相关:


我们的前 3 名课程推荐

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 1. 谷歌网络安全证书 - 快速进入网络安全职业

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 2. 谷歌数据分析专业证书 - 提升你的数据分析技能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 3. 谷歌 IT 支持专业证书 - 支持你的组织 IT


更多相关主题

使用遗传算法和 Python 优化人工神经网络

原文:www.kdnuggets.com/2019/03/artificial-neural-networks-optimization-genetic-algorithm-python.html/2

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

完整的 Python 实现

这个项目的 Python 实现包括三个 Python 文件:

  1. GA.py 用于实现 GA 函数。

  2. ANN.py 用于实现 ANN 函数。

  3. 第三个文件用于通过多个代调用这些函数。这是项目的主要文件。

主项目文件实现


我们的前三大课程推荐

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 1. Google 网络安全证书 - 快速进入网络安全职业

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 2. Google 数据分析专业证书 - 提升你的数据分析能力

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 3. Google IT 支持专业证书 - 支持你的组织在 IT 领域


第三个文件是主要文件,因为它连接了所有函数。它读取特征和类标签文件,根据标准差过滤特征,创建 ANN 架构,生成初始解,通过计算所有解的适应度值、选择最佳父代、应用交叉和变异,最后创建新种群来循环多个代。其实现如下。该文件定义了 GA 参数,如每个种群的解的数量、选择的父代数量、变异百分比和代数。你可以尝试不同的值。


import numpy

import GA

import pickle

import ANN

import matplotlib.pyplot

f = open("dataset_features.pkl", "rb")

data_inputs2 = pickle.load(f)

f.close()

features_STDs = numpy.std(a=data_inputs2, axis=0)

data_inputs = data_inputs2[:, features_STDs>50]

f = open("outputs.pkl", "rb")

data_outputs = pickle.load(f)

f.close()

#Genetic algorithm parameters:

#    Mating Pool Size (Number of Parents)

#    Population Size

#    Number of Generations

#    Mutation Percent

sol_per_pop = 8

num_parents_mating = 4

num_generations = 1000

mutation_percent = 10

#Creating the initial population.

initial_pop_weights = []

for curr_sol in numpy.arange(0, sol_per_pop):

    HL1_neurons = 150

    input_HL1_weights = numpy.random.uniform(low=-0.1, high=0.1,

                                             size=(data_inputs.shape[1], HL1_neurons))

    HL2_neurons = 60

    HL1_HL2_weights = numpy.random.uniform(low=-0.1, high=0.1,

                                             size=(HL1_neurons, HL2_neurons))

    output_neurons = 4

    HL2_output_weights = numpy.random.uniform(low=-0.1, high=0.1,

                                              size=(HL2_neurons, output_neurons))

    initial_pop_weights.append(numpy.array([input_HL1_weights,

                                                HL1_HL2_weights,

                                                HL2_output_weights]))

pop_weights_mat = numpy.array(initial_pop_weights)

pop_weights_vector = GA.mat_to_vector(pop_weights_mat)

best_outputs = []

accuracies = numpy.empty(shape=(num_generations))

for generation in range(num_generations):

    print("Generation : ", generation)

    # converting the solutions from being vectors to matrices.

    pop_weights_mat = GA.vector_to_mat(pop_weights_vector,

                                       pop_weights_mat)

    # Measuring the fitness of each chromosome in the population.

    fitness = ANN.fitness(pop_weights_mat,

                          data_inputs,

                          data_outputs,

                          activation="sigmoid")

    accuracies[generation] = fitness[0]

    print("Fitness")

    print(fitness)

    # Selecting the best parents in the population for mating.

    parents = GA.select_mating_pool(pop_weights_vector,

                                    fitness.copy(),

                                    num_parents_mating)

    print("Parents")

    print(parents)

    # Generating next generation using crossover.

    offspring_crossover = GA.crossover(parents,

                                       offspring_size=(pop_weights_vector.shape[0]-parents.shape[0], pop_weights_vector.shape[1]))

    print("Crossover")

    print(offspring_crossover)

    # Adding some variations to the offsrping using mutation.

    offspring_mutation = GA.mutation(offspring_crossover,

                                     mutation_percent=mutation_percent)

    print("Mutation")

    print(offspring_mutation)

    # Creating the new population based on the parents and offspring.

    pop_weights_vector[0:parents.shape[0], :] = parents

    pop_weights_vector[parents.shape[0]:, :] = offspring_mutation

pop_weights_mat = GA.vector_to_mat(pop_weights_vector, pop_weights_mat)

best_weights = pop_weights_mat [0, :]

acc, predictions = ANN.predict_outputs(best_weights, data_inputs, data_outputs, activation="sigmoid")

print("Accuracy of the best solution is : ", acc)

matplotlib.pyplot.plot(accuracies, linewidth=5, color="black")

matplotlib.pyplot.xlabel("Iteration", fontsize=20)

matplotlib.pyplot.ylabel("Fitness", fontsize=20)

matplotlib.pyplot.xticks(numpy.arange(0, num_generations+1, 100), fontsize=15)

matplotlib.pyplot.yticks(numpy.arange(0, 101, 5), fontsize=15)

f = open("weights_"+str(num_generations)+"_iterations_"+str(mutation_percent)+"%_mutation.pkl", "wb")

pickle.dump(pop_weights_mat, f)

f.close()

基于 1,000 代,文件末尾使用Matplotlib可视化库创建了一个图表,显示每代准确率的变化。它显示在下一个图中。

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

经过 1,000 次迭代后,准确率超过 97%。相比之下,如果不使用优化技术,则准确率为 45%。这说明结果可能不佳并非因为模型或数据有问题,而是因为没有使用优化技术。当然,使用不同的参数值,例如 10,000 代,可能会提高准确率。在该文件的末尾,它将参数以矩阵形式保存到磁盘以备后用。

GA.py 实现

GA.py 文件的实现如下所示。请注意,mutation() 函数接受mutation_percent 参数,定义了要随机更改其值的基因数量。主文件中设置为 10%。该文件还包含两个新函数 mat_to_vector()vector_to_mat()


import numpy

import random

# Converting each solution from matrix to vector.

def mat_to_vector(mat_pop_weights):

    pop_weights_vector = []

    for sol_idx in range(mat_pop_weights.shape[0]):

        curr_vector = []

        for layer_idx in range(mat_pop_weights.shape[1]):

            vector_weights = numpy.reshape(mat_pop_weights[sol_idx, layer_idx], newshape=(mat_pop_weights[sol_idx, layer_idx].size))

            curr_vector.extend(vector_weights)

        pop_weights_vector.append(curr_vector)

    return numpy.array(pop_weights_vector)

# Converting each solution from vector to matrix.

def vector_to_mat(vector_pop_weights, mat_pop_weights):

    mat_weights = []

    for sol_idx in range(mat_pop_weights.shape[0]):

        start = 0

        end = 0

        for layer_idx in range(mat_pop_weights.shape[1]):

            end = end + mat_pop_weights[sol_idx, layer_idx].size

            curr_vector = vector_pop_weights[sol_idx, start:end]

            mat_layer_weights = numpy.reshape(curr_vector, newshape=(mat_pop_weights[sol_idx, layer_idx].shape))

            mat_weights.append(mat_layer_weights)

            start = end

    return numpy.reshape(mat_weights, newshape=mat_pop_weights.shape)

def select_mating_pool(pop, fitness, num_parents):

    # Selecting the best individuals in the current generation as parents for producing the offspring of the next generation.

    parents = numpy.empty((num_parents, pop.shape[1]))

    for parent_num in range(num_parents):

        max_fitness_idx = numpy.where(fitness == numpy.max(fitness))

        max_fitness_idx = max_fitness_idx[0][0]

        parents[parent_num, :] = pop[max_fitness_idx, :]

        fitness[max_fitness_idx] = -99999999999

    return parents

def crossover(parents, offspring_size):

    offspring = numpy.empty(offspring_size)

    # The point at which crossover takes place between two parents. Usually, it is at the center.

    crossover_point = numpy.uint8(offspring_size[1]/2)

    for k in range(offspring_size[0]):

        # Index of the first parent to mate.

        parent1_idx = k%parents.shape[0]

        # Index of the second parent to mate.

        parent2_idx = (k+1)%parents.shape[0]

        # The new offspring will have its first half of its genes taken from the first parent.

        offspring[k, 0:crossover_point] = parents[parent1_idx, 0:crossover_point]

        # The new offspring will have its second half of its genes taken from the second parent.

        offspring[k, crossover_point:] = parents[parent2_idx, crossover_point:]

    return offspring

def mutation(offspring_crossover, mutation_percent):

    num_mutations = numpy.uint8((mutation_percent*offspring_crossover.shape[1])/100)

    mutation_indices = numpy.array(random.sample(range(0, offspring_crossover.shape[1]), num_mutations))

    # Mutation changes a single gene in each offspring randomly.

    for idx in range(offspring_crossover.shape[0]):

        # The random value to be added to the gene.

        random_value = numpy.random.uniform(-1.0, 1.0, 1)

        offspring_crossover[idx, mutation_indices] = offspring_crossover[idx, mutation_indices] + random_value

    return offspring_crossover

ANN.py 实现

最终,ANN.py 根据以下代码实现。它包含激活函数(sigmoid 和 ReLU)的实现,以及fitness()predict_outputs() 函数以计算准确性。


import numpy

def sigmoid(inpt):

    return 1.0 / (1.0 + numpy.exp(-1 * inpt))

def relu(inpt):

    result = inpt

    result[inpt < 0] = 0

    return result

def predict_outputs(weights_mat, data_inputs, data_outputs, activation="relu"):

    predictions = numpy.zeros(shape=(data_inputs.shape[0]))

    for sample_idx in range(data_inputs.shape[0]):

        r1 = data_inputs[sample_idx, :]

        for curr_weights in weights_mat:

            r1 = numpy.matmul(a=r1, b=curr_weights)

            if activation == "relu":

                r1 = relu(r1)

            elif activation == "sigmoid":

                r1 = sigmoid(r1)

        predicted_label = numpy.where(r1 == numpy.max(r1))[0][0]

        predictions[sample_idx] = predicted_label

    correct_predictions = numpy.where(predictions == data_outputs)[0].size

    accuracy = (correct_predictions / data_outputs.size) * 100

    return accuracy, predictions

def fitness(weights_mat, data_inputs, data_outputs, activation="relu"):

    accuracy = numpy.empty(shape=(weights_mat.shape[0]))

    for sol_idx in range(weights_mat.shape[0]):

        curr_sol_mat = weights_mat[sol_idx, :]

        accuracy[sol_idx], _ = predict_outputs(curr_sol_mat, data_inputs, data_outputs, activation=activation)

    return accuracy

联系作者

原文。经许可转载。

个人简介: Ahmed Gad 于 2015 年 7 月获得埃及梅努非亚大学计算机与信息学院(FCI)信息技术优秀荣誉学士学位。因在学院中排名第一,他于 2015 年被推荐到埃及某学院担任助教,并于 2016 年在其学院担任助教及研究员。他目前的研究兴趣包括深度学习、机器学习、人工智能、数字信号处理和计算机视觉。

相关:

  • 使用 NumPy 和图像分类的人工神经网络实现

  • Python 中的遗传算法实现

  • 学习率在人工神经网络中是否有用?

更多相关内容

arXiv 论文聚焦:为何深度学习和廉价学习效果如此显著?

原文:www.kdnuggets.com/2016/12/arxiv-spotlight-deep-cheap-learning.html

深度学习为何如此有效?而… 廉价学习呢?

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

Henry W. Lin(哈佛大学)和 Max Tegmark(麻省理工学院) 的一篇名为“深度学习和廉价学习为何如此有效?”的最新论文从不同的角度探讨了深度学习为何如此有效。它还介绍了(至少对我来说)“廉价学习”这一术语。

首先,为了明确,“廉价学习”并不是指使用低端 GPU;接下来解释它与参数减少的关系:

尽管著名的数学定理保证了神经网络可以很好地逼近任意函数,但实际兴趣的函数类可以通过“廉价学习”用比通用函数少得多的参数来逼近,因为它们具有追溯到物理定律的简化特性。

本文的核心思想是,神经网络的成功不仅归功于数学,也同样归功于物理(可能更多),并且由于对称性、局部性、组合性和多项式对数概率等概念的简化物理函数,可以与深度学习与其试图建模的现实之间的关系类似地看待。你可能已经听说过这个在九月份的新闻;这是该新闻的基础论文。

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

更多来自摘要:

我们进一步论证了,当生成数据的统计过程具有物理学和机器学习中普遍存在的某种层次结构形式时,深度神经网络比浅层网络更高效。我们通过信息理论来形式化这些主张,并讨论与重整化群程序的关系。我们证明了各种“无平坦定理”,表明在没有效率损失的情况下,这些高效深度网络无法被浅层网络准确逼近:平坦化即使是线性函数也可能代价高昂,而平坦化多项式的代价则是指数级的;我们使用群论技术表明,在一个隐藏层中,n 个变量的乘积不能使用少于 2^n 个神经元。

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

通过一些数学和几个定理,论文如下:展示了“浅层”神经网络的结果,具有少量层;展示了增加网络深度如何在不增加表现力的情况下提供多项式或指数级的效率提升;总结了结论并讨论了关于重整化和深度学习的技术问题。

论文结论中的一个有趣摘录:

虽然以前的普遍性定理保证存在一个神经网络,它可以在误差 ε 范围内逼近任何光滑函数,但它们不能保证神经网络的规模不会随着 ε 的减小而增长到无穷大,或者激活函数 σ 不会变得病态。我们通过构造性证明,给定一个多变量多项式和任何通用非线性,具有固定规模和通用光滑激活函数的神经网络确实可以高效地逼近该多项式。

摘要可以在 这里 找到,而这是一份 直接链接 到论文的链接。

相关

  • arXiv 论文聚焦:通过预测 API 偷窃机器学习模型

  • arXiv 论文聚焦:利用面部图像进行自动化犯罪推断

  • 再看 5 篇 arXiv 深度学习论文的解释


我们的三大课程推荐

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 1. 谷歌网络安全证书 - 快速进入网络安全职业的快车道。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 2. 谷歌数据分析专业证书 - 提升你的数据分析能力

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT


更多相关内容

作为数据科学家提问的艺术

原文:www.kdnuggets.com/2019/02/asking-great-questions-data-scientist.html

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

Kristen KehrerDataMovesMe

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


我们的前三个课程推荐

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 1. 谷歌网络安全证书 - 快速进入网络安全职业。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 2. 谷歌数据分析专业证书 - 提升你的数据分析技能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 3. 谷歌 IT 支持专业证书 - 支持组织的信息技术


提问有时可能看起来很吓人。没有人想显得“傻”。但我向你保证:

  1. 你并不傻。

  2. 如果你不提问,情况会更加可怕。

数据科学是与业务的持续协作,以及一系列问题和答案,使你能够交付业务所想的分析/模型/数据产品。

问题是完全理解业务需求的必需品,不会对他人的想法做出假设。

提问正确的问题,如你在此识别的问题,是将数据科学家与仅了解“什么”(工具和技术)的人区分开的关键。

-Kayode Ayankoya

我们将回答以下问题:

  1. 我们在哪里提问?

  2. 什么是好问题?

我最近在 LinkedIn 上发布了关于在数据科学中提问的内容,并收到了大量发人深省的评论。我将在本文中添加我最喜欢的一些评论/引用。

我们在哪里提问?

基本上管道的每一部分都可以用一个问题来表达:

而这些问题可能涉及大量后续问题。

为了触及冰山一角,Kate Strachnyi 发布了一系列我们在制定分析范围时通常会问(或希望考虑)的好问题:

一些需要问自己的问题:

结果将如何使用?(做出业务决策、投资产品类别、与供应商合作、识别风险等)

观众可能会对我们的分析提出什么问题?(对关键细分的过滤能力、查看数据随时间的变化以识别趋势、深入细节等)

如何优先考虑这些问题以获得最大的价值?

谁应该能够访问这些信息?考虑保密性/安全性问题

我是否拥有访问分析所需数据的权限或凭证?

数据来源有哪些,我需要哪些变量,每个数据源需要多少数据?

我是否需要所有的数据进行更详细的分析,还是只需要一个子集来确保更快的性能?

  • 凯特·斯特拉赫尼

凯特的问题涵盖了以下内容:

  • 你可能会问相关人员/不同部门的问题

  • 你可能会在数据科学/分析团队内部提出的问题。

上述任何问题都可能产生多种答案,因此你必须不断提问。即使你脑海中有一个很棒的解决问题的想法,也不意味着其他人没有同样出色的想法需要被听到和讨论。归根结底,数据科学通常作为业务其他领域的支持功能,这意味着我们不能单打独斗。

除了获得项目相关人员的澄清和提问外,你还需要与数据科学团队的成员合作并提出问题。

即使是经验丰富的数据科学家,也会发现自己在创建不在其专业领域或是算法独特应用的解决方案时需要其他数据领域专家的意见。通常,听取你提出的方法论的人会直接表示赞同,但当你盯着电脑看了几个小时时,也有可能没有考虑到模型的某些基本假设或引入了偏差。拥有新鲜眼光的人可以提供新的视角,避免你在展示结果后才发现错误。

保持你的方法论秘密直到交付结果并不会对你有任何好处。相反,提前分享你的想法并寻求反馈将有助于确保成功的结果。

什么是好的问题?

好的问题就是那些被提出的问题。然而,提出好问题有艺术性和科学性,也需要学习过程。尤其是当你刚开始一份新工作时,要问一切问题。即使是你认为自己应该已经知道的事情,也比不问和纠正更好。你可能会在分析上浪费几个小时,然后被老板告知你误解了请求。

以需要多于“是/否”回答的方式提出问题是有帮助的,这样你可以展开对话并获得更多的背景信息和数据。

我们如何 formulates 问题也非常重要。我常常发现人们对我的问题感到被评判。我必须安抚他们,我的目的只是了解他们的工作方式和需求,而不是评判或批评他们。

  • 卡尔洛·希门尼斯

我自己也经历了 Karlo 提到的情况。直接的方式有时可能会被解读为判断。我们确实需要尽力发挥我们的“商业头脑”,以便表现得像一个真正试图理解并满足他们需求的人。我发现,如果我将问题表述为“寻求他们宝贵的反馈”,这对所有参与者都是双赢的。

随着你与团队和利益相关者建立关系,这种情况发生的可能性会大大降低。一旦大家意识到你的性格并建立了融洽的关系,人们将会期待你的提问方式。

后续问题,各种形式下,都是至关重要的。探究给你提供了一个机会来改述提问并在继续之前达成共识。

-Toby Baker

后续问题感觉很好。当一个问题引发另一个问题时,你会觉得自己真的在取得进展。可以说是在剥离洋葱的另一层。你在协作,你在倾听,你在专注。

总结

这里的主要结论是,你需要提出大量的问题才能有效地生产出业务所需的东西。一旦你开始提问,它将变成一种第二天性,你会立即看到其价值,并随着经验的增长,发现自己提出更多问题。

提问对我的职业生涯至关重要。另一个好处是,我多年来找到了自己的‘声音’。我在会议中感觉到被倾听,自己的意见也受到重视。这种成长很大程度上来自于逐渐习惯提问,我也通过提问学到了很多关于某个行业/业务的知识。

我学到了很多关于观点多样性方面的知识,以及人们以不同的方式表达信息。这属于我们在学校里不常被教到的数据科学中的“商业头脑”部分。但我希望你能大胆地提出大量问题。

简介Kristen KehrerDataMovesMe 的创始人,拥有以下专业领域:时间序列分析、预测、聚类分析、细分、回归分析、神经网络模型、决策树、文本分析、全因子 MVT、生存分析。

资源:

相关内容:

更多相关话题

XGBoost 的假设是什么?

原文:www.kdnuggets.com/2022/08/assumptions-xgboost.html

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

Faye Cornish 通过 Unsplash

在我们深入探讨 XGBoost 的假设之前,我将对该算法进行概述。


我们的前三大课程推荐

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 1. Google 网络安全证书 - 快速进入网络安全职业生涯。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 2. Google 数据分析专业证书 - 提升你的数据分析技能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 3. Google IT 支持专业证书 - 支持你所在的组织进行 IT 工作


XGBoost 代表极端梯度提升,是一种监督学习算法,属于梯度提升决策树(GBDT)家族的机器学习算法。

让我们首先深入了解提升方法。

从提升到 XGBoost

提升方法是将一组弱学习器结合成一个强学习器,以减少训练误差的水平。提升方法有助于处理偏差-方差权衡,使其更有效。有不同类型的提升算法,如 AdaBoost(自适应提升)、梯度提升、XGBoost 等。

现在让我们深入了解 XGBoost

如前所述,XGBoost 是对梯度提升决策树(GBM)的扩展,以其速度和性能而闻名。

预测是基于结合一组更简单、更弱的模型进行的——这些模型是以序列形式创建的决策树。这些模型通过 if-then-else 的真假特征问题评估其他决策树,以此来评估和估计产生正确决策的概率。

它包含以下三个要素:

  1. 一个需要优化的损失函数。

  2. 一个弱学习器用来进行预测。

  3. 一种加性模型,用于增加到弱学习器中以减少错误

XGBoost 的特点

XGBoost 有三个特点:

1. 梯度树提升

树集合模型需要以加性方式进行训练。这意味着这是一个迭代和顺序的过程,其中决策树一步步地增加。添加的树数量是固定的,并且每次迭代时,损失函数值应该减少。

2. 正则化学习

正则化学习有助于最小化损失函数,并防止过拟合或欠拟合的发生——帮助平滑最终学习到的权重。

3. 收缩和特征子采样

这两种技术用于进一步防止过拟合。

收缩减少了每棵树对整体模型的影响程度,并为未来的树提供了改进的空间。

特征子采样是你可能在随机森林算法中见过的。特征位于数据的列部分,它不仅能防止过拟合,还能加快并行算法的计算速度。

XGBoost 超参数

import xgboost as xgb

XGBoost 超参数分为 4 个组:

  1. 一般参数

  2. 增强器参数

  3. 学习任务参数

  4. 命令行参数

一般参数、增强器参数和任务参数在运行 XGBoost 模型之前设置。命令行参数仅在 XGBoost 的控制台版本中使用。

如果参数未正确调整,可能会导致过拟合。然而,调优 XGBoost 模型的参数是困难的。

敬请期待关于调优 XGBoost 超参数的即将发布的文章。

XGBoost 的假设是什么?

XGBoost 的主要假设是:

  • XGBoost 可能假设每个输入变量的编码整数值具有顺序关系

  • XGBoost 假设你的数据可能不完整(即它可以处理缺失值)

由于算法不假设所有值都存在,它可以默认处理缺失值。在处理基于树的算法时,缺失值在训练阶段会被学习。这导致:

  • XGBoost 能够处理稀疏性

XGBoost 仅管理数值向量,因此如果你有分类变量,它们需要转换为数值变量。

你将不得不将一个密集的数据框(矩阵中几乎没有零)转换为一个稀疏矩阵(矩阵中有大量零)。这意味着 XGBoost 能够将变量转换为稀疏矩阵格式作为输入。

结论

在这个博客中,你已经了解了:提升方法与 XGBoost 的关系;XGBoost 的特点;它如何减少损失函数值和过拟合。我们简要介绍了 4 个超参数,接下来将发布一篇专注于调优 XGBoost 超参数的文章。

Nisha Arya 是一位数据科学家和自由技术作家。她特别关注提供数据科学职业建议或教程以及数据科学的理论知识。她还希望探索人工智能在延长人类生命方面的不同方式。作为一名热心学习者,她希望扩大她的技术知识和写作技能,同时帮助指导他人。

更多相关内容

使用深度神经网络构建音频分类器

原文:www.kdnuggets.com/2017/12/audio-classifier-deep-neural-networks.html

评论

作者 Narayan Srinivasan

理解声音是我们大脑执行的基本任务之一。这可以大致分为语音和非语音声音。我们已有了噪声鲁棒的语音识别系统,但仍然没有通用的声学场景分类器,能使计算机像人类一样听取和解释日常声音并据此采取行动,比如在听到喇叭声或听到狗在身后吠叫时移开。

我们的模型复杂度取决于我们的数据,因此,获得标注的数据在机器学习中非常重要。机器学习系统的复杂性来源于数据本身,而不是算法。近年来,我们看到深度学习系统在图像识别和标注领域取得了突破性进展,像 ResNetGoogleNet 等架构在 ImageNet 竞赛中打破了基准,在 1000 个图像类别中的分类准确率超过了 95%(前 5 名准确率)。这得益于大量的标注数据集和带有 GPU 加速的更快计算机,这使得训练深度模型变得更加容易。

我们面临的构建噪声鲁棒声学分类器的问题是缺乏大规模的数据集,但谷歌最近推出了 AudioSet —— 这是一个来自 YouTube 视频的大量标注音频集合(10 秒片段)。之前,我们有 ESC-50 数据集,包含 2000 个录音,每个类别 40 个,涵盖了许多日常声音。

步骤 1. 提取特征

尽管深度学习消除了对手工设计特征的需求,但我们仍然需要为数据选择一个表示模型。我们没有直接使用音频文件作为振幅与时间信号,而是使用具有 128 个组件(频带)的对数尺度 mel 频谱图,覆盖听觉频率范围(0-22050 Hz),使用 23 毫秒(44.1 kHz 下的 1024 个样本)的窗口大小和相同持续时间的跳跃大小。这种转换考虑到人耳以对数尺度听取声音,且人耳蜗对频率相近的声音区分度不高。随着频率的增加,这种效应变得更强。因此,我们仅考虑不同频带的功率。这个示例代码提供了将音频文件转换为频谱图图像的见解。我们使用了 glob 和 librosa 库 - 这段代码是转换为频谱图的标准代码,你可以根据需要进行修改。

在接下来的代码中,

parent_dir = 主目录的名称字符串。

sub_dirs = 要探索的父目录内的目录列表

因此,所有位于 area parent_dir/sub_dirs/*.wav 的 *.wav 文件被提取,遍历所有子目录。

对于感兴趣的人,有一篇关于 mel 尺度和 mfcc 系数的有趣文章。 Ref

现在,音频文件被表示为一个 128(帧)x 128(频带)的频谱图图像。

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

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

音频分类问题现在被转化为图像分类问题。我们需要检测图像中是否存在特定实体(‘狗’、‘猫’、‘车’等)。

步骤 2:选择架构

我们使用卷积神经网络(CNN)来分类频谱图图像。这是因为 CNN 在检测图像中不同部分的局部特征模式(例如边缘)方面表现更好,并且在捕捉逐层变得越来越复杂的层次特征方面也很擅长,如图中所示。

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

另一种思考方式是使用递归神经网络(RNN)来捕捉声音数据中的序列信息,通过一次传递一帧,但由于在大多数情况下 CNN 的表现优于独立的 RNN - 我们在这个实验中没有使用 RNN。在许多情况下,RNN 与 CNN 一起使用以提高网络性能,我们将在未来实验这些架构。[Ref]

步骤 3:迁移学习

由于卷积神经网络(CNN)逐层学习特征,我们可以观察到最初的几层学习到基本特征,如各种边缘,这些边缘在许多不同类型的图像中是共同的。迁移学习是指在一个包含大量相似数据的数据集上训练模型,然后修改网络以便在目标任务上表现良好,而在目标任务中我们没有很多数据。这也叫做 微调 - 这个博客 对迁移学习进行了很好的解释。

步骤 4. 数据增强

在处理小数据集时,学习数据的复杂表示非常容易过拟合,因为模型只是记忆数据集而无法泛化。击败这一问题的一种方法是将音频文件增强成许多具有轻微变化的文件。

我们在这里使用的技术是时间拉伸和音调移动 - Rubberband 是一个易于使用的库,用于此目的。

rubberband -t 1.5 -p 2 input.wav output.wav

这条单行终端命令给我们一个新的音频文件,长度比原始文件长 50%,且音调上升了一个八度。

为了可视化这意味着什么,请查看我从互联网获取的这张猫的图片。

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

如果我们只有右侧的图像,我们可以使用数据增强来制作该图像的镜像,结果仍然是一只猫(额外的训练数据!)。对于计算机来说,这两者是完全不同的像素分布,有助于它学习更通用的概念(如果 A 是狗,那么 A 的镜像也是狗)。

同样地,我们应用时间拉伸(无论是减慢声音还是加快声音),以及

音调移动(使其更尖锐或更柔和)以获得更通用的训练数据(由于训练集较小,这在此情况下也提高了 8-9% 的验证准确性)。

我们观察到每个声音类别的模型性能受到每组增强方式的不同影响,这表明通过应用类别条件数据增强可以进一步提高模型性能。

过拟合是深度学习领域的一个主要问题,我们可以使用数据增强作为应对这一问题的一种方法,其他隐式泛化的方法包括使用 dropout 层和 L1、L2 正则化。[Ref]

因此,在这篇文章中,我们提出了一种深度卷积神经网络架构,它帮助我们对音频进行分类,并且如何有效地使用迁移学习和数据增强来提高模型在小数据集情况下的准确性。

个人简介: Narayan Srinivasan 对构建自动驾驶车辆感兴趣。他是印度理工学院马德拉斯分校的毕业生。

相关内容


我们的前三大课程推荐

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 1. 谷歌网络安全证书 - 快速开启网络安全职业生涯。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 2. 谷歌数据分析专业证书 - 提升你的数据分析技能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 3. 谷歌 IT 支持专业证书 - 支持你所在组织的 IT 工作


相关主题

使用 Python 进行深度学习的音频数据分析(第一部分)

原文:www.kdnuggets.com/2020/02/audio-data-analysis-deep-learning-python-part-1.html

评论

介绍

尽管大多数文献和关于深度学习的讨论集中在计算机视觉和自然语言处理(NLP)上,但音频分析——包括自动语音识别(ASR)、数字信号处理以及音乐分类、标记和生成——是深度学习应用的一个不断增长的子领域。一些最受欢迎和广泛应用的机器学习系统,如虚拟助手 Alexa、Siri 和 Google Home,大多是建立在能够从音频信号中提取信息的模型之上的产品。

音频数据分析是对数字设备捕获的音频信号进行分析和理解的过程,广泛应用于企业、医疗、生产力和智能城市等领域。应用包括从客户支持电话中分析客户满意度、媒体内容分析和检索、医学诊断辅助和患者监测、听力障碍者的辅助技术,以及公共安全的音频分析。


我们的三大课程推荐

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 1. 谷歌网络安全证书 - 快速进入网络安全职业的捷径。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 2. 谷歌数据分析专业证书 - 提升你的数据分析技能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT


在本系列文章的第一部分,我们将讨论在开始音频数据分析之前你需要了解的所有内容,并从音频文件中提取必要的特征。我们还将建立一个用于音乐流派分类的人工神经网络(ANN)。在第二部分,我们将通过创建卷积神经网络完成相同的任务,并比较它们的准确性。

目录

  • 音频文件概述

  • 音频处理的应用

  • 使用 Python 进行音频处理

  • 声谱图

  • 从音频信号中提取特征

  • 使用人工神经网络(ANN)进行流派分类。

音频文件概述

音频片段是 .wav 格式的数字音频文件。声音波通过在离散时间间隔(称为采样率,CD 质量音频通常为 44.1kHz,意味着每秒采样 44,100 次)进行采样来数字化。

每个样本是特定时间间隔内波的幅度,位深度决定了样本的详细程度,也称为信号的动态范围(通常为 16bit,这意味着一个样本的幅度值范围从 65,536 到)。

什么是采样和采样频率?

在信号处理中,采样是将连续信号减少为一系列离散值。采样频率或速率是指在某一固定时间段内采样的数量。高采样频率会减少信息损失但计算开销较高,而低采样频率则信息损失较大但计算速度快且便宜。

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

一种声音波形,以红色表示,数字化后以蓝色表示(经过采样和 4 位量化),结果数组显示在右侧。原始 © Aquegg | 维基媒体公用资源

音频处理的应用

音频处理的潜在应用有哪些?这里列出了一些:

  • 根据音频特征索引音乐收藏。

  • 推荐音乐用于广播频道

  • 音频文件的相似性搜索(即 Shazam)

  • 语音处理和合成 — 为对话代理生成人工声音

使用 Python 处理音频数据

声音以音频信号的形式表示,具有如频率、带宽、分贝等参数。典型的音频信号可以表示为振幅和时间的函数。

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

来源

已经有设备可以帮助你捕捉这些声音,并将其表示为计算机可读的格式。这些格式的示例包括:

  • wav (Waveform Audio File) 格式

  • mp3 (MPEG-1 Audio Layer 3) 格式

  • WMA (Windows Media Audio) 格式

一般的音频处理过程包括提取与当前任务相关的声学特征,然后进行决策方案的处理,包括检测、分类和知识融合。幸运的是,我们有一些有用的 Python 库,使这个任务更容易。

Python 音频库:

Python 有一些很棒的音频处理库,如 Librosa 和 PyAudio。还有一些用于基本音频功能的内置模块。

我们将主要使用两个库进行音频采集和播放:

1. Librosa

这是一个用于分析音频信号的 Python 模块,主要面向音乐。它包括构建 MIR(音乐信息检索)系统的核心部分,并且有很好的文档和许多示例与教程。

安装:

pip install librosa
or
conda install -c conda-forge librosa

为了提升更多的音频解码能力,你可以安装 ffmpeg,它包含了许多音频解码器。

2. IPython.display.Audio

[**IPython.display.Audio**](https://ipython.org/ipython-doc/stable/api/generated/IPython.display.html#IPython.display.Audio) 让你可以在 jupyter notebook 中直接播放音频。

我在下面的页面上上传了一个随机音频文件。现在让我们在你的 jupyter 控制台中加载这个文件。

Vocaroo | 在线录音机

Vocaroo 是一种快速便捷的方式来在互联网分享语音消息。

加载音频文件:

import librosa
audio_data = '/../../gruesome.wav'
x , sr = librosa.load(audio_data)
print(type(x), type(sr))#<class 'numpy.ndarray'> <class 'int'>print(x.shape, sr)#(94316,) 22050

这将返回一个音频时间序列,作为默认采样率(sr)为 22KHZ 的 numpy 数组。我们可以通过以 44.1KHz 重采样来更改此行为。

librosa.load(audio_data, sr=44100)

或禁用重采样。

librosa.load(audio_path, sr=None)

采样是每秒传输的音频样本数,以 Hz 或 kHz 为单位。

播放音频:

使用**IPython.display.Audio**,你可以在你的 jupyter notebook 中播放音频。

import IPython.display as ipd
ipd.Audio(audio_data)

这将返回一个音频小部件:

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

可视化音频:

我们可以使用[**librosa.display.waveplot**](https://librosa.github.io/librosa/generated/librosa.display.waveplot.html#librosa.display.waveplot)绘制音频数组:

%matplotlib inline
import matplotlib.pyplot as plt
import librosa.display
plt.figure(figsize=(14, 5))
librosa.display.waveplot(x, sr=sr)

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

这里,我们有一个波形的幅度包络图。

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

什么是信号中的幅度、波长和相位?

声谱图

声谱图是一种可视化表示信号强度或“响度”的方式,显示了在特定波形中各种频率随时间的变化情况。人们不仅可以看到,例如,2 Hz 与 10 Hz 之间的能量多寡,还可以看到能量水平随时间的变化。

声谱图通常被描绘为一个热图,即通过变化的颜色或亮度显示强度的图像。

我们可以使用[**librosa.display.specshow**](https://librosa.github.io/librosa/generated/librosa.display.specshow.html)**显示声谱图。

X = librosa.stft(x)
Xdb = librosa.amplitude_to_db(abs(X))
plt.figure(figsize=(14, 5))
librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='hz')
plt.colorbar()

.stft()将数据转换为短时傅里叶变换。 STFT将信号转换,使我们能够知道在给定时间的给定频率的幅度。使用 STFT,我们可以确定音频信号在给定时间播放的各种频率的幅度。.specshow用于显示声谱图。

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

垂直轴显示频率(从 0 到 10kHz),水平轴显示剪辑的时间。由于我们看到所有的动作都发生在频谱的底部,我们可以将频率轴转换为对数轴。

librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='log')
plt.colorbar()

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

创建音频信号:

import numpy as np
sr = 22050 # sample rate
T = 5.0    # seconds
t = np.linspace(0, T, int(T*sr), endpoint=False) # time variable
x = 0.5*np.sin(2*np.pi*220*t)# pure sine wave at 220 Hz
#Playing the audio
ipd.Audio(x, rate=sr) # load a NumPy array
#Saving the audio
librosa.output.write_wav('tone_220.wav', x, sr)

从音频信号中提取特征

每个音频信号由许多特征组成。然而,我们必须提取与我们试图解决的问题相关的特征。提取特征以用于分析的过程称为特征提取。让我们详细研究一些特征。

频谱特征(基于频率的特征),通过将时间信号转换到频域获得,例如基本频率、频率成分、频谱质心、频谱流量、频谱密度、频谱roll-off 等。

1. 频谱质心

频谱质心指示频谱能量的中心频率,换句话说,它表示声音的“质心”位置。这类似于加权平均:

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

其中 S(k)是频率 bin k 处的频谱幅度,f(k)是 bin k 处的频率。

[**librosa.feature.spectral_centroid**](https://librosa.github.io/librosa/generated/librosa.feature.spectral_centroid.html#librosa.feature.spectral_centroid)计算信号中每一帧的频谱质心:

import sklearn
spectral_centroids = librosa.feature.spectral_centroid(x, sr=sr)[0]
spectral_centroids.shape
(775,)
# Computing the time variable for visualization
plt.figure(figsize=(12, 4))frames = range(len(spectral_centroids))
t = librosa.frames_to_time(frames)
# Normalising the spectral centroid for visualisation
def normalize(x, axis=0):
    return sklearn.preprocessing.minmax_scale(x, axis=axis)
#Plotting the Spectral Centroid along the waveform
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_centroids), color='b')

.spectral_centroid将返回一个数组,其列数等于样本中存在的帧数。

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

频谱质心在开始时有上升。

2. 频谱 roll-off

这是信号形状的度量。它表示高频率衰减至 0 的频率。为了获得它,我们必须计算在功率谱中 85%功率位于低频的频带的比例。

[**librosa.feature.spectral_rolloff**](https://librosa.github.io/librosa/generated/librosa.feature.spectral_rolloff.html#librosa.feature.spectral_rolloff)计算信号中每一帧的 roll-off 频率:

spectral_rolloff = librosa.feature.spectral_rolloff(x+0.01, sr=sr)[0]
plt.figure(figsize=(12, 4))librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_rolloff), color='r')

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

3. 频谱带宽

频谱带宽定义为光带在峰值最大值一半处的宽度(或半峰宽[全宽半最大值 FWHM]),由两条垂直红线和波长轴上的λSB 表示。

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

[**librosa.feature.spectral_bandwidth**](https://librosa.github.io/librosa/generated/librosa.feature.spectral_bandwidth.html#librosa.feature.spectral_bandwidth)计算顺序-p 频谱带宽:

spectral_bandwidth_2 = librosa.feature.spectral_bandwidth(x+0.01, sr=sr)[0]
spectral_bandwidth_3 = librosa.feature.spectral_bandwidth(x+0.01, sr=sr, p=3)[0]
spectral_bandwidth_4 = librosa.feature.spectral_bandwidth(x+0.01, sr=sr, p=4)[0]
plt.figure(figsize=(15, 9))librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_bandwidth_2), color='r')
plt.plot(t, normalize(spectral_bandwidth_3), color='g')
plt.plot(t, normalize(spectral_bandwidth_4), color='y')
plt.legend(('p = 2', 'p = 3', 'p = 4'))

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

4. 过零率

测量信号平滑性的一种非常简单的方法是计算信号片段内的过零次数。声音信号缓慢振荡——例如,100 Hz 的信号每秒将经过零 100 次——而一个无声擦音每秒可以有 3000 次过零。

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

对于金属和摇滚等高打击音,通常值较高。现在让我们可视化一下,看看如何计算过零率。

x, sr = librosa.load('/../../gruesome.wav')
#Plot the signal:
plt.figure(figsize=(14, 5))
librosa.display.waveplot(x, sr=sr)
# Zooming in
n0 = 9000
n1 = 9100
plt.figure(figsize=(14, 5))
plt.plot(x[n0:n1])
plt.grid()

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

放大

n0 = 9000
n1 = 9100
plt.figure(figsize=(14, 5))
plt.plot(x[n0:n1])
plt.grid()

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

似乎有 16 个过零点。我们来用 Librosa 验证一下。

zero_crossings = librosa.zero_crossings(x[n0:n1], pad=False)
print(sum(zero_crossings))#16

5. Mel 频率倒谱系数(MFCCs)

信号的梅尔频率倒谱系数(MFCCs)是一组小特征(通常约 10-20 个),它们简洁地描述了频谱包络的整体形状。它模拟了人类声音的特征。

mfccs = librosa.feature.mfcc(x, sr=fs)
print(mfccs.shape)
(20, 97)
#Displaying  the MFCCs:
plt.figure(figsize=(15, 7))
librosa.display.specshow(mfccs, sr=sr, x_axis='time')

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

6. 色度特征

色度特征或向量通常是一个 12 维的特征向量,表示信号中每个音高类别{C, C#, D, D#, E, …, B}的能量含量。简而言之,它提供了一种强有力的方式来描述音乐片段之间的相似度。

[librosa.feature.chroma_stft](https://librosa.github.io/librosa/generated/librosa.feature.chroma_stft.html#librosa.feature.chroma_stft)用于计算色度特征。

chromagram = librosa.feature.chroma_stft(x, sr=sr, hop_length=hop_length)
plt.figure(figsize=(15, 5))
librosa.display.specshow(chromagram, x_axis='time', y_axis='chroma', hop_length=hop_length, cmap='coolwarm')

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

现在我们了解了如何使用 Python 处理音频数据并提取重要特征。在接下来的部分中,我们将使用这些特征构建一个 ANN 模型用于音乐流派分类。

使用 ANN 进行音乐流派分类

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

鸣谢

该数据集用于 G. Tzanetakis 和 P. Cook 在 IEEE Transactions on Audio and Speech Processing 2002 中发表的著名论文《音频信号的音乐流派分类》。

数据集包含 1000 个每个 30 秒长的音频轨道。它包含 10 种流派,每种流派由 100 个轨道组成。这些轨道都是 22050 Hz 单声道 16 位音频文件,格式为.wav。

数据集可以从marsyas 网站下载。

数据集包含 10 种流派,即

  • 蓝调

  • 古典

  • 乡村

  • 迪斯科

  • 嘻哈

  • 爵士

  • 金属

  • 流行

  • 雷鬼

  • 摇滚

每种流派包含 100 首歌曲。总数据集:1000 首歌曲。

在继续之前,我建议使用Google Colab来处理与神经网络相关的所有任务,因为它是免费的,并且提供 GPU 和 TPU 作为运行环境。

路线图:

首先,我们需要将音频文件转换为 PNG 格式图像(频谱图)。从这些频谱图中,我们需要提取有意义的特征,即 MFCCs、频谱质心、零交叉率、色度频率、频谱滚降。

一旦特征提取完成,它们可以被附加到 CSV 文件中,以便 ANN 可以用于分类。

如果我们想处理图像数据而不是 CSV,我们将使用 CNN(第二部分的范围)。

那么我们开始吧。

  1. 提取并加载数据到 Google Drive,然后在 Colab 中挂载驱动器。

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

数据加载后的 Google Colab 目录结构。

  1. 导入所有所需的库。
**import** **librosa**
**import** **pandas** **as** **pd**
**import** **numpy** **as** **np**
**import** **matplotlib.pyplot** **as** **plt**
%matplotlib inline
**import** **os**
**from** **PIL** **import** **Image**
**import** **pathlib**
**import** **csv****from** **sklearn.model_selection** **import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler****import keras
from keras import layers
from keras import layers
import keras
from keras.models import Sequential****import** **warnings**
warnings.filterwarnings('ignore')
  1. 现在将音频数据文件转换为 PNG 格式图像,或者基本上为每个音频提取频谱图。
cmap = plt.get_cmap('inferno')
plt.figure(figsize=(8,8))
genres = 'blues classical country disco hiphop jazz metal pop reggae rock'.split()
for g in genres:
    pathlib.Path(f'img_data/{g}').mkdir(parents=True, exist_ok=True)
    for filename in os.listdir(f'./drive/My Drive/genres/{g}'):
        songname = f'./drive/My Drive/genres/{g}/{filename}'
        y, sr = librosa.load(songname, mono=True, duration=5)
        plt.specgram(y, NFFT=2048, Fs=2, Fc=0, noverlap=128, cmap=cmap, sides='default', mode='default', scale='dB');
        plt.axis('off');
        plt.savefig(f'img_data/{g}/{filename[:-3].replace(".", "")}.png')
        plt.clf()

一首具有蓝调流派的歌曲的频谱图样本。

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

一首蓝调风格的歌曲的谱图

现在,由于所有音频文件已转换为其各自的谱图,提取特征变得更容易。

4. 为我们的 CSV 文件创建一个头部。

header = 'filename chroma_stft rmse spectral_centroid spectral_bandwidth rolloff zero_crossing_rate'
for i in range(1, 21):
    header += f' mfcc{i}'
header += ' label'
header = header.split()

5. 从谱图中提取特征:我们将提取梅尔频率倒谱系数 (MFCC)、谱质心、零交叉率、色度频率和谱滚降。

file = open('dataset.csv', 'w', newline='')
with file:
    writer = csv.writer(file)
    writer.writerow(header)
genres = 'blues classical country disco hiphop jazz metal pop reggae rock'.split()
for g in genres:
    for filename in os.listdir(f'./drive/My Drive/genres/{g}'):
        songname = f'./drive/My Drive/genres/{g}/{filename}'
        y, sr = librosa.load(songname, mono=True, duration=30)
        rmse = librosa.feature.rmse(y=y)
        chroma_stft = librosa.feature.chroma_stft(y=y, sr=sr)
        spec_cent = librosa.feature.spectral_centroid(y=y, sr=sr)
        spec_bw = librosa.feature.spectral_bandwidth(y=y, sr=sr)
        rolloff = librosa.feature.spectral_rolloff(y=y, sr=sr)
        zcr = librosa.feature.zero_crossing_rate(y)
        mfcc = librosa.feature.mfcc(y=y, sr=sr)
        to_append = f'{filename} {np.mean(chroma_stft)} {np.mean(rmse)} {np.mean(spec_cent)} {np.mean(spec_bw)} {np.mean(rolloff)} {np.mean(zcr)}'    
        for e in mfcc:
            to_append += f' {np.mean(e)}'
        to_append += f' {g}'
        file = open('dataset.csv', 'a', newline='')
        with file:
            writer = csv.writer(file)
            writer.writerow(to_append.split())

6. 数据预处理:包括加载 CSV 数据、标签编码、特征缩放和数据拆分为训练集和测试集。

data = pd.read_csv('dataset.csv')
data.head()# Dropping unneccesary columns
data = data.drop(['filename'],axis=1)#Encoding the Labels
genre_list = data.iloc[:, -1]
encoder = LabelEncoder()
y = encoder.fit_transform(genre_list)#Scaling the Feature columns
scaler = StandardScaler()
X = scaler.fit_transform(np.array(data.iloc[:, :-1], dtype = float))#Dividing data into training and Testing set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

7. 构建一个 ANN 模型。

model = Sequential()
model.add(layers.Dense(256, activation='relu', input_shape=(X_train.shape[1],)))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

8. 拟合模型

classifier = model.fit(X_train,
                    y_train,
                    epochs=100,
                    batch_size=128)

经过 100 个周期,准确率:0.67

结论

好了,第一部分到此结束。在本文中,我们对音频数据进行了相当好的分析。我们了解了如何提取重要特征,并实现了人工神经网络 (ANN) 来分类音乐类型。

在第二部分,我们将直接在谱图上使用卷积神经网络进行相同的操作。

我希望你们喜欢阅读。请在评论区分享你的想法或疑问。

使用 Python 深度学习进行音频数据分析(第二部分)

  • 感谢阅读。

简介: 纳盖什·辛格·乔汉 是 CirrusLabs 的大数据开发人员。他在电信、分析、销售、数据科学等多个领域拥有超过 4 年的工作经验,专注于各种大数据组件。

原文。经授权转载。

相关:

  • 音频文件处理:使用 Python 处理 ECG 音频

  • R 中音频文件处理基础

  • 2020 年要读的人工智能书籍

更多相关话题

使用 Python 进行音频数据分析(第二部分)

原文:www.kdnuggets.com/2020/02/audio-data-analysis-deep-learning-python-part-2.html

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

图像 来源

在 上一篇文章中,我们开始讨论音频信号;我们看到如何使用 Librosa Python 库对其进行解释和可视化。我们还学习了如何从声音/音频文件中提取必要的特征。

我们通过构建一个人工神经网络(ANN)来进行音乐类型分类结束了上一篇文章。

在本文中,我们将构建一个卷积神经网络进行音乐类型分类。

现在,深度学习在音乐类型分类中越来越多地被使用:特别是卷积神经网络(CNN),它将谱图作为输入,视为图像,寻找不同类型的结构。

卷积神经网络(CNN)与普通神经网络非常相似:它们由具有可学习权重和偏差的神经元组成。每个神经元接收一些输入,执行点积,并可选地进行非线性处理。整个网络仍然表示一个单一的可微分分数函数:从原始图像像素到类别分数。它们仍然有一个损失函数(例如 SVM/Softmax)在最后一个(全连接)层,并且我们为学习普通神经网络开发的所有技巧/方法仍然适用。

那么有什么变化呢?ConvNet 架构明确假设输入是图像,这使我们可以将某些特性编码到架构中。这些特性使得前向函数的实现更加高效,并大大减少了网络中的参数数量。

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

来源

它们能够检测主要特征,这些特征随后由 CNN 架构的后续层结合,从而检测出更高阶的复杂和相关的新特征。

数据集包含 1000 个音频轨道,每个轨道 30 秒长。它包含 10 种类型,每种类型由 100 个轨道表示。这些轨道都是 22050 Hz 单声道 16 位音频文件,格式为.wav。

数据集可以从 marsyas 网站下载

包含 10 种音乐类型,即

  • Blues

  • Classical

  • Country

  • Disco

  • Hiphop

  • Jazz

  • Metal

  • Pop

  • Reggae

  • Rock

每种类型包含 100 首歌曲。数据集总量:1000 首歌曲。

在继续之前,我建议使用Google Colab来处理与神经网络相关的所有工作,因为它是免费的,并提供 GPU 和 TPU 作为运行环境。

卷积神经网络实现

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

从输入声谱图中提取特征并加载到全连接层的步骤。

所以让我们开始构建一个用于类别分类的 CNN。

首先加载所有必要的库。

import pandas as pd
import numpy as np
from numpy import argmax
import matplotlib.pyplot as plt
%matplotlib inline
import librosa
import librosa.display
import IPython.display
import random
import warnings
import os
from PIL import Image
import pathlib
import csv
# sklearn Preprocessing
from sklearn.model_selection import train_test_split
#Keras
import keras
import warnings
warnings.filterwarnings('ignore')
from keras import layers
from keras.layers import Activation, Dense, Dropout, Conv2D, Flatten, MaxPooling2D, GlobalMaxPooling2D, GlobalAveragePooling1D, AveragePooling2D, Input, Add
from keras.models import Sequential
from keras.optimizers import SGD

现在将音频数据文件转换为 PNG 格式的图像,或者基本上是为每个音频提取声谱图。我们将使用 librosa Python 库为每个音频文件提取声谱图。

 genres = 'blues classical country disco hiphop jazz metal pop reggae rock'.split()
for g in genres:
    pathlib.Path(f'img_data/{g}').mkdir(parents=True, exist_ok=True)
    for filename in os.listdir(f'./drive/My Drive/genres/{g}'):
        songname = f'./drive/My Drive/genres/{g}/{filename}'
        y, sr = librosa.load(songname, mono=True, duration=5)
        print(y.shape)
        plt.specgram(y, NFFT=2048, Fs=2, Fc=0, noverlap=128, cmap=cmap, sides='default', mode='default', scale='dB');
        plt.axis('off');
        plt.savefig(f'img_data/{g}/{filename[:-3].replace(".", "")}.png')
        plt.clf()

上面的代码将创建一个img_data目录,其中包含按类别分类的所有图像。

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

各种类型的示例声谱图:迪斯科、古典、蓝调和乡村音乐。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

迪斯科与古典音乐外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

蓝调与乡村音乐

我们的下一步是将数据拆分为训练集和测试集。

安装 split-folders。

pip install split-folders

我们将数据按 80%用于训练,20%用于测试集进行拆分。

import split-folders
# To only split into training and validation set, set a tuple to `ratio`, i.e, `(.8, .2)`.
split-folders.ratio('./img_data/', output="./data", seed=1337, ratio=(.8, .2)) # default values

上面的代码返回父目录下的 2 个目录,分别用于训练集和测试集。

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

图像增强:

图像增强通过不同的处理方式或多种处理组合来人工创建训练图像,例如随机旋转、平移、剪切和翻转等。

执行图像增强,与其用大量图像训练模型,我们可以用较少的图像训练模型,并通过不同的角度和修改图像来训练模型。

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

图像增强

Keras 有一个ImageDataGenerator类,允许用户以非常简单的方式实时执行图像增强。你可以在 Keras 的官方文档中阅读有关内容。

from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(
        rescale=1./255, # rescale all pixel values from 0-255, so aftre this step all our pixel values are in range (0,1)
        shear_range=0.2, #to apply some random tranfromations
        zoom_range=0.2, #to apply zoom
        horizontal_flip=True) # image will be flipper horiztest_datagen = ImageDataGenerator(rescale=1./255)

ImageDataGenerator 类有三个方法flow()、flow_from_directory() 和 flow_from_dataframe(),用于从大的 numpy 数组和包含图像的文件夹中读取图像。

我们将在这篇博客中仅讨论 flow_from_directory()。

training_set = train_datagen.flow_from_directory(
        './data/train',
        target_size=(64, 64),
        batch_size=32,
        class_mode='categorical',
        shuffle = False)test_set = test_datagen.flow_from_directory(
        './data/val',
        target_size=(64, 64),
        batch_size=32,
        class_mode='categorical',
        shuffle = False )

flow_from_directory()具有以下参数。

  • **directory:**存在一个文件夹的路径,其中包含所有测试图像。例如,在这种情况下,训练图像位于./data/train 中。

  • **batch_size:**将其设置为能整除测试集中图像总数的某个数字。

    为什么这只对 test_generator 适用?

    实际上,你应该在训练和验证生成器中将“batch_size”设置为一个能够整除你的训练集和验证集中图像总数的数字,但这之前并不重要,因为即使 batch_size 与训练或验证集中样本数不匹配,并且每次从生成器中获取图像时有些图像会被遗漏,也会在你训练的下一个 epoch 中进行采样。

    但对于测试集,你应该正好采样一次图像,不多也不少。如果感到困惑,可以将其设置为 1(但可能会稍微慢一点)。

  • **class_mode:**如果你只有两个类别要预测,则设置为“binary”,如果不是,则设置为“categorical”,如果你正在开发自动编码器系统,输入和输出可能是相同的图像,则设置为“input”。

  • **shuffle:**将其设置为False,因为你需要按照“顺序”提供图像,以预测输出并将其与唯一的 ID 或文件名进行匹配。

创建一个卷积神经网络:

model = Sequential()
input_shape=(64, 64, 3)#1st hidden layer
model.add(Conv2D(32, (3, 3), strides=(2, 2), input_shape=input_shape))
model.add(AveragePooling2D((2, 2), strides=(2,2)))
model.add(Activation('relu'))#2nd hidden layer
model.add(Conv2D(64, (3, 3), padding="same"))
model.add(AveragePooling2D((2, 2), strides=(2,2)))
model.add(Activation('relu'))#3rd hidden layer
model.add(Conv2D(64, (3, 3), padding="same"))
model.add(AveragePooling2D((2, 2), strides=(2,2)))
model.add(Activation('relu'))#Flatten
model.add(Flatten())
model.add(Dropout(rate=0.5))#Add fully connected layer.
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(rate=0.5))#Output layer
model.add(Dense(10))
model.add(Activation('softmax'))model.summary()

使用随机梯度下降(SGD)编译/训练网络。梯度下降在我们有一个凸曲线时效果很好。但是如果我们没有凸曲线,梯度下降会失败。因此,在随机梯度下降中,每次迭代时会随机选择几个样本,而不是整个数据集。

epochs = 200
batch_size = 8
learning_rate = 0.01
decay_rate = learning_rate / epochs
momentum = 0.9
sgd = SGD(lr=learning_rate, momentum=momentum, decay=decay_rate, nesterov=False)
model.compile(optimizer="sgd", loss="categorical_crossentropy", metrics=['accuracy'])

现在,用 50 个 epochs 来训练模型。

model.fit_generator(
        training_set,
        steps_per_epoch=100,
        epochs=50,
        validation_data=test_set,
        validation_steps=200)

现在,既然 CNN 模型已经训练好了,我们来评估它。evaluate_generator()使用你的测试输入和输出。它首先使用训练输入进行预测,然后通过将其与测试输出进行比较来评估性能。因此,它给出的是一个性能测量,即在你的案例中是准确率。

#Model Evaluation
model.evaluate_generator(generator=test_set, steps=50)#OUTPUT
[1.704445120342617, 0.33798882681564246]

所以损失为 1.70,准确率为 33.7%。

最后,让你的模型在测试数据集上进行一些预测。在每次调用predict_generator之前,你需要重置 test_set。这一点很重要,如果你忘记重置test_set,你将得到奇怪顺序的输出。

test_set.reset()
pred = model.predict_generator(test_set, steps=50, verbose=1)

到现在为止,predicted_class_indices已经包含了预测标签,但你不能直接知道预测的结果,因为你看到的只是像 0、1、4、1、0、6 这样的数字。你需要将预测标签与它们的唯一 ID(如文件名)进行映射,以找出你为哪个图像做了预测。

predicted_class_indices=np.argmax(pred,axis=1)

labels = (training_set.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]
predictions = predictions[:200]
filenames=test_set.filenames

filenamespredictions作为两个独立的列追加到一个 pandas 数据框中。但在此之前,请检查两者的大小,它们应该是相同的。

print(len(filename, len(predictions)))
# (200, 200)

最后,将结果保存到 CSV 文件中。

results=pd.DataFrame({"Filename":filenames,
                      "Predictions":predictions},orient='index')
results.to_csv("prediction_results.csv",index=False)

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

输出

我已经在 50 个 epochs 上训练了模型(这本身在 Nvidia K80 GPU 上执行花费了 1.5 小时)。如果你想提高准确率,可以将训练 CNN 模型时的 epochs 数增加到 1000 或更多。

结论

这表明 CNN 是自动特征提取的可行替代方案。这一发现支持了我们的假设,即音乐数据的内在特征变化与图像数据类似。我们的 CNN 模型具有高度的可扩展性,但在将训练结果推广到未见过的音乐数据时不够稳健。这可以通过扩大数据集以及增加数据输入量来克服。

好了,这篇关于使用深度学习和 Python 进行音频数据分析的两篇文章系列就此结束。希望大家喜欢阅读这篇文章,欢迎在评论区分享你的意见/想法/反馈。

感谢阅读本文!!!

简介:Nagesh Singh Chauhan 是 CirrusLabs 的大数据开发人员。他在电信、分析、销售、数据科学等多个领域拥有超过 4 年的工作经验,并在多个大数据组件方面具有专业知识。

原文。经许可转载。

相关内容:

  • 音频文件处理:使用 Python 处理 ECG 音频

  • R 中的音频文件处理基础

  • 2020 年阅读的人工智能书籍


我们的前三大课程推荐

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 1. 谷歌网络安全证书 - 快速开启网络安全职业生涯

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 2. 谷歌数据分析专业证书 - 提升你的数据分析技能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT 需求


更多相关话题

音频文件处理:使用 Python 的心电图音频

原文:www.kdnuggets.com/2020/02/audio-file-processing-ecg-audio-python.html

评论

Taposh Dutta Roy,凯瑟 Permanente

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

在我上一篇关于 “R 中的音频文件处理基础” 的文章中,我们讨论了音频处理的基础知识,并查看了一些 R 语言的示例。在这篇文章中,我们将探讨音频文件处理的一个应用——心电图心跳分析,并用 Python 编写代码。

为了更好地理解这一点,我们将探讨:心脏的基本解剖、测量、心音的起源和特征、心音分析技术以及用于分析声音的 Python 代码。本文中的 Python 代码将讨论如何读取、处理数据并开发一个非常简单的模型。在下一篇文章中,我们将进行更多的数据处理并开发更好的模型。

进一步说明,我不是临床医生,因此我的所有知识都是通过阅读论文、博客和文章获得的。我列出了所有的来源和参考文献。我将从心脏在 胸腔 的位置开始,如下所示

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

来源:Google

哺乳动物心脏的基本解剖

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

来源:medmov

哺乳动物心脏的 5 个基本解剖区域:

  1. 四个心脏腔室

  2. 四个心脏瓣膜

  3. 四层心脏组织

  4. 大心脏血管

  5. 自然心脏起搏器和心脏传导系统

人类心脏

人类心脏是一个四腔室的泵,有两个心房用于从静脉收集血液,两个心室用于将血液泵送到动脉。

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

来源: 阿密特·盖伊博士 的研究工作

心脏的右侧将血液泵送到肺循环(肺部),左侧将血液泵送到体循环(身体其余部分)。来自肺循环的血液通过肺静脉返回到左心房,来自体循环的血液通过上/下腔静脉返回到右心房。

两组瓣膜控制血液的流动:房室瓣(僧帽瓣和三尖瓣)在心房和心室之间,半月瓣(主动脉瓣和肺动脉瓣)在心室和动脉之间。

电控

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

心脏的周期性活动由电传导系统控制。电信号源自右心房中的专门起搏细胞(sino-atria node),并通过心房传播到 AV 结(一个延迟连接点)以及心室。电动作电位激发心肌细胞,引起心腔的机械收缩。

机械系统:收缩期与舒张期

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

心室的收缩阶段称为systole。心室收缩后是一个称为diastole的休息或充血阶段。心脏的机械活动包括血液流动、心腔壁的振动以及瓣膜的开合。

收缩期细分为:

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

舒张期细分为

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

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

右侧:心脏肌肉的垂直切面显示了心脏的内部结构。左侧:一个往复泵的示意图,具有泵腔和输入输出端口以及方向相反的阀门。(来源: www.morganclaypool.com/doi/pdf/10.2200/S00187ED1V01Y200904BME031)

调节系统

人体是一个复杂的系统,具有多种协同工作的子系统。其中一些帮助我们调节心脏的系统有——自主神经系统、内分泌系统、呼吸系统。这些系统与电气和机械因素共同作用,使我们的心脏正常运作。

自主神经系统调节心率:交感神经系统增强自动性,而副交感神经系统(迷走神经)则抑制它。神经系统还调节心腔的机械收缩性。

内分泌系统分泌如胰岛素和肾上腺素等激素,这些激素影响心肌的收缩性。

呼吸系统导致胸腔压力的周期性变化,从而影响血流、静脉压力和静脉回流,触发反射反应(压力感受器反射、贝恩布里奇反射),进而调节心率。心率在吸气时增加,呼气时减少。

其他机械因素包括血管的周围阻力,可能因内外因素(如狭窄)而变化,导致的静脉回流,瓣膜的状态(撕裂、钙化)

其他电气因素包括异位起搏细胞、传导问题、再入环路

如 Amit Guy 博士所示,系统的复杂性和相互作用如下所示—

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

来源:Amit Guy 博士的研究

心音

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

来源: www.youtube.com/watch?v=FtXNnmifbhE&list=PL3n8cHP87ijDnqI8_5WQlS4tN37D6P4dH

最常用来监听心音的四个位置是根据可以最好地听到心瓣膜的部位来命名的:

  • 主动脉区 — 位于第二右肋间隙中心。

  • 肺动脉区 — 在左侧胸骨边缘的第二肋间隙。

  • 三尖瓣区 — 在左侧胸骨边缘的第四肋间隙。

  • 二尖瓣区 — 在心尖部,位于第五肋间隙的锁骨中线处。

不同类型的心音如下:

  1. S1 — 心室收缩开始

  2. S2 — 半月瓣关闭

  3. S3 — 心室奔马律

  4. S4 — 房性奔马律

  5. EC — 收缩期射血音

  6. MC — 中收缩期音

  7. OS — 舒张音或开瓣音

  8. 杂音

基本心音(FHS)通常包括第一心音(S1)和第二心音(S2)。

S1 发生在等容收缩期开始时,当二尖瓣和三尖瓣因心室内压力快速增加而关闭。

S2 发生在舒张期开始时,主动脉瓣和肺动脉瓣关闭。

虽然 FHS 是最易识别的心周期声音,但心脏的机械活动也可能导致其他可听见的声音,如第三心音(S3)、第四心音(S4)、收缩期射血音(EC)、中收缩期音(MC)、舒张音或开瓣音(OS),以及由血流湍流和高速流动引起的心脏杂音。

数据

我们从 Physionet 挑战网站 的 2016 挑战 — 心音记录分类中获取 ECG 数据。该挑战的目标是分类正常、异常和不明确的心音。为了演示目的,我们将其分类为 2 类 — 正常和异常(以便于演示)。

Python 代码

类似于 R,Python 中有几个用于处理音频数据的库。在这段代码中,我们将使用其中一个库 — librosa

  • librosa

  • scipy

  • wav

我们将使用 librosa,因为它也可以用于音频特征提取。

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

安装库

Librosa 返回数据和默认设置为 22050 的采样率,但你可以更改此设置或使用原始采样率。让我们加载一个音频文件并查看信号。

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

接下来,重新加载所有训练数据集并创建一个完整的训练文件。下面的代码解释了如何做到这一点。我们还将数据分类为正常和异常数据。

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

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

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

观察:文件长度不同

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

这里需要注意的另一点是音频文件的时长。第一个文件为 20 秒,而第二个为 35 秒。处理这个问题有两种方法:

1. 用零填充音频到给定长度

2. 重复音频以达到给定长度,例如所有音频样本的最大长度

同时,请注意我们的库 Librosa 的默认采样率设置为 22050(仅供参考,你可以更改此设置或使用原始采样率)。有关采样率的定义和其他细节,请参见之前的帖子:“R 中的音频文件处理基础

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

采样 & 将所有文件设置为相同长度

用于零填充和音频重复的辅助函数

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

获取模型处理的数据(注意:此过程需要时间)外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有文件长度相同并且填充零

让我们查看wave_files,我们看到每个文件都有一行,每行有 110250 列的值。(记住我们的音频长度是 110250)

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

我们已经快准备好将这些数据传递给算法了。我们需要创建测试和训练数据集。这是用原始数据训练模型,而不进行任何特征工程。让我们看看结果如何。

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

我们将使用“adam”优化器和 binary_crossentropy,详细信息请查看论文

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

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

在下一篇文章中,我们将使用在初始文章中讨论的频率策略,并用 python 改进分数。

源代码:github.com/taposh/audio_processing/blob/master/code/python-code/heart_beat_python.ipynb

简介:Taposh Dutta Roy 领导 Kaiser Permanente 的 KPInsight 创新团队。这些是基于他个人研究的想法。这些想法和建议并不代表 Kaiser Permanente,Kaiser Permanente 对内容不承担任何责任。如果你有问题,可以通过linkedin联系 Dutta Roy 先生。

参考文献:

Goldberger AL, Amaral LAN, Glass L, Hausdorff JM, Ivanov PCh, Mark RG, Mietus JE, Moody GB, Peng C-K, Stanley HE. PhysioBank, PhysioToolkit, 和 PhysioNet:复杂生理信号的新研究资源组件(2003)。《循环》101(23):e215-e220。

R 中的音频文件处理基础

在当今时代,数字音频已成为我们生活的一部分。你可以与 Siri、Alexa 交流或说“好的……

人体心脏基础解剖 - 心血管研究网络项目

心脏在哺乳动物中进化以履行其独特而关键的功能,即将血液排出和收集……

人体心脏基础解剖 - 心血管研究网络项目

心脏在哺乳动物中进化以履行其独特而关键的功能,即将血液排出和收集……

麦克马斯特大学医学院 >> 心脏科

心脏科部门积极参与本科医学教育及住院医生的培训……

LibROSA - librosa 0.7.2 文档

LibROSA 是一个用于音乐和音频分析的 Python 包。它提供了创建音乐所需的构建块……

arxiv.org/abs/1412.6980

www.researchgate.net/publication/210290203_Phonocardiography_Signal_Processing

胸腔 | 解剖学

胸腔是身体第二大空腔,由肋骨、脊柱和……

原文。经许可转载。

相关:

  • 使用深度神经网络构建音频分类器

  • 人工智能改变医疗行业的 5 种方式

  • 10 个 Python 字符串处理技巧与窍门


我们的三大课程推荐

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 1. Google 网络安全证书 - 快速进入网络安全职业道路

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 2. Google 数据分析专业证书 - 提升你的数据分析技能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 3. Google IT 支持专业证书 - 支持你的组织的 IT 工作


更多相关话题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值