ManimML
ManimML是一个专注于使用Manim社区库提供常见机器学习概念动画和可视化的项目。请查看我们的论文。我们希望这个项目成为一个基本可视化的集合,可以轻松组合以创建复杂机器学习概念的视频。此外,我们希望提供一套抽象,让用户能够专注于解释而不是软件工程。
一个预览...
目录
入门
安装
首先你需要安装manim。确保安装的是Manim社区版,而不是原始的3Blue1Brown Manim版本。
然后从源代码安装包或使用pip install manim_ml
。注意:某些最新功能可能只有从源代码安装才能使用。
第一个神经网络
这是一个卷积神经网络的可视化。生成这个可视化所需的代码如下所示。
from manim import *
from manim_ml.neural_network import Convolutional2DLayer, FeedForwardLayer, NeuralNetwork
# 这会改变我们渲染视频的分辨率
config.pixel_height = 700
config.pixel_width = 1900
config.frame_height = 7.0
config.frame_width = 7.0
# 这里我们定义了基本场景
class BasicScene(ThreeDScene):
# 生成场景的代码在这里
def construct(self):
# 创建神经网络
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,
)
# 将神经网络居中
nn.move_to(ORIGIN)
self.add(nn)
# 创建前向传播动画
forward_pass = nn.make_forward_pass_animation()
# 播放动画
self.play(forward_pass)
你可以将上述代码复制到名为example.py
的文件中,然后在命令行中运行以下命令(假设一切安装正确)来生成上面的视频:
$ manim -pql example.py
上述命令生成低分辨率的渲染,你可以通过运行以下命令来提高分辨率(但会降低渲染速度):
$ manim -pqh example.py
指南
这是一个更深入的指南,展示如何使用ManimML的各种功能(注意:ManimML仍在开发中,某些功能可能会变化,文档也还不完善)。
设置场景
在Manim中,所有的可视化和动画都属于一个Scene
。你可以通过扩展Scene
类或ThreeDScene
类(如果你的动画包含3D内容,就像我们的示例一样)来创建一个场景。将以下代码添加到名为example.py
的Python模块中。
from manim import *
# 在这里导入模块
class BasicScene(ThreeDScene):
def construct(self):
# 你的代码放在这里
text = Text("你的第一个场景!")
self.add(text)
为了渲染场景,我们将在命令行中运行以下命令:
$ manim -pq -l example.py
这将生成一个低质量的图像文件(使用-h
可以生成高质量图像)。
在本教程的剩余部分,代码片段需要复制到construct
函数的主体中。
简单前馈网络
使用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会自动将单个层组合成一个完整的神经网络。我们在场景的construct
方法主体中调用self.add(nn)
,以将神经网络添加到场景中。
大多数ManimML神经网络对象和函数可以直接从manim_ml.neural_network
导入。
现在我们可以通过运行以下命令来渲染场景的静态图像:
$ manim -pql example.py
前向传播动画
我们可以通过使用neural_network.make_forward_pass_animation
方法创建动画,并在场景中使用self.play(animation)
播放动画,来自动渲染神经网络的前向传播。
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)
# 创建动画
forward_pass_animation = nn.make_forward_pass_animation()
# 播放动画
self.play(forward_pass_animation)
现在我们可以通过以下命令进行渲染:
$ manim -pql example.py
卷积神经网络
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), # 注意默认步长为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,
)
# 将神经网络居中
nn.move_to(ORIGIN)
self.add(nn)
# 创建前向传播动画
forward_pass = nn.make_forward_pass_animation()
现在我们可以通过以下命令进行渲染:
$ manim -pql example.py
这就是一个卷积神经网络。
带图像的卷积神经网络
我们还可以通过在第一个卷积层之前指定一个ImageLayer
来制作图像输入卷积神经网络的动画。
import numpy as np
from PIL import Image
from manim_ml.neural_network import NeuralNetwork, FeedForwardLayer, Convolutional2DLayer, ImageLayer
image = Image.open("digit.jpeg") # 你需要下载一个数字图像
numpy_image = np.asarray(image)
nn = NeuralNetwork([
ImageLayer(numpy_image, height=1.5),
Convolutional2DLayer(1, 7, 3, filter_spacing=0.32), # 注意默认步长为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,
)
# 将神经网络居中
nn.move_to(ORIGIN)
self.add(nn)
# 创建前向传播动画
forward_pass = nn.make_forward_pass_animation()
现在我们可以用以下命令渲染:
$ manim -pql example.py
最大池化
深度学习中常见的操作是2D最大池化,它可以减小卷积特征图的大小。我们可以使用MaxPooling2DLayer
来可视化最大池化。
from manim_ml.neural_network import NeuralNetwork, Convolutional2DLayer, MaxPooling2DLayer
# 创建神经网络
nn = NeuralNetwork([
Convolutional2DLayer(1, 8),
Convolutional2DLayer(3, 6, 3),
MaxPooling2DLayer(kernel_size=2),
Convolutional2DLayer(5, 2, 2),
],
layer_spacing=0.25,
)
# 将神经网络居中
nn.move_to(ORIGIN)
self.add(nn)
# 播放动画
forward_pass = nn.make_forward_pass_animation()
self.wait(1)
self.play(forward_pass)
现在我们可以用以下命令渲染:
$ manim -pql example.py
激活函数
激活函数为神经网络的输出添加非线性。它们有不同的形状,能够可视化这些函数很有用。我通过传递参数,为FeedForwardLayer
和Convolutional2DLayer
添加了可视化激活函数的功能,如下所示:
layer = FeedForwardLayer(num_nodes=3, activation_function="ReLU")
我们可以将这些添加到更大的神经网络中,如下所示:
from manim_ml.neural_network import NeuralNetwork, Convolutional2DLayer, FeedForwardLayer
# 创建神经网络
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)
# 播放动画
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
# 创建神经网络
nn = NeuralNetwork([
FeedForwardLayer(3),
FeedForwardLayer(5),
FeedForwardLayer(3),
FeedForwardLayer(5),
FeedForwardLayer(4),
],
layer_spacing=0.4,
)
# 将神经网络居中
nn.move_to(ORIGIN)
self.add(nn)
# 播放动画
self.play(
make_neural_network_dropout_animation(
nn, dropout_rate=0.25, do_forward_pass=True
)
)
self.wait(1)
现在我们可以用以下命令渲染:
$ manim -pql example.py
引用
如果你觉得 ManimML 有用,请引用以下内容!
@misc{helbling2023manimml,
title={ManimML: Communicating Machine Learning Architectures with Animation},
author={Alec Helbling and Duen Horng and Chau},
year={2023},
eprint={2306.17108},
archivePrefix={arXiv},
primaryClass={cs.LG}
}