ManimML 是一个专注于通过Manim 社区库提供常见机器学习概念的动画和可视化的项目。请查看我们的论文。我们希望这个项目成为原始可视化的汇编,这些可视化可以轻松组合起来,以创建有关复杂机器学习概念的视频。此外,我们希望提供一组抽象,让用户专注于解释而不是软件工程。
先睹为快……
1 入门
1.1 安装
首先你需要安装 manim。确保它是 Manim 社区版,而不是原始的 3Blue1Brown Manim 版本。
然后从源或安装包 pip install manim_ml
。注意:某些最新功能可能仅当您从源安装时才可用。
1.2 第一个神经网络
这是卷积神经网络的可视化。生成此可视化所需的代码如下所示。
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
2 模块指南
这是一个更深入的指南,展示了如何使用 ManimML 的各种功能(注意:ManimML 仍在开发中,因此某些功能可能会发生变化,并且缺乏文档)。
2.1 设置场景
在 Manim 中,所有可视化和动画都属于。您可以通过扩展类或类(如果您的动画具有 3D 内容,则为 )Scene
来创建场景(我们的示例也是如此)。将以下代码添加到名为 的 Python 模块中。SceneThreeDSceneexample.
py
from manim import *
# Import modules here
class BasicScene(ThreeDScene):
def construct(self):
# Your code goes here
text = Text("Your first scene!")
self.add(text)
为了渲染场景,我们将在命令行中运行以下命令:
$ manim -pq -l example.py
这将生成一个低质量的图像文件(用于-h
高质量)。
对于本教程的其余部分,需要将代码片段复制到函数主体中construct
。
2.2 简单的前馈网络
通过 ManimML 我们可以轻松地将一个简单的前馈神经网络可视化。
from manim_ml.neural_network import NeuralNetwork, FeedForwardLayer
nn = NeuralNetwork([
FeedForwardLayer(num_nodes=3),
FeedForwardLayer(num_nodes=5),
FeedForwardLayer(num_nodes=3)
])
self.add(nn)
在上面的代码中,我们创建一个NeuralNetwork
对象并向其传递一个层列表。对于每个前馈层,我们指定节点数。ManimML 会自动将各个层拼凑成一个神经网络。我们调用self.add(nn)
场景方法的主体construct
,以便将神经网络添加到场景中。
大多数 ManimML 神经网络对象和函数可以直接从 导入manim_ml.neural_network
。
我们现在可以通过运行以下命令来渲染场景的静止帧图像:
$ manim -pql example.py
2.3 前向传球动画
我们可以通过使用该方法创建动画来自动渲染神经网络的前向传递neural_network.make_forward_pass_animation
,并使用在我们的场景中播放动画self.play(animation)
。
from manim_ml.neural_network import NeuralNetwork, FeedForwardLayer
# Make the neural network
nn = NeuralNetwork([
FeedForwardLayer(num_nodes=3),
FeedForwardLayer(num_nodes=5),
FeedForwardLayer(num_nodes=3)
])
self.add(nn)
# Make the animation
forward_pass_animation = nn.make_forward_pass_animation()
# Play the animation
self.play(forward_pass_animation)
我们现在可以使用以下方式进行渲染:
$ manim -pql example.py
2.4 卷积神经网络
ManimML 支持卷积神经网络的可视化。您可以按如下方式指定特征图的数量、特征图大小和过滤器大小Convolutional2DLayer(num_feature_maps, feature_map_size, filter_size)
。我们还可以更改许多其他样式参数(文档即将发布)。
这是一个多层卷积神经网络。如果您不熟悉卷积网络,这篇概述是一个很好的资源。此外,CNN Explainer是一个很棒的交互式工具,可用于在浏览器中了解 CNN。
在指定 CNN 时,相邻层的特征图大小和过滤器尺寸匹配非常重要。
from manim_ml.neural_network import NeuralNetwork, FeedForwardLayer, Convolutional2DLayer
nn = NeuralNetwork([
Convolutional2DLayer(1, 7, 3, filter_spacing=0.32), # Note the default stride is 1.
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()
我们现在可以使用以下方式进行渲染:
$ manim -pql example.py
现在我们就得到了一个卷积神经网络。
2.5 带有图像的卷积神经网络
ImageLayer
我们还可以通过在第一个卷积层之前指定来为输入卷积神经网络的图像制作动画。
import numpy as np
from PIL import Image
from manim_ml.neural_network import NeuralNetwork, FeedForwardLayer, Convolutional2DLayer, ImageLayer
image = Image.open("digit.jpeg") # You will need to download an image of a digit.
numpy_image = np.asarray(image)
nn = NeuralNetwork([
ImageLayer(numpy_image, height=1.5),
Convolutional2DLayer(1, 7, 3, filter_spacing=0.32), # Note the default stride is 1.
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()
我们现在可以使用以下方式进行渲染:
$ manim -pql example.py
2.6 最大池化
深度学习中常见的操作是 2D Max Pooling 操作,它可以减小卷积特征图的大小。我们可以使用 来可视化最大池化MaxPooling2DLayer
。
from manim_ml.neural_network import NeuralNetwork, Convolutional2DLayer, MaxPooling2DLayer
# Make neural network
nn = NeuralNetwork([
Convolutional2DLayer(1, 8),
Convolutional2DLayer(3, 6, 3),
MaxPooling2DLayer(kernel_size=2),
Convolutional2DLayer(5, 2, 2),
],
layer_spacing=0.25,
)
# Center the nn
nn.move_to(ORIGIN)
self.add(nn)
# Play animation
forward_pass = nn.make_forward_pass_animation()
self.wait(1)
self.play(forward_pass)
我们现在可以使用以下方式进行渲染:
$ manim -pql example.py
2.7 激活函数
激活函数将非线性应用于神经网络的输出。它们具有不同的形状,能够可视化这些函数很有用。我通过传递参数添加了可视化激活函数的功能FeedForwardLayer
,如下所示:Convolutional2DLayer
layer = FeedForwardLayer(num_nodes=3, activation_function="ReLU")
我们可以将它们添加到更大的神经网络中,如下所示:
from manim_ml.neural_network import NeuralNetwork, Convolutional2DLayer, FeedForwardLayer
# Make nn
nn = NeuralNetwork([
Convolutional2DLayer(1, 7, filter_spacing=0.32),
Convolutional2DLayer(3, 5, 3, filter_spacing=0.32, activation_function="ReLU"),
FeedForwardLayer(3, activation_function="Sigmoid"),
],
layer_spacing=0.25,
)
self.add(nn)
# Play animation
forward_pass = nn.make_forward_pass_animation()
self.play(forward_pass)
我们现在可以使用以下方式进行渲染:
$ manim -pql example.py
更复杂的动画:神经网络 Dropout
from manim_ml.neural_network import NeuralNetwork, FeedForwardLayer
from manim_ml.neural_network.animations.dropout import make_neural_network_dropout_animation
# Make nn
nn = NeuralNetwork([
FeedForwardLayer(3),
FeedForwardLayer(5),
FeedForwardLayer(3),
FeedForwardLayer(5),
FeedForwardLayer(4),
],
layer_spacing=0.4,
)
# Center the nn
nn.move_to(ORIGIN)
self.add(nn)
# Play animation
self.play(
make_neural_network_dropout_animation(
nn, dropout_rate=0.25, do_forward_pass=True
)
)
self.wait(1)
我们现在可以使用以下方式进行渲染:
$ manim -pql example.py