Refactored parameters for Convolutional2D to make them clearner looking.

This commit is contained in:
Alec Helbling
2023-01-15 18:16:48 +09:00
parent 27523ad337
commit 5291d9db8a
6 changed files with 34 additions and 36 deletions

View File

@ -21,9 +21,9 @@ def make_code_snippet():
# Make nn # Make nn
nn = NeuralNetwork([ nn = NeuralNetwork([
ImageLayer(numpy_image, height=1.5), ImageLayer(numpy_image, height=1.5),
Convolutional2DLayer(1, 7, 7, 3, 3), Convolutional2DLayer(1, 7, 3),
Convolutional2DLayer(3, 5, 5, 3, 3), Convolutional2DLayer(3, 5, 3),
Convolutional2DLayer(5, 3, 3, 1, 1), Convolutional2DLayer(5, 3, 1),
FeedForwardLayer(3), FeedForwardLayer(3),
FeedForwardLayer(3), FeedForwardLayer(3),
]) ])
@ -54,9 +54,9 @@ class CombinedScene(ThreeDScene):
nn = NeuralNetwork( nn = NeuralNetwork(
[ [
ImageLayer(numpy_image, height=1.5), ImageLayer(numpy_image, height=1.5),
Convolutional2DLayer(1, 7, 7, 3, 3, filter_spacing=0.32), Convolutional2DLayer(1, 7, 3, filter_spacing=0.32),
Convolutional2DLayer(3, 5, 5, 3, 3, filter_spacing=0.32), Convolutional2DLayer(3, 5, 3, filter_spacing=0.32),
Convolutional2DLayer(5, 3, 3, 1, 1, filter_spacing=0.18), Convolutional2DLayer(5, 3, 1, filter_spacing=0.18),
FeedForwardLayer(3), FeedForwardLayer(3),
FeedForwardLayer(3), FeedForwardLayer(3),
], ],

View File

@ -52,8 +52,8 @@ class CombinedScene(ThreeDScene):
nn = NeuralNetwork( nn = NeuralNetwork(
[ [
ImageLayer(numpy_image, height=1.5), ImageLayer(numpy_image, height=1.5),
Convolutional2DLayer(1, 5, 5, 1, 1, filter_spacing=0.32), Convolutional2DLayer(1, 5, 1, filter_spacing=0.32),
Convolutional2DLayer(4, 5, 5, 1, 1, filter_spacing=0.32), Convolutional2DLayer(4, 5, 1, filter_spacing=0.32),
Convolutional2DLayer(2, 5, 5, filter_spacing=0.32), Convolutional2DLayer(2, 5, 5, filter_spacing=0.32),
], ],
layer_spacing=0.4, layer_spacing=0.4,

View File

@ -1,3 +1,4 @@
from typing import Union
import numpy as np import numpy as np
from manim import * from manim import *
@ -13,10 +14,8 @@ class Convolutional2DLayer(VGroupNeuralNetworkLayer, ThreeDLayer):
def __init__( def __init__(
self, self,
num_feature_maps, num_feature_maps,
feature_map_width, feature_map_size=None,
feature_map_height, filter_size=None,
filter_width=None,
filter_height=None,
cell_width=0.2, cell_width=0.2,
filter_spacing=0.1, filter_spacing=0.1,
color=BLUE, color=BLUE,
@ -29,11 +28,15 @@ class Convolutional2DLayer(VGroupNeuralNetworkLayer, ThreeDLayer):
): ):
super().__init__(**kwargs) super().__init__(**kwargs)
self.num_feature_maps = num_feature_maps self.num_feature_maps = num_feature_maps
self.feature_map_height = feature_map_height
self.filter_color = filter_color self.filter_color = filter_color
self.feature_map_width = feature_map_width if isinstance(feature_map_size, int):
self.filter_width = filter_width self.feature_map_size = (feature_map_size, feature_map_size)
self.filter_height = filter_height else:
self.feature_map_size = feature_map_size
if isinstance(filter_size, int):
self.filter_size = (filter_size, filter_size)
else:
self.filter_size = filter_size
self.cell_width = cell_width self.cell_width = cell_width
self.filter_spacing = filter_spacing self.filter_spacing = filter_spacing
self.color = color self.color = color
@ -66,8 +69,8 @@ class Convolutional2DLayer(VGroupNeuralNetworkLayer, ThreeDLayer):
for filter_index in range(self.num_feature_maps): for filter_index in range(self.num_feature_maps):
rectangle = GriddedRectangle( rectangle = GriddedRectangle(
color=self.color, color=self.color,
height=self.feature_map_height * self.cell_width, height=self.feature_map_size[1] * self.cell_width,
width=self.feature_map_width * self.cell_width, width=self.feature_map_size[0] * self.cell_width,
fill_color=self.color, fill_color=self.color,
fill_opacity=0.2, fill_opacity=0.2,
stroke_color=self.color, stroke_color=self.color,

View File

@ -40,8 +40,8 @@ class Filters(VGroup):
def make_input_feature_map_rectangles(self): def make_input_feature_map_rectangles(self):
rectangles = [] rectangles = []
rectangle_width = self.input_layer.filter_width * self.input_layer.cell_width rectangle_width = self.input_layer.filter_size[0] * self.input_layer.cell_width
rectangle_height = self.input_layer.filter_height * self.input_layer.cell_width rectangle_height = self.input_layer.filter_size[1] * self.input_layer.cell_width
filter_color = self.input_layer.filter_color filter_color = self.input_layer.filter_color
for index, feature_map in enumerate(self.input_layer.feature_maps): for index, feature_map in enumerate(self.input_layer.feature_maps):
@ -271,10 +271,8 @@ class Convolutional2DToConvolutional2D(ConnectiveLayer, ThreeDLayer):
) )
self.color = color self.color = color
self.filter_color = self.input_layer.filter_color self.filter_color = self.input_layer.filter_color
self.filter_width = self.input_layer.filter_width self.filter_size = self.input_layer.filter_size
self.filter_height = self.input_layer.filter_height self.feature_map_size = self.input_layer.feature_map_size
self.feature_map_width = self.input_layer.feature_map_width
self.feature_map_height = self.input_layer.feature_map_height
self.num_input_feature_maps = self.input_layer.num_feature_maps self.num_input_feature_maps = self.input_layer.num_feature_maps
self.num_output_feature_maps = self.output_layer.num_feature_maps self.num_output_feature_maps = self.output_layer.num_feature_maps
self.cell_width = self.input_layer.cell_width self.cell_width = self.input_layer.cell_width
@ -321,8 +319,8 @@ class Convolutional2DToConvolutional2D(ConnectiveLayer, ThreeDLayer):
right_shift, down_shift = self.get_rotated_shift_vectors() right_shift, down_shift = self.get_rotated_shift_vectors()
left_shift = -1 * right_shift left_shift = -1 * right_shift
# Make the animation # Make the animation
num_y_moves = int((self.feature_map_height - self.filter_height) / self.stride) num_y_moves = int((self.feature_map_size[1] - self.filter_size[1]) / self.stride)
num_x_moves = int((self.feature_map_width - self.filter_width) / self.stride) num_x_moves = int((self.feature_map_size[0] - self.filter_size[0]) / self.stride)
for y_move in range(num_y_moves): for y_move in range(num_y_moves):
# Go right num_x_moves # Go right num_x_moves
for x_move in range(num_x_moves): for x_move in range(num_x_moves):
@ -387,10 +385,10 @@ class Convolutional2DToConvolutional2D(ConnectiveLayer, ThreeDLayer):
left_shift = -1 * right_shift left_shift = -1 * right_shift
# Make the animation # Make the animation
num_y_moves = int( num_y_moves = int(
(self.feature_map_height - self.filter_height) / self.stride (self.feature_map_size[1] - self.filter_size[1]) / self.stride
) )
num_x_moves = int( num_x_moves = int(
(self.feature_map_width - self.filter_width) / self.stride (self.feature_map_size[0] - self.filter_size[0]) / self.stride
) )
for y_move in range(num_y_moves): for y_move in range(num_y_moves):
# Go right num_x_moves # Go right num_x_moves

View File

@ -6,7 +6,6 @@ from manim_ml.neural_network.layers.feed_forward import FeedForwardLayer
from manim_ml.neural_network.layers.image import ImageLayer from manim_ml.neural_network.layers.image import ImageLayer
from manim_ml.neural_network.neural_network import NeuralNetwork from manim_ml.neural_network.neural_network import NeuralNetwork
class SingleConvolutionalLayerScene(ThreeDScene): class SingleConvolutionalLayerScene(ThreeDScene):
def construct(self): def construct(self):
# Make nn # Make nn
@ -22,7 +21,6 @@ class SingleConvolutionalLayerScene(ThreeDScene):
) )
# self.play(nn.make_forward_pass_animation(run_time=5)) # self.play(nn.make_forward_pass_animation(run_time=5))
class Simple3DConvScene(ThreeDScene): class Simple3DConvScene(ThreeDScene):
def construct(self): def construct(self):
""" """
@ -36,10 +34,10 @@ class Simple3DConvScene(ThreeDScene):
# Make nn # Make nn
layers = [ layers = [
Convolutional2DLayer( Convolutional2DLayer(
1, 5, 5, 5, 5, feature_map_height=3, filter_width=3, filter_height=3 1, feature_map_size=3, filter_size=3
), ),
Convolutional2DLayer( Convolutional2DLayer(
1, 3, 3, 1, 1, feature_map_width=3, filter_width=3, filter_height=3 1, feature_map_size=3, filter_size=3
), ),
] ]
nn = NeuralNetwork(layers) nn = NeuralNetwork(layers)
@ -64,9 +62,9 @@ class CombinedScene(ThreeDScene):
nn = NeuralNetwork( nn = NeuralNetwork(
[ [
ImageLayer(numpy_image, height=1.5), ImageLayer(numpy_image, height=1.5),
Convolutional2DLayer(1, 7, 7, 3, 3, filter_spacing=0.32), Convolutional2DLayer(1, 7, 3, filter_spacing=0.32),
Convolutional2DLayer(3, 5, 5, 3, 3, filter_spacing=0.32), Convolutional2DLayer(3, 5, 3, filter_spacing=0.32),
Convolutional2DLayer(5, 3, 3, 1, 1, filter_spacing=0.18), Convolutional2DLayer(5, 3, 1, filter_spacing=0.18),
FeedForwardLayer(3), FeedForwardLayer(3),
FeedForwardLayer(3), FeedForwardLayer(3),
], ],