You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于社区版Manim修复深度神经网络动画及代码展示异常问题

问题解决:Manim实现DNN动画+语法高亮代码展示

问题背景

使用社区版Manim制作深度神经网络(DNN)动画,同时在旁侧展示对应Python代码,但当前实现存在画面变形、文本超出屏幕、无语法高亮等问题,需修改代码还原参考图的展示效果。

初始问题代码

from manim import *
from manim_ml.neural_network.layers import FeedForwardLayer
from manim_ml.neural_network.neural_network import NeuralNetwork

config.pixel_height = 900
config.pixel_width = 1400
config.frame_height = 7.0
config.frame_width = 7.0

NN_text ="""
import keras
from keras.models import Sequential
from keras. layers import Dense
model = Sequential ()
n_cols = concrete_data. shape [1]
model. add (Dense (5, activation='relu',
model. add (Dense(5, activations' reluj, input_shape=(n_ (cols, )))
model.add(Dense (1))
model. compile (optimizer='adam', loss='mean_squared_error')
model.fit (predictors, target)
predictions = model.predict(test_data)
"""

class NeuralNetworkScene(Scene):
    """Test Scene for the Neural Network"""
    def construct(self):

        # Make the text
        desc = Text(NN_text,font_size=7)
        desc=desc.next_to(ORIGIN)
    
        # Make the Layer object
        layers = [FeedForwardLayer(8), FeedForwardLayer(5), FeedForwardLayer(5),FeedForwardLayer(1)]
        nn = NeuralNetwork(layers)
        nn.scale(1)
        nn.move_to(LEFT)
        # Make Animation
        self.add(nn)

        first_layer = Text("Input Layer", font_size=7)
        first_layer=first_layer.next_to(layers[0].get_corner(DOWN),DOWN)
        self.add(first_layer)

        hidden_layer = Text("Hidden Layer", font_size=7)
        hidden_layer=hidden_layer.next_to(nn.get_corner(DOWN),DOWN)
        self.add(hidden_layer)

        output_layer = Text("Output Layer", font_size=7)
        location_output = layers[3].get_corner(DOWN)
        location_output[1] = layers[0].get_corner(DOWN)[1]
        output_layer=output_layer.next_to(location_output,DOWN)
        self.add(output_layer)

        # self.play(Create(nn))
        forward_propagation_animation = nn.make_forward_pass_animation(
            run_time=5, passing_flash=True
        )
        self.play(FadeIn(desc),forward_propagation_animation)

修改后的代码

from manim import *
from manim_ml.neural_network.layers import FeedForwardLayer
from manim_ml.neural_network.neural_network import NeuralNetwork

# 修正画布配置,保持宽高比匹配像素尺寸,避免画面变形
config.pixel_height = 900
config.pixel_width = 1400
config.frame_height = 9.0
config.frame_width = 14.0  # 9/14 ≈ 900/1400,比例一致

# 修正示例代码中的语法错误,保证代码合法性
NN_code = """
import keras
from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
n_cols = concrete_data.shape[1]
model.add(Dense(5, activation='relu', input_shape=(n_cols,)))
model.add(Dense(5, activation='relu'))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(predictors, target)
predictions = model.predict(test_data)
"""

class NeuralNetworkScene(Scene):
    """DNN动画与代码展示场景"""
    def construct(self):
        # 创建神经网络并布局到左侧区域
        layers = [FeedForwardLayer(8), FeedForwardLayer(5), FeedForwardLayer(5), FeedForwardLayer(1)]
        nn = NeuralNetwork(layers)
        nn.scale(0.8)
        nn.move_to(LEFT * 4)
        self.add(nn)

        # 添加层标注文本,调整大小与位置避免重叠
        label_font_size = 20
        input_label = Text("Input Layer", font_size=label_font_size)
        input_label.next_to(layers[0], DOWN, buff=0.3)
        self.add(input_label)

        hidden_label = Text("Hidden Layers", font_size=label_font_size)
        hidden_label.next_to(nn.get_center(), DOWN, buff=0.5)
        self.add(hidden_label)

        output_label = Text("Output Layer", font_size=label_font_size)
        output_label.next_to(layers[-1], DOWN, buff=0.3)
        self.add(output_label)

        # 创建带语法高亮的代码块,布局到右侧区域
        code_block = Code(
            code=NN_code,
            tab_width=4,
            background="window",
            language="Python",
            font_size=18,
            line_spacing=1.2
        )
        code_block.move_to(RIGHT * 3)
        self.add(code_block)

        # 优化动画流程:先显示静态元素,再执行前向传播动画
        self.play(
            FadeIn(nn),
            FadeIn(input_label, hidden_label, output_label),
            FadeIn(code_block),
            run_time=1.5
        )
        forward_anim = nn.make_forward_pass_animation(run_time=5, passing_flash=True)
        self.play(forward_anim)

关键修改说明

  • 画布比例修正:调整frame_height和frame_width与像素尺寸比例一致,彻底解决画面变形问题。
  • 语法高亮实现:用Manim内置Code组件替代Text,自动实现Python语法高亮,同时支持代码格式化。
  • 示例代码修复:修正原代码中的括号不匹配、拼写错误、缩进问题,保证代码的合法性与可读性。
  • 布局优化:将神经网络固定在左侧,代码块放在右侧,通过缩放和位置调整避免元素超出屏幕;层标注文本调整字体大小和位置,避免重叠。
  • 动画逻辑优化:先统一显示所有静态元素,再执行前向传播动画,视觉流程更清晰自然。

内容的提问来源于stack exchange,提问作者CSe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:05:21