如何创造性地应用深度学习视觉模型于非视觉任务

时间:2020-12-14 20:12:14 浏览量:

如何创造性地应用深度学习视觉模型于非视觉任务 2 深度学习在图像超分辨率重建中的应用 8 前言 8 1、SRCNN 8 2、 DRCN 9 3、 ESPCN 10 4、 VESPCN 12 5, SRGAN 13 RG和RBM作为粗粒度过程 16 精确对比 19 重整化群理论:鸟瞰图 19 物理学中旋转的概念 19 重整化数学 20 变分重整化组(VRG) 23 RBM简要总结 24 完全映射RG和RBM 26 应用于伊辛模型 26 结论和展望 27 我的深度学习练习记录:如何生成钢琴音乐? 29 如何创造性地应用深度学习视觉模型于非视觉任务 导读 众所周知,目前深度学习在计算机视觉领域已经有很好的应用落地,再加上迁移学习,可以很容易的训练出一个用于视觉任务的模型。但是现实中还有很多任务的原始数据是非视觉类型的,面对这样的问题,我们还可以借用强大的深度学习视觉模型吗,本文作者将用3个具体案例来展示这一切都是可能的。

介绍 近年来,深度学习已经彻底改变了计算机视觉。由于有迁移学习和优秀的学习资源,任何人都可以在数天甚至数小时内,利用预先训练好的模型并将其应用于自己的领域从而获得最先进的结果。随着深度学习变得商品化,人们的需求也随之变成了它在不同领域的创造性应用。

迁移学习教程:https://machinelearningmastery.com/transfer-learning-for-deep-learning/深度学习教程:https://course.fast.ai/ 今天,计算机视觉领域的深度学习已经在很大程度上解决了视觉对象分类、目标检测和识别问题。在这些领域,深度神经网络的表现优于人类。

即使数据不是可视化的,你仍然可以利用深度学习视觉模型,主要是指CNN。要做到这一点,你必须将数据从非视觉型转换为图像,然后使用某个针对图像预训练过的模型来处理你的数据。你将会对这种方法的强大感到惊讶! 在本文中,我将介绍3个创造性地使用深度学习的案例,展示一些公司如何将深度学习视觉模型应用于非视觉领域。在每个案例中,都会对一个非计算机视觉问题进行转换和说明,以便利用适于图像分类的深度学习模型。

案例一:石油工业 在石油工业中,“磕头机”常用于从地下开采石油和天然气。它们由一个连接在游梁上的发动机提供动力。游梁将发动机的旋转运动转化为抽油杆的垂直往复运动,使得抽油杆像泵一样将油输送到表面。

磕头机,也称为抽油机。来源:
https://commons.wikimedia.org 像任何复杂的机械系统一样,抽油机也容易发生故障。为了帮助诊断,人们在抽油机上安装一个测功计,用于测量杆上的负载。测量后,绘制出一张测功计泵卡,其显示发动机旋转周期各部分的负载。

测功计泵卡样例。来源:
https://www.researchgate.net/ 当抽油机出故障时,测功计泵卡的形状会改变。通常会邀请专业技术人员来检查卡,并就泵的哪个部位出现故障以及需要采取什么措施来修复它作出判断。这个过程非常耗时,并且需要非常狭窄的专业知识才能有效解决。

另一方面,这个过程看起来像是可以自动化的,这就是之前为什么传统的机器学习系统被试过,只是没有取得好的效果,准确率仅为60%左右。

将深度学习应用到这个领域的公司之一是贝克休斯(Baker Hughes)。在他们的案例中,测功计泵卡被转换成图像,然后作为输入传给ImageNet预训练好的模型中。结果令人印象深刻——只需采用预训练好的模型并用新数据对其进行微调,准确率就从60%上升到了93%。对模型进一步优化,其准确率可达97%。

贝克休斯部署的系统示例。左侧是输入图像,右侧是故障模式的实时分类。系统在便携式设备上运行,其分类时间显示在右下角。来源:https://www.youtube.com 它不仅击败了以前基于传统机器学习的方法,而且现在该公司不需要抽油机技术人员花时间来诊断问题,从而可以提高效率。他们可以立即开始修复机械故障。

要了解更多信息,你还可以阅读一篇讨论类似方法的论文。

案例二:在线欺诈检测 计算机用户在使用计算机时有独特的模式和习惯。当你浏览一个网站时你使用鼠标的方式或者编写邮件时你在键盘上敲击的方式都是独一无二的。

在这个案例中,Splunk解决了一个问题,即通过使用计算机鼠标的方式对用户进行分类。如果你的系统能够根据鼠标使用模式唯一地识别用户,那它就可以用于欺诈检测。想象一下:欺诈者窃取某人的登录名和密码,然后登录并在网上商店购物。欺诈者使用电脑鼠标的方式是独一无二的,系统将很容易检测到这种异常情况,并防止欺诈交易发生,同时也会通知账户的真正所有者。

使用一段特殊的javascript代码,就可以收集所有的鼠标活动。该软件每5-10毫秒记录一次鼠标活动。因此,每个用户每页面大约会产生5000–10000个数据点。该数据有两大挑战:首先,这对每个用户来说都是大量的数据;
第二,每个用户的数据集将包含不同数量的数据点,这不是很方便,因为通常而言,不同长度的序列需要用到更精巧的深度学习架构。

他们的解决办法是将每个用户在每个网页上的鼠标活动转换为单个图像。在每幅图像中,鼠标移动由一条线表示,颜色编码了鼠标移动的速度,而左击和右击则由绿色和红色圆圈表示。这种处理初始数据的方法解决了上述两个问题:首先,所有图像的大小都相同;
其次,可以使用处理图像的深度学习模型了。

在每幅图像中,鼠标移动由一条颜色编码鼠标速度的线表示,而左击和右击则由绿色和红色圆圈表示。来源:https://www.splunk.com Splunk使用TensorFlow加Keras构建了一个分类用户的深度学习系统。他们做了两个实验:
实验一:某个金融服务网站用户的组别分类——访问类似页面时,区分他们是普通客户还是非客户。

仅用了一个由2000张图片组成的较小的训练集,在对基于VGG16修改的网络结构进行了2分钟的训练后,系统就能以80%以上的准确率识别这两个类别。

实验二:单个用户分类。

该任务是对于给定的用户,通过鼠标活动预测它是此用户的还是模仿者的。这回仅有一个360张图片的小训练集。基于VGG16,但考虑到数据集更小和过拟合(可能使用了dropout和batch normalization),他们对网络结构进行了修改。经过3分钟的训练,准确率就达到了78%左右,考虑到该任务的挑战性,这个结果令人印象非常深刻。

想了解更多信息,请参阅下面这篇描述系统和实验的完整文章。

文章链接:https://www.splunk.com/blog/2017/04/18/deep-learning-with-splunk-and-tensorflow-for-security-catching-the-fraudster-in-neural-networks-with-behavioral-biometrics.html 案例三:鲸鱼的声音检测 在这个例子中,谷歌使用卷积神经网络来分析录音并检测其中的座头鲸。这对研究而言很有用,例如跟踪单个鲸鱼的运动、歌曲的特性、鲸鱼的数量等。有趣的不是研究目的,而是谷歌如何处理数据以用于需要图像的卷积神经网络。

将音频数据转换成图像的方法是使用时频谱。时频谱是音频数据基于频率特征的视觉表示。

一个男性声音说“十九世纪”的时频谱例子。来源:
https://commons.wikimedia.org 在将音频数据转换成时频谱之后,谷歌的研究人员使用了Resnet-50架构来训练这个模型。达到的性能如下:
精度90%:90%被模型归类为鲸鱼歌声的音频剪辑被正确归类 召回率90%:如果有一首鲸鱼歌声的录音,有90%的几率它会被贴上这样的标签。

这一结果令人印象深刻,对鲸鱼的研究也一定有帮助。

让我们把焦点从鲸鱼转到处理音频数据上。创建时频谱时,根据音频数据的类型,你可以选择要使用的频率。针对人类语音、座头鲸歌声或工业设备录音等将需要不同的频率,因为在这些不同场景下,最重要的信息包含在不同的频段中。必须使用领域知识来选择该参数。例如,如果你使用的是人类语音数据,那么第一选择应该是梅尔倒频谱。

目前有很好的软件包可用于音频。librosa是一个免费的音频分析python库,可以使用CPU生成时频谱。如果你在TensorFlow上开发并且想在GPU上做时频谱计算,也是可以的。

librosa相关链接:https://librosa.github.io/librosa/ 请参考下面这篇谷歌人工智能的原始博客文章,以了解更多关于谷歌如何处理座头鲸数据的信息。

谷歌博客文章:https://ai.googleblog.com/2018/10/acoustic-detection-of-humpback-whales.html 总而言之,本文概述的一般方法遵循两个步骤。

首先,找到一种将数据转换成图像的方法;

第二,使用经过预训练的卷积网络或从头训练一个。

第一步要比第二步更难,需要思考你的数据是否可以转换成图像,这是你展现创造性的地方。我希望上述提供的示例对解决你的问题有帮助。如果你还有其他的例子或问题,请写在下面的评论中。

参考引用 IoT for Oil & Gas?—?The Power of Big Data and ML (Cloud Next ’18) https://www.youtube.com/watch?v=6_kdEguYwwg&feature=youtu.be&t=1692 Beam Pump Dynamometer Card Prediction Using Artificial Neural Networks https://www.knepublishing.com/index.php/KnE-Engineering/article/download/3083/6587 Splunk and Tensorflow for Security: Catching the Fraudster with Behavior Biometrics https://www.splunk.com/blog/2017/04/18/deep-learning-with-splunk-and-tensorflow-for-security-catching-the-fraudster-in-neural-networks-with-behavioral-biometrics.html Acoustic Detection of Humpback Whales Using a Convolutional Neural Network https://ai.googleblog.com/2018/10/acoustic-detection-of-humpback-whales.html 深度学习在图像超分辨率重建中的应用 前言 这篇文章可能看的会很吃力,需要一定基础才能看懂,但是文章质量很高。喜欢小编的老铁记得点赞关注,想问啥也可以私信我,小编在这里抱拳了! 超分辨率技术(Super-Resolution)是指从观测到的低分辨率图像重建出相应的高分辨率图像,在监控设备、卫星图像和医学影像等领域都有重要的应用价值。SR可分为两类:从多张低分辨率图像重建出高分辨率图像和从单张低分辨率图像重建出高分辨率图像。基于深度学习的SR,主要是基于单张低分辨率的重建方法,即Single Image Super-Resolution (SISR)。

SISR是一个逆问题,对于一个低分辨率图像,可能存在许多不同的高分辨率图像与之对应,因此通常在求解高分辨率图像时会加一个先验信息进行规范化约束。在传统的方法中,这个先验信息可以通过若干成对出现的低-高分辨率图像的实例中学到。而基于深度学习的SR通过神经网络直接学习分辨率图像到高分辨率图像的端到端的映射函数。

本文介绍几个较新的基于深度学习的SR方法,包括SRCNN,DRCN, ESPCN,VESPCN和SRGAN等。

1、SRCNN Super-Resolution Convolutional Neural Network (SRCNN, PAMI 2016, 代码)是较早地提出的做SR的卷积神经网络。该网络结构十分简单,仅仅用了三个卷积层。

该方法对于一个低分辨率图像,先使用双三次(bicubic)插值将其放大到目标大小,再通过三层卷积网络做非线性映射,得到的结果作为高分辨率图像输出。作者将三层卷积的结构解释成与传统SR方法对应的三个步骤:图像块的提取和特征表示,特征非线性映射和最终的重建。

三个卷积层使用的卷积核的大小分为为9x9, 1x1和5x5,前两个的输出特征个数分别为64和32. 该文章分别用Timofte数据集(包含91幅图像)和ImageNet大数据集进行训练。相比于双三次插值和传统的稀疏编码方法,SRCNN得到的高分辨率图像更加清晰,下图是一个放大倍数为3的例子。

对SR的质量进行定量评价常用的两个指标是PSNR(Peak Signal-to-Noise Ratio)和SSIM(Structure Similarity Index)。这两个值越高代表重建结果的像素值和金标准越接近,下图表明,在不同的放大倍数下,SRCNN都取得比传统方法好的效果。

2、 DRCN SRCNN的层数较少,同时感受野也较小(13x13)。DRCN (Deeply-Recursive Convolutional Network for Image Super-Resolution, CVPR 2016, 代码)提出使用更多的卷积层增加网络感受野(41x41),同时为了避免过多网络参数,该文章提出使用递归神经网络(RNN)。网络的基本结构如下:
与SRCNN类似,该网络分为三个模块,第一个是Embedding network,相当于特征提取,第二个是Inference network, 相当于特征的非线性变换,第三个是Reconstruction network,即从特征图像得到最后的重建结果。其中的Inference network是一个递归网络,即数据循环地通过该层多次。将这个循环进行展开,就等效于使用同一组参数的多个串联的卷积层,如下图所示:
其中的H1到HD是D个共享参数的卷积层。DRCN将每一层的卷积结果都通过同一个Reconstruction Net得到一个重建结果,从而共得到D个重建结果,再把它们加权平均得到最终的输出。另外,受到ResNet的启发,DRCN通过skip connection将输入图像与Hd的输出相加后再作为Reconstruction Net的输入,相当于使Inference Net去学习高分辨率图像与低分辨率图像的差,即恢复图像的高频部分。

实验部分,DRCN也使用了包含91张图像的Timofte数据集进行训练。得到的效果比SRCNN有了较大提高。

3、 ESPCN 在SRCNN和DRCN中,低分辨率图像都是先通过上采样插值得到与高分辨率图像同样的大小,再作为网络输入,意味着卷积操作在较高的分辨率上进行,相比于在低分辨率的图像上计算卷积,会降低效率。

ESPCN(Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network,CVPR 2016, 代码)提出一种在低分辨率图像上直接计算卷积得到高分辨率图像的高效率方法。

ESPCN的核心概念是亚像素卷积层(sub-pixel convolutional layer)。如上图所示,网络的输入是原始低分辨率图像,通过两个卷积层以后,得到的特征图像大小与输入图像一样,但是特征通道为r2(r是图像的目标放大倍数)。将每个像素的r2个通道重新排列成一个r x r的区域,对应于高分辨率图像中的一个r x r大小的子块,从而大小为r2 x H x W的特征图像被重新排列成1 x rH x rW大小的高分辨率图像。这个变换虽然被称作sub-pixel convolution, 但实际上并没有卷积操作。

通过使用sub-pixel convolution, 图像从低分辨率到高分辨率放大的过程,插值函数被隐含地包含在前面的卷积层中,可以自动学习到。只在最后一层对图像大小做变换,前面的卷积运算由于在低分辨率图像上进行,因此效率会较高。

重建效果上,用PSNR指标看来ESPCN比SRCNN要好一些。对于1080HD的视频图像,做放大四倍的高分辨率重建,SRCNN需要0.434s而ESPCN只需要0.029s。

4、 VESPCN 在视频图像的SR问题中,相邻几帧具有很强的关联性,上述几种方法都只在单幅图像上进行处理,而VESPCN( Real-Time Video Super-Resolution with Spatio-Temporal Networks and Motion Compensation, arxiv 2016)提出使用视频中的时间序列图像进行高分辨率重建,并且能达到实时处理的效率要求。其方法示意图如下,主要包括三个方面:
一是纠正相邻帧的位移偏差,即先通过Motion estimation估计出位移,然后利用位移参数对相邻帧进行空间变换,将二者对齐。二是把对齐后的相邻若干帧叠放在一起,当做一个三维数据,在低分辨率的三维数据上使用三维卷积,得到的结果大小为r2 x H x W。三是利用ESPCN的思想将该卷积结果重新排列得到大小为1 x rHx rW的高分辨率图像。

Motion estimation这个过程可以通过传统的光流算法来计算,DeepMind 提出了一个Spatial Transformer Networks, 通过CNN来估计空间变换参数。VESPCN使用了这个方法,并且使用多尺度的Motion estimation:先在比输入图像低的分辨率上得到一个初始变换,再在与输入图像相同的分辨率上得到更精确的结果,如下图所示:
由于SR重建和相邻帧之间的位移估计都通过神经网路来实现,它们可以融合在一起进行端到端的联合训练。为此,VESPCN使用的损失函数如下:
第一项是衡量重建结果和金标准之间的差异,第二项是衡量相邻输入帧在空间对齐后的差异,第三项是平滑化空间位移场。下图展示了使用Motion Compensation 后,相邻帧之间对得很整齐,它们的差值图像几乎为0. 从下图可以看出,使用了Motion Compensation,重建出的高分辨率视频图像更加清晰。

5, SRGAN SRGAN (Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network, arxiv, 21 Nov, 2016)将生成式对抗网络(GAN)用于SR问题。其出发点是传统的方法一般处理的是较小的放大倍数,当图像的放大倍数在4以上时,很容易使得到的结果显得过于平滑,而缺少一些细节上的真实感。因此SRGAN使用GAN来生成图像中的细节。

传统的方法使用的代价函数一般是最小均方差(MSE),即 该代价函数使重建结果有较高的信噪比,但是缺少了高频信息,出现过度平滑的纹理。SRGAN认为,应当使重建的高分辨率图像与真实的高分辨率图像无论是低层次的像素值上,还是高层次的抽象特征上,和整体概念和风格上,都应当接近。整体概念和风格如何来评估呢?可以使用一个判别器,判断一副高分辨率图像是由算法生成的还是真实的。如果一个判别器无法区分出来,那么由算法生成的图像就达到了以假乱真的效果。

因此,该文章将代价函数改进为 第一部分是基于内容的代价函数,第二部分是基于对抗学习的代价函数。基于内容的代价函数除了上述像素空间的最小均方差以外,又包含了一个基于特征空间的最小均方差,该特征是利用VGG网络提取的图像高层次特征:
对抗学习的代价函数是基于判别器输出的概率:
其中DθD()是一个图像属于真实的高分辨率图像的概率。GθG(ILR)是重建的高分辨率图像。SRGAN使用的生成式网络和判别式网络分别如下:
该方法的实验结果如下 从定量评价结果上来看,PSNR和SSIM这两个指标评价的是重建结果和金标准在像素值空间的差异。SRGAN得到的评价值不是最高。但是对于MOS(mean opinion score)的评价显示,SRGAN生成的高分辨率图像看起来更真实。

物理学对于深度学习可解释性的启发 令人惊讶的是,这个局部块旋转结构从训练过程中出现,表明DNN是自组织的,以实现块旋转重整化...无需手动干涉,它在学习。

如今,人工智能几乎存在于我们生活的每一个角落。智能手机、社交媒体供稿、推荐引擎、在线广告网络和导航工具是基于AI的应用程序的一些示例,这些应用程序每天都会影响我们。语音识别、自动驾驶、机器翻译和视觉对象识别等领域的深度学习已经系统地改进了现有技术的状态。

然而,使深度神经网络(DNN)如此强大的原因只是启发式理解 ,即我们只从经验中知道我们可以通过使用大型数据集并遵循特定的训练来获得优异的结果。

最近,基于基于物理的概念框架(称为重整化群(Renormalization RG))和一种称为受限玻尔兹曼机(RBM)的神经网络之间的显着类比,提出了一种可能的解释。

RG和RBM作为粗粒度过程 重整化是一种用于在无法获得有关其微观部分的信息时研究物理系统行为的技术。这是一种“粗粒度“方法,它显示物理定律如何随着我们缩小和检查不同长度尺度的物体而变化,即“ 戴上模糊的眼镜“。

当我们改变观察物理系统的长度尺度时(当我们“放大“时),我们的理论遍历(航行)所有可能理论的空间。

该重视的RG理论来源于它提供了一个强有力的框架,基本上事实解释了为什么物理学本身可能。

为了描述诸如卫星之类的复杂结构的运动,人们不需要考虑其所有成分的运动。

RG理论提供了一个强大的框架,解释了为什么物理本身是可能的。

例如,我们只需要应用牛顿运动定律。我们不需要考虑卫星微观成分的极其复杂的行为来解释它的运动。我们在实践中所做的是对系统基本组件的详细行为进行“平均“。RG理论解释了为什么这个程序如此有效。

此外,RG理论似乎表明,我们所有的物理世界的现有理论都只是近似值一些未知的“真理“。

RG理论似乎表明,我们目前对物理世界的所有理论都只是对某些未知的“真实理论“的近似。

当被调查的系统处于并显示自相似性时,RG运行良好。自我相似的系统在其被观察的任何长度范围内“完全或近似于其自身的一部分“。显示自相似性的系统的示例是分形。

临界点处的系统显示出彼此相距极远的部分之间的强相关性。所有子部分都影响整个系统,系统的物理特性完全独立于其微观结构。

人工神经网络也可以被视为粗粒度迭代过程。人工神经网络由多个层组成,如下图所示,较早的层仅从输入数据(如边缘和颜色)中学习较低级别的特征,而较深层的层次将这些较低级别的特征(由较早的特征提供)组合成较高级别的特征。用杰弗里辛顿的话说:“你首先要学习简单的特征,然后根据你的目标学习更复杂的特征,然后分阶段进行。“ 如同在RG过程中,更深层次只保留被认为相关的特征,不再强调不相关的特征。

卷积神经网络(CNN) CNN识别的复杂程度在后面的层中更高。

精确对比 物理学和机器学习都涉及具有许多成分的系统。物理学研究包含许多(相互作用)物体的系统。机器学习研究包括大量维度的复杂数据。此外,类似于物理学中的RG,神经网络设法对数据进行分类,例如动物的图片,而不管其组成部分(例如大小和颜色)。

在2014年的一篇论文中,两位物理学家Pankaj Mehta和David Schwab提供了基于重整化群理论的深度学习表现的解释。论文强调DNN是如此强大的特征提取器,因为它们可以有效地“模仿“粗粒化过程,这是RG过程的特征。

引用论文的一句话:“DNN架构可以被视为一种迭代的粗粒度方案,其中NN的每个新的高级层都从数据中学习越来越抽象的高级特征“。

实际上,在他们的论文中,他们设法证明RG和受限玻尔兹曼机之间确实存在确切的映射(RBM),构成DNN构建块的双层神经网络。

通过堆叠RBM建立的RG和DNN之间的映射 重整化群理论:鸟瞰图 如上所述,重归一化涉及将粗粒度技术应用于物理系统。RG理论是一个通用的概念框架,因此需要使用方法来操作这些概念。变分重整化群(VRG)是由Kadanoff,Houghton和Yalabik于1976年提出的一种这样的方案。

为了清楚地阐述,本文选择专注于一种特定类型的系统来说明RG是如何工作的,即量子自旋系统,而不是完全普遍地进行。但在深入研究数学机器之前,我们将对物理学中旋转含义进行解释。

物理学中旋转的概念 在物理学中,自旋可以定义为“由基本粒子,复合粒子和原子核携带的角动量的内在形式。“ 虽然旋转是定义为没有经典对应物的量子力学概念,但是具有自旋的粒子通常是描绘为围绕其自身轴旋转的小顶部。旋转与磁现象密切相关。

粒子旋转(黑色箭头)及其相关的磁场线 重整化数学 让我们考虑N个旋转的系统或集合。出于可视化目的,假设它们可以放在格子上,如下图所示。

旋转的二维点阵(由小箭头表示),球体是带电原子 由于旋转可以向上或向下,因此它们与二进制变量相关联 索引i可用于标记晶格中自旋的位置。为方便起见,我将用向量v表示自旋的配置。

对于热平衡系统,与自旋配置v相关的概率分布具有以下形式:
这是无处不在的(为方便起见,温度设定为1)。物体H(v)是系统的所谓哈密顿量,其可以被定义为 “对应于系统中所有粒子的动能和势能之和的算子“。分母Z是称为分区函数的归一化因子:
系统的哈密顿量可以表示为与自旋之间的相互作用相对应的项的总和:
参数集 被称为耦合常数,它们决定了自旋(第二项)之间或自旋和外部磁场(第一项)之间相互作用的强度。

我们需要考虑的另一个重要数量是。自由能源是一个最初来自热力学的概念,它被定义为“ 物理系统中可以转化为工作的能量 “。在数学上,在我们的例子中给出了:
符号“tr“代表迹(线性代数概念)。在本上下文中,它代表在可见的自旋的所有可能的配置的总和v。

在重新正规化过程的每个步骤中,系统在小长度尺度上的行为被平均。粗粒度系统的哈密顿量用新的耦合常数表示 并获得新的粗粒度变量。在我们的例子中,后者是块旋转h,新的哈密顿量是:
为了更好地理解什么是块旋转,请考虑下面的二维晶格。每个箭头代表一个旋转。现在将晶格划分为方形块,每个方块包含2×2个自旋。块自旋是对应于这些块中的每一个的平均自旋。

在块旋转RG中,系统被粗粒化为描述旋转块的有效行为的新块变量 请注意,新的哈密顿量具有与原始哈密​​顿量相同的结构,仅使用自旋块的配置代替物理自旋。

两个汉密尔顿主义者具有相同的结构,但具有不同的变量和耦合。

换句话说,模型的形式不会改变,但是当我们缩小模型变化的参数时。通过系统地重复这些步骤来获得理论的完全重整化。在几次RG迭代之后,一些参数将被删除,一些参数将保留。剩下的那些被称为。

这些汉密尔顿主义者之间的联系是通过要求RG变换后的自由能(在上面几行中描述)不变化而获得的。

变分重整化组(VRG) 如上所述,为了实现RG映射,可以使用变分重整化组(VRG)方案。在该方案中,映射由操作员实现 其中λ是一组参数。此运算符对隐藏和输入(可见)自旋之间的耦合进行编码,并满足以下关系:
它定义了上面给出的新哈密顿量。虽然在精确的RG变换中,粗粒度系统将具有与原始系统完全相同的自由能,即 这相当于以下条件 在实践中,这个条件不能完全满足,并且使用变分方案来找到最小化自由能之间差异的λ 或等效地,近似精确的RG变换。

RBM简要总结 以上详细描述了受限制的Boltzmann机的内部工作原理。在这里,我将提供更简洁的解释。

受限制的玻尔兹曼机器(RBMs)是基于能量的生成。用于。他们最简单的版本只包含两层:
一层可见单元,用v表示 一个隐藏层,单位用h表示 简单的受限制的Boltzmann机的例证 我将再次考虑二元可见数据集v,其中n个元素从一些概率分布中提取 输入或可见数据的概率分布 RBM中的隐藏单元(由向量h表示)耦合到可见单元,其中交互能量由下式给出:
能量子指数λ表示变分参数集{ c,b,W } 。前两个元素是向量,第三个是矩阵。RBM的目标是输出与λ相关的 概率分布,该概率分布尽可能接近输入数据P(v)的分布。

与配置(v,h)和参数λ相关联的概率是该能量函数的函数:
从这个联合概率,人们可以通过对隐藏单位求和来轻松获得可见单位的变分(边缘化)分布。同样,隐藏单位的边缘化分布是通过对可见单位求和得到的:
我们可以如下定义RBM哈密顿量:
λ参数可以被选择以优化所谓的Kullback-Leibler距离(KL)散度或相对熵,其测量两个概率分布多么不同。在本案例中,我们感兴趣的是真实数据分布与RBM产生的可见单位的变分分布之间的KL差异。进一步来说:
当两个发行版都相同时:
完全映射RG和RBM Mehta和Schwap表明,为了建立RG和RBM之间的精确映射,可以为变分运算符选择以下表达式:
回想一下,哈密顿量H(v)包含在其内部编码的输入数据的概率分布。通过这种变分算子的选择,可以快速证明隐藏层上的RG哈密顿量和RBM哈密顿量是相同的:
此外,当可以实现精确的RG变换时,真实和变分哈密顿量是相同的:
因此,我们看到具有自旋v和 块自旋h的重整化组的一个步骤可以精确地映射到由可见单元v和隐藏单元h组成的双层RBM 。

随着我们堆叠越来越多的RBM层,我们实际上正在执行越来越多的RG转换。

应用于伊辛模型 根据这一基本原理,我们得出结论,RBM是一种无监督深度学习算法,它实现了变分RG过程。这是一个非凡的对应关系,Mehta和Schwab通过在一个易于理解的Ising旋转模型上实现堆叠RBM来展示他们的想法。作为输入数据,它们将从Ising模型采样的旋转配置输入到DNN中。他们的结果显示,显然,DNN似乎正在执行(Kadanoff) 块旋转重整化。

在作者的话中“令人惊讶的是,这个局部块旋转结构从训练过程中出现,表明DNN是自组织的,以实现块旋转重整化...无需手动干涉,它在学习“。

他们的结果表明,DNN似乎正在执行块自旋重整化。

在图中,A显示了DNN的架构。在B中,绘制学习参数W以显示隐藏单元和可见单元之间的相互作用。在D中,当我们沿着DNN的层移动时,我们看到逐渐形成块旋转(图中的斑点)。在E中,示出了再现三个数据样本的宏观结构的RBM重建。

深度神经网络应用于2D Ising模型 结论和展望 2014年,表明,受限制的玻尔兹曼机(RBM)是一种神经网络,它与重整化群相连,这一概念最初来自物理学。在本文中,我回顾了他们的部分分析。如前所述,RG和深度神经网络都具有非凡的“哲学相似性“:将复杂系统提炼成相关部分。这种RG-RBM映射是这种相似性的一种形式化。

由于深度学习和生物学习过程有许多相似之处,因此假设我们的大脑也可能使用某种“类固醇重整化“来理解我们的感知现实并不过分。

正如作者之一所,“也许有一些通用的逻辑来说明如何从数据中挑选出相关的特征,我想这可能就是存在这样的暗示。“ 假设我们的大脑也可能使用某种“类固醇重整化“来理解我们的感知现实是有理论可能的。

我的深度学习练习记录:如何生成钢琴音乐? 通过试验Tensorflow v2.0 Alpha,逐步生成钢琴音乐“♪♪♪” 大家好,在这篇文章中,我会分享给大家一些关于人工智能的实验,教大家如何使用深度学习生成音符,与我之前关于生成歌词的文章不同,这次我们将生成音乐笔记并生成文件(MIDI格式)。

音乐的主角是钢琴。本文将在自我注意的帮助下,使用递归神经网络(RNN),门控递归单元(GRU)的变体生成钢琴音符。本文不仅将介绍如何生成笔记,还将介绍如何将其生成为正确的MIDI文件,可以在计算机中播放。

本文针对的是对AI感兴趣的人,尤其是那些想要练习深度学习的人。我希望通过发表这篇文章来增加我的写作技巧,并也对你的文章内容产生帮助。

如果您想了解完整的源代码,那么本文末尾有一个Github链接。现在,我将在存储库中提供python笔记本和Colaboratory链接。

这是开场音乐 音乐.m4a1:41 来自AI中国 声音1:打开钢琴 (该音乐是由我们将在本文中创建的模型生成的) 大纲 介绍 技术与数据 管道 预处理MIDI文件 训练模型 推理和生成MIDI文件 结果 结论 后记 介绍 人工智能当前的热门话题之一是如何仅使用数据(无监督)来生成某些东西。在计算机视觉领域,有许多研究人员正在研究使用生成Advesarial网络(GAN)生成图像的一些先进技术。例如,NVIDIA使用GAN创建逼真的面部生成器。还有一些关于使用GAN生成音乐的研究。

如果我们谈论音乐发生器的价值,它可以用来帮助音乐家创作他们的音乐。它可以增强人们的创造力。我想在未来,如果在这个领域有很多高度关注,大多数音乐家都会创作出由AI辅助的产生音乐。

本文将重点介绍如何通过在音乐中生成连续的音符来生成音乐。我们将知道如何预处理数据并将其转换为神经网络的输入以生成音乐。

该实验还将使用Tensorflow v2.0(仍处于alpha阶段)作为深度学习框架。我想要展示的是通过遵循他们的一些最佳实践来测试和使用Tensorflow v2.0。我在Tensorflow v2.0中喜欢的一个功能是它通过使用AutoGraph来加速模型的训练。它可以通过使用@tf.function定义我们的函数来使用。而且,再也没有“tf.session”,也没有全局初始化。这些特征是我从Tensorflow转移到PyTorch的原因之一。

Tensorflow可用性可能对于我来说不太好。尽管如此,在我看来,Tensorflow v2.0改变了这一切并增加了它们的可用性,使得做一些实验变得舒适。

该实验还使用自我注意层。自我注意层将告诉我们,给定一个顺序实例(例如在音乐笔记“C D E F G”中),每个标记将了解对该标记的其他标记的影响程度。这是一些例子(对于NLP任务):
图1:注意力的可视化 有关自我注意的更多信息,特别是有关transformer的信息,您可以阅读这篇很棒的文章。

没有任何进一步的问题,让我们继续生成音乐 技术与数据 这个实验将使用:
Tensorflow v2.0:深度学习框架、Tensorflow的新版本,仍处于alpha阶段的开发阶段。

Python 3.7 Colaboratory:免费的Jupyter笔记本环境,无需设置即可完全在云中运行。拥有GPU Tesla K80甚至TPU!可悲的是,Tensorflow v2.0 alpha在撰写本文时仍然不支持TPU。

Python库pretty_midi:一个用于操作和创建MIDI文件的库 对于数据,我们使用来自Magenta的MAESTRO(MIDI和音频编辑用于同步TRacks和组织)作为数据集。此数据集仅包含钢琴乐器。我们将从大约1000个音乐中随机抽取100个音乐,以加快我们的训练时间。

管道 以下是关于我们的音乐生成器如何工作的管道:
图2:管道 我们将看到每个过程。为简化起见,我们将每个流程划分如下:
1预处理MIDI文件作为神经网络的输入 2训练过程 3生成MIDI文件 预处理MIDI文件 在讨论如何预处理midi文件之前,我们需要知道midi格式文件是什么。

从pcmag中,MIDI的定义为: (乐器数字接口)乐器、合成器和计算机之间音乐信息交换的标准协议。MIDI的开发使一台合成器的键盘可以播放另一台合成器产生的音符。它为音符以及按钮、拨盘和踏板的调整定义了代码,MIDI控制消息可以编排一系列合成器,每个合成器都扮演乐谱的一部分。MIDI 1.0版于1983年引入。

总之,MIDI文件包含了一系列包含注释的工具。例如钢琴和吉他的组合,每种乐器通常有不同的音符。

对于预处理MIDI文件,有一些库可以在Python中使用。其中一个是pretty_midi。它可以操作MIDI文件,还可以创建一个新文件。在本文中,我们将使用这个库。

pretty_midi文件格式如下: 图3:PrettyMidi格式 开始是第二个音符的开始。结束是一秒钟内演奏的音符的结束。一次可以有多个音符重叠。音高是演奏音符的MIDI数字。速度是发出音符的力。

MIDI数字与注名的关系参考如下图: 图4:Midi数字和注释名称 阅读Midi文件 我们将批量读取midi文件,这是我们使用pretty_midi读取它的方式: midi_pretty_format = pretty_midi.PrettyMIDI (“song.mid”) 我们将得到PrettyMidi对象。

对钢琴卷轴阵列进行预处理 图5:从pretty tymidi到Piano Roll Array 在本文中,我们需要从乐器中提取所有的音符。许多MIDI文件的音乐中有多种乐器。在我们的数据集中,MIDI文件只包含一种乐器,那就是钢琴。我们将从钢琴乐器中提取音符。为了更简单,我们将提取所需帧每秒的音符。pretty_midi有一个方便的函数get_piano_roll来获取二进制2D numpy中的音符。数组在(注释、时间)维度数组中,音符长度为128,时间按照音乐的时长除以FPS。

我们怎么做的源代码: 预处理到字典的时间和笔记 图6:钢琴卷轴数组到字典 在得到钢琴卷轴的数组之后,我们将它们转换成字典。字典将从音符播放的时间开始。例如,在上面的图中,我们从28开始(如果我们转换到秒,假设我们转换到piano_roll的速度是5 fps,音乐开始播放的速度是5.6 s,我们可以用28除以5)。

创建字典之后,我们将把字典的值转换为字符串。例如: array([49,68]) => '49,68' 要做到这一点,我们应该循环字典的所有键并改变它的值: for key in dict_note: dict_note[key] = ','.join(dict_note[key]) 预处理要输入的音符列表和神经网络的目标 图7:字典来列出序列 当我们得到字典后,将它转换成连续的笔记,这些笔记将被用来作为神经网络的输入。然后我们得到下一个时间步长作为神经网络输入的目标。

图8:滑动窗口 在本文中,序列列表的长度为50。这意味着如果我们的fps是5,将得到一个包含10秒(50 / 5)游戏时间的序列。

列表中的“e”表示在这段时间内没有演奏音符。因为有时候每个音符之间会有一个跳跃或者没有音符。在图7中的示例中,我们可以看到从43跳到46。如果我们转换这个序列,序列的列表将是: […'61,77', '61,77', 'e', 'e', '73',…] 我们怎么做呢?我们将用一批音乐来处理这个音符。

我们使用一个50长度的滑动窗口。对于音乐中的第一个音符,我们将在列表中添加“e”49次。然后将开始时间设置为字典中的第一个timestep。在图7中的例子中,它是28。然后我们在音乐中添加第一个音符(在示例‘77’中)。

然后对于下一个实例,我们将窗口滑动1次,并向列表中添加48次“e”,并将timestep 28中播放的音符添加到列表中,将timestep 29中播放的音符添加到列表中,并重复操作,直到音乐结束。

在下一段音乐中,我们重复上面的过程。

这是源代码: 创建注意分词器 在我们深入研究神经网络之前,我们必须创建标记器以将顺序音符更改为音符的顺序索引。首先,我们应该将音符映射到表示音符id的索引。

例如:
{ '61,77' : 1, # 61,77 will be identified as 1 'e' : 2, '73' : 3, . . } 如果我们之前的输入如下:
[...,'61,77','61,77','e','e','73',......] 我们将其转换为:
[... 1,1,2,2,3 ......] 这是我们的做法。

总结我们的预处理功能,以下是我们将使用的功能:
训练模型 在我们了解如何使用Tensorflow v2.0的新功能进行训练之前,我们将看到如下架构:
神经网络架构 图9:我们的神经网络架构 因此,深度学习架构将使用3层门控循环单元(GRU,一种回归神经网络的变体)和一些自注意层。使用丢失使得神经网络不会过快地过度拟合。

对于Self Attention Layers,我们将使用此存储库并对其进行一些编辑,以便我们可以在Tensorflow v2.0上使用它。

因此,深度学习架构将使用3层门控递归单元(GRU,递归神经网络的一种变体)和一些自我注意层。该方法采用了跳脱法,使神经网络不会快速过拟合。

对于Self - Attention层,我们将使用这个存储库并稍微编辑一下,以便在Tensorflow v2.0上使用它。

代码:
训练 我们将通过迭代数据集中的多个音乐来更新模型的权重,并如上所述预处理数据。然后,以一批待输入的实例和神经网络的目标为例。

我们将使用GradientTape来更新神经网络的权重。首先,我们使用apply_gradients计算损失并应用反向传播。如果您熟悉使用PyTorch,这就是Pytorch在训练其神经网络模型方面的工作方式。

务必在函数上使用@ tf.function。这会将功能转换为签名并使我们的训练更快。

tf.function的一个缺点是不能使用不同大小的批量作为神经网络的输入。例如,我们的批量大小为64。如果数据集的大小为70,则最后一批将包含6个实例。这将使程序抛出异常,因为图形将具有与初始图形不同大小的输入。也许它的工作原理是通过在使用函数时查看第一个输入来创建占位符。

在本文中,我们将使用16 BATCH_SONG和96 BATCH_NNET_SIZE。这意味着我们将从所有音乐列表中获取16个音乐,然后提取其序列。然后,对于神经网络中的每一步,我们从提取的序列实例中获取96个序列作为神经网络的输入和目标。

代码如下:
推理和生成MIDI文件 图10:推理和生成MIDI文件 使用我们训练的神经网络模型生成MIDI文件有两种方法:
我们需要在开始时选择:
我们生成随机50个音符作为音乐的开头。

我们使用49个空音符('e'),然后是我们选择的开始音符(例如'72',确保音符在NoteTokenizer中)。

图11:关于生成器如何工作的可视化 在我们选择音乐生成器的种子之后,使用我们训练的模型基于50个随机音符预测下一个音符。我们使用预测值作为如何随机选择音符的概率分布,这样做直到我们想要的指定的最大序列长度。然后我们放下前50个音符。

在我们生成音符列表序列之后,将其再次转换为钢琴卷轴阵列。然后将其转换为PrettyMidi对象。

之后,我们调整音乐的速度和节奏,最后我们生成MIDI文件。

代码 :
这是如何从生成的注释中编写midi文件:
结果 当我这样做时,训练耗时1小时,持续1个 epoch。当我这样做时,我决定进行4个 epoch(4个小时)的训练。

已经训练了4个 epoch的模型,结果如下:
由于头条号限制,只能发送一条音频,故详细资料请私信小编,回复“音乐”即可免费获取。

(请注意,这些是从MIDI文件转换而来的mp3文件。我使用在线转换器来执行此操作,这些注释似乎有点遗漏。如果您想听到,我会将原始MIDI上传到存储库中。) 这些生成的笔记之间存在明显差异。如果我们用一个音符生成它,它将在播放音符时节奏缓慢。它与我们从50个随机音符生成它时不同。它没有缓慢的开始。

这是在选择以随机50个音符开始的音乐的最后序列上的自我注意块的可视化:
首先注意 图12:第一次自我注意 第二个注意 图13:第二次自我注意 正如您所看到的,第一个自我注意块会学习在序列实例中为每个音符聚焦的音符。然而,在第二个关注区块中没有关注什么结果。我们还可以判断,如果其他音符的位置离当前音符很远,则它不会聚焦于它(图像12和图像13中的黑色)。

结论 我们使用包含钢琴音乐的MAESTRO数据集构建了一个生成音乐的工具。我们预处理它,训练我们的神经网络模型,然后用它生成音乐。音乐是MIDI格式。我们使用Tensorflow v2.0来完成它。我认为Tensorflow v2.0用户体验(UX)比以前的版本更好。

我们的模型产生的音乐也很连贯,很好听。它可以调整播放音符的方式。例如:当发生器从音符(意味着它是音乐的开头)时,它以慢节奏开始。

我们可以尝试一些音乐生成器。在本文中,我们已经尝试生成单个仪器。如果音乐有多种乐器怎么办?需要有一个更好的架构来做到这一点。我们可以尝试多种方法来试验音乐数据。

后记 这就是关于生成钢琴音乐笔记的文章。实际上,通过查看我的第一篇关于深度学习的文章,我得到了启发,这就是生成音乐的抒情效果。

“如何生成音符?”我做了一个试验它很有效。

对我来说,试验这个有一些困难。首先,我需要搜索易于预处理和输入神经网络的文件格式。我发现MIDI很简单,文件很小。然后,我需要知道是否有任何库可以在Python中预处理文件。我找到了两个,有music21和pretty_midi,他们的存储库没有过时,我选择pretty_midi。最后,我需要考虑如何预处理笔记。值得庆幸的是,pretty_midi有一个方便的函数get_piano_roll来使它更容易。

我还没有读过很多关于音乐的研究论文。也许有一些研究论文可以在Colaboratory中复制和显示。

自我注意层缺乏可视化效果。

存储库:
https://github.com/haryoa/note_music_generator

推荐访问:视觉 创造性 深度 模型 学习

《如何创造性地应用深度学习视觉模型于非视觉任务.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:

文档为doc格式

一键复制全文 下载 投诉