好久没有更新博客了,最近在学习深度学习、机器学习部分的内容,有好的方法和经验想要在这里分享给大家。

  (A)首先,用户使用熟悉类似Pytorch的语法指定神经网络结构,并使用熟悉类似Pytorch的语法进行编码,参数被传递给每一个层,指定各种信息,如卷积特征图的数量、激活函数等。该模型被添加到场景中,可以渲染为一个单一的禁止帧;

  (B)然后用户可以指定一个他们下午用代码播放的动画,帧显示了指定的神经网络向前传递的动画;一个动画是通过一下方式自动构建的结合每层的原始动画。首先显示的是卷积动画,接着是前馈神经网络动画。

MANIMML渲染卷积神经网络前向传递的动画逻辑图如下:

  近年来,由于机器学习在科学和工程领域的应用,人们对机器学习(ML)的兴趣很狂热,然而随着ML技术的发展,用于解释和可视化的ML算法已经落后;动画已经被证实是一个强大的工具,可以使动态变化的系统具有吸引力的视觉化系统随时间动态变化的强大工具,这使它非常适用于交流ML的算法任务;然而目前为ML算法制作动画的方法是手工制作突出特定算法的应用程序,或使用通用复杂的动画软件,为此开发了MANIMML,这是一个开源的Python库,可以直接从代码中轻松生成ML的算法动画;试图直接利用从业者的已有编程知识,而不是让人再去学习复杂的动画软件,MANIMML有一个熟悉的语法用于指定神经网络,模仿流行的深度学习,如Pytorch,用户可以使用预先存在的神经网络架构,并轻松的在MANIMML中写出一个动画,然后它会自动将系统的不同组件的动画组成不同组件的动画,最后从而形成整个神经网络的最终动画,同时MANIMML是开源的。

一、简介

  机器学习(ML)因其在许多科学领域的成功而备受关注,这对ML技术的兴趣激增导致了可视化和解释ML算法的工具的开发,动画是传达算法动态的一种强大技术,其功效长期以来一直受到研究人员的关注,动画已被证明能够有效提高学习者的参与度,尤其有助于显示系统状态之间的转换,这使得动画很适合于交流ML算法的任务,因为ML算法是通常涉及许多具有复杂顺序依赖关系,尽管对其功效进行了研究但对于ML从业人员像我们来说,仍然是很难很轻松的设计出很成功的动画来解释新的算法,有许多的ML可视化工具都是利用动画的,他们通常是手工设计,以便突出特定方法的功能,这可能是一个令人望而却步的时间密集型过程,根据这些观察结果,我学习到的一些如下:

1.MANIMML是一个开源的Python库,用于交流ML构架和ML算法的操作顺序。MANIMML为用户提供了Python代码快速渲染神经网络等构架动画的能力;之所以选择Python为编程语言官方解释说是因为现在大多我们选择的从业人员和研究人员都把Python作为默认语言,并且它也包含很多深度学习库,为了让大家能够更熟悉ML,下面是模拟的流行的深度学习库的语法。用户可以将神经网络的构架指定为任意序列,MANIMML将会自动构建指定构架的组合动画。

上图是MANIMML能够对神经网络训练技术中常见的现象进行处理,(A)显示了指定神经网络和所需动画的最少代码量;(B)显示了MANIMML根据用户指定渲染的动画。

2.可扩展的软件库设计,可以快速适应新的ML架构,许多现有的ML可视化工具是手工制作的,以突出算法的相关信息,这可能既费时又费力,而MANIMML用户指定的预实现动画和可视化资产变得简单,也使生成新系统的动画变得简单、无需从头开始制作;此外,由于ML文献的快速发展,其系统支持添加新动画、新的组件和可视化技术,并且允许工程师们替换新的动画并对现有的组件进行扩展。

二、系统设计

  软件库设计,MANIMML是在MIT许可下发布的开源软件库,编程语言选择了Python,因为在ML社区比较受欢迎,ML和科学计算软件MANIMML有可能与之有潜在的接口,其工具建立在Manim  Community库之上,该库是一个用于执行数学概念动画的Python工具;Manim Community提供了一套抽象系统,用于创建矢量图形和其他资产,并将其放入Python场景中,并对其应用动画;MANIMML是对Manim社区的主要扩展,提供了将ML算法和构架动画化的功能,MANIMML具有一种成熟的语法,用于指定神经网络架构,灵感是来源于目前流行的深度学习库;用户只需要指定神经网络层序列和各自的超参数,MANIMML将自动构建整个网络的动画,每层都是单独实现的,每一对有效的层都具有其相对应的动画,这种模块化设计便于添加新的层面和动画。

例如:以下代码是一个卷积神经网络的可视化实现:

from manim import *

from manim_ml.neural_network import Convolutional2DLayer, FeedForwardLayer, NeuralNetwork

# This changes the resolution of our rendered videos
config.pixel_height = 700
config.pixel_width = 1900
config.frame_height = 7.0
config.frame_width = 7.0

# Here we define our basic scene
class BasicScene(ThreeDScene):

    # The code for generating our scene goes here
    def construct(self):
        # Make the neural network
        nn = NeuralNetwork([
                Convolutional2DLayer(1, 7, 3, filter_spacing=0.32),
                Convolutional2DLayer(3, 5, 3, filter_spacing=0.32),
                Convolutional2DLayer(5, 3, 3, filter_spacing=0.18),
                FeedForwardLayer(3),
                FeedForwardLayer(3),
            ],
            layer_spacing=0.25,
        )
        # Center the neural network
        nn.move_to(ORIGIN)
        self.add(nn)
        # Make a forward pass animation
        forward_pass = nn.make_forward_pass_animation()
        # Play animation
        self.play(forward_pass)

可将上述代码复制在一个假设以example.py结尾的文件中,在命令行中运行以下命令(在一切安装正常情况下):

$ manim -pql example.py

以上生成的渲染分辨率较低,可以通过以下命令来提高分辨率(但会降低渲染速度):

$ manim -pqh example.py

效果图如下:(因为这里不能放GIF的动图,就放了两张经过运动前后的图片对比)

------------------

相关资讯灵感来自GitHub~

这次的博客就写到这里,后期会继续更新相关MANIMML的相关应用和代码。