mirror of
https://github.com/3b1b/manim.git
synced 2025-08-05 16:49:03 +00:00
More WalkThroughTwoExample progress in nn/part3
This commit is contained in:
parent
f15f5d153e
commit
24d6c7bbef
1 changed files with 146 additions and 13 deletions
159
nn/part3.py
159
nn/part3.py
|
@ -559,6 +559,10 @@ class WalkThroughTwoExample(ShowAveragingCost):
|
||||||
self.three_ways_to_increase()
|
self.three_ways_to_increase()
|
||||||
self.note_connections_to_brightest_neurons()
|
self.note_connections_to_brightest_neurons()
|
||||||
self.fire_together_wire_together()
|
self.fire_together_wire_together()
|
||||||
|
self.show_desired_increase_to_previous_neurons()
|
||||||
|
self.only_keeping_track_of_changes()
|
||||||
|
self.show_other_output_neurons()
|
||||||
|
self.show_recursion()
|
||||||
|
|
||||||
def show_single_example(self):
|
def show_single_example(self):
|
||||||
two_vect = get_organized_images()[2][0]
|
two_vect = get_organized_images()[2][0]
|
||||||
|
@ -867,7 +871,7 @@ class WalkThroughTwoExample(ShowAveragingCost):
|
||||||
increase_words = VGroup(
|
increase_words = VGroup(
|
||||||
TextMobject("Increase", "$b$"),
|
TextMobject("Increase", "$b$"),
|
||||||
TextMobject("Increase", "$w_i$"),
|
TextMobject("Increase", "$w_i$"),
|
||||||
TextMobject("Increase", "$a_i$"),
|
TextMobject("Change", "$a_i$"),
|
||||||
)
|
)
|
||||||
for words in increase_words:
|
for words in increase_words:
|
||||||
words.highlight_by_tex_to_color_map({
|
words.highlight_by_tex_to_color_map({
|
||||||
|
@ -962,10 +966,11 @@ class WalkThroughTwoExample(ShowAveragingCost):
|
||||||
two_decimal = self.two_decimal
|
two_decimal = self.two_decimal
|
||||||
two_activation = two_decimal.number
|
two_activation = two_decimal.number
|
||||||
|
|
||||||
edge_animation = LaggedStart(
|
def get_edge_animation():
|
||||||
ShowCreationThenDestruction, bright_edges,
|
return LaggedStart(
|
||||||
lag_ratio = 0.7
|
ShowCreationThenDestruction, bright_edges,
|
||||||
)
|
lag_ratio = 0.7
|
||||||
|
)
|
||||||
neuron_arrows = VGroup(*[
|
neuron_arrows = VGroup(*[
|
||||||
Vector(MED_LARGE_BUFF*RIGHT).next_to(n, LEFT)
|
Vector(MED_LARGE_BUFF*RIGHT).next_to(n, LEFT)
|
||||||
for n in bright_neurons
|
for n in bright_neurons
|
||||||
|
@ -979,9 +984,11 @@ class WalkThroughTwoExample(ShowAveragingCost):
|
||||||
))
|
))
|
||||||
two_neuron_rect = SurroundingRectangle(two_neuron)
|
two_neuron_rect = SurroundingRectangle(two_neuron)
|
||||||
seeing_words = TextMobject("Seeing a 2")
|
seeing_words = TextMobject("Seeing a 2")
|
||||||
|
seeing_words.scale(0.8)
|
||||||
thinking_words = TextMobject("Thinking about a 2")
|
thinking_words = TextMobject("Thinking about a 2")
|
||||||
|
thinking_words.scale(0.8)
|
||||||
seeing_words.next_to(neuron_rects, UP)
|
seeing_words.next_to(neuron_rects, UP)
|
||||||
thinking_words.next_to(two_neuron_rect, UP, aligned_edge = LEFT)
|
thinking_words.next_to(two_neuron_arrow, RIGHT)
|
||||||
|
|
||||||
morty = Mortimer()
|
morty = Mortimer()
|
||||||
morty.scale(0.8)
|
morty.scale(0.8)
|
||||||
|
@ -993,7 +1000,6 @@ class WalkThroughTwoExample(ShowAveragingCost):
|
||||||
""")
|
""")
|
||||||
words.to_edge(RIGHT)
|
words.to_edge(RIGHT)
|
||||||
|
|
||||||
self.revert_to_original_skipping_status()
|
|
||||||
self.play(FadeIn(morty))
|
self.play(FadeIn(morty))
|
||||||
self.play(
|
self.play(
|
||||||
Write(words),
|
Write(words),
|
||||||
|
@ -1001,20 +1007,20 @@ class WalkThroughTwoExample(ShowAveragingCost):
|
||||||
)
|
)
|
||||||
self.play(Blink(morty))
|
self.play(Blink(morty))
|
||||||
self.play(
|
self.play(
|
||||||
edge_animation,
|
get_edge_animation(),
|
||||||
morty.change, "pondering", bright_edges
|
morty.change, "pondering", bright_edges
|
||||||
)
|
)
|
||||||
self.play(edge_animation)
|
self.play(get_edge_animation())
|
||||||
self.play(
|
self.play(
|
||||||
LaggedStart(GrowArrow, neuron_arrows),
|
LaggedStart(GrowArrow, neuron_arrows),
|
||||||
edge_animation,
|
get_edge_animation(),
|
||||||
)
|
)
|
||||||
self.play(
|
self.play(
|
||||||
GrowArrow(two_neuron_arrow),
|
GrowArrow(two_neuron_arrow),
|
||||||
morty.change, "raise_right_hand", two_neuron
|
morty.change, "raise_right_hand", two_neuron
|
||||||
)
|
)
|
||||||
self.play(
|
self.play(
|
||||||
ApplyMethod(two_neuron.set_fill, WHITE, 1, **kwargs),
|
ApplyMethod(two_neuron.set_fill, WHITE, 1),
|
||||||
ChangingDecimal(
|
ChangingDecimal(
|
||||||
two_decimal,
|
two_decimal,
|
||||||
lambda a : interpolate(two_activation, 1, a),
|
lambda a : interpolate(two_activation, 1, a),
|
||||||
|
@ -1024,7 +1030,8 @@ class WalkThroughTwoExample(ShowAveragingCost):
|
||||||
two_decimal,
|
two_decimal,
|
||||||
lambda m : m.highlight(WHITE if m.number < 0.8 else BLACK),
|
lambda m : m.highlight(WHITE if m.number < 0.8 else BLACK),
|
||||||
),
|
),
|
||||||
ShowCreation(bright_edges),
|
LaggedStart(ShowCreation, bright_edges),
|
||||||
|
run_time = 2,
|
||||||
)
|
)
|
||||||
self.dither()
|
self.dither()
|
||||||
self.play(
|
self.play(
|
||||||
|
@ -1032,6 +1039,7 @@ class WalkThroughTwoExample(ShowAveragingCost):
|
||||||
Write(seeing_words, run_time = 2),
|
Write(seeing_words, run_time = 2),
|
||||||
morty.change, "thinking", seeing_words
|
morty.change, "thinking", seeing_words
|
||||||
)
|
)
|
||||||
|
self.dither()
|
||||||
self.play(
|
self.play(
|
||||||
ShowCreation(two_neuron_rect),
|
ShowCreation(two_neuron_rect),
|
||||||
Write(thinking_words, run_time = 2),
|
Write(thinking_words, run_time = 2),
|
||||||
|
@ -1041,8 +1049,133 @@ class WalkThroughTwoExample(ShowAveragingCost):
|
||||||
self.play(LaggedStart(FadeOut, VGroup(
|
self.play(LaggedStart(FadeOut, VGroup(
|
||||||
neuron_rects, two_neuron_rect,
|
neuron_rects, two_neuron_rect,
|
||||||
seeing_words, thinking_words,
|
seeing_words, thinking_words,
|
||||||
words, morty
|
words, morty,
|
||||||
|
neuron_arrows, two_neuron_arrow,
|
||||||
|
bright_edges, bright_neurons,
|
||||||
)))
|
)))
|
||||||
|
self.play(
|
||||||
|
ApplyMethod(two_neuron.set_fill, WHITE, two_activation),
|
||||||
|
ChangingDecimal(
|
||||||
|
two_decimal,
|
||||||
|
lambda a : interpolate(1, two_activation, a),
|
||||||
|
num_decimal_points = 1,
|
||||||
|
),
|
||||||
|
UpdateFromFunc(
|
||||||
|
two_decimal,
|
||||||
|
lambda m : m.highlight(WHITE if m.number < 0.8 else BLACK),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
def show_desired_increase_to_previous_neurons(self):
|
||||||
|
increase_words = self.increase_words
|
||||||
|
two_neuron = self.two_neuron
|
||||||
|
edges = two_neuron.edges_in
|
||||||
|
prev_neurons = self.network_mob.layers[-2].neurons
|
||||||
|
|
||||||
|
positive_arrows = VGroup()
|
||||||
|
negative_arrows = VGroup()
|
||||||
|
positive_edges = VGroup()
|
||||||
|
negative_edges = VGroup()
|
||||||
|
positive_neurons = VGroup()
|
||||||
|
negative_neurons = VGroup()
|
||||||
|
for neuron, edge in zip(prev_neurons, edges):
|
||||||
|
value = edge.get_stroke_width()
|
||||||
|
if Color(edge.get_stroke_color()) == Color(self.negative_edge_color):
|
||||||
|
value *= -1
|
||||||
|
arrow = Vector(0.25*value*UP, color = edge.get_color())
|
||||||
|
arrow.stretch_to_fit_height(neuron.get_height())
|
||||||
|
arrow.move_to(neuron.get_left())
|
||||||
|
arrow.shift(SMALL_BUFF*LEFT)
|
||||||
|
if value > 0:
|
||||||
|
positive_arrows.add(arrow)
|
||||||
|
positive_edges.add(edge)
|
||||||
|
positive_neurons.add(neuron)
|
||||||
|
else:
|
||||||
|
negative_arrows.add(arrow)
|
||||||
|
negative_edges.add(edge)
|
||||||
|
negative_neurons.add(neuron)
|
||||||
|
|
||||||
|
added_words = TextMobject("in proportion to $w_i$")
|
||||||
|
added_words.highlight(self.w_terms.get_color())
|
||||||
|
added_words.next_to(
|
||||||
|
increase_words[-1], DOWN,
|
||||||
|
SMALL_BUFF, aligned_edge = LEFT
|
||||||
|
)
|
||||||
|
|
||||||
|
self.play(LaggedStart(
|
||||||
|
ApplyFunction, prev_neurons,
|
||||||
|
lambda neuron : (
|
||||||
|
lambda m : m.scale_in_place(0.5).highlight(YELLOW),
|
||||||
|
neuron
|
||||||
|
),
|
||||||
|
rate_func = wiggle
|
||||||
|
))
|
||||||
|
self.dither()
|
||||||
|
for positive in [True, False]:
|
||||||
|
if positive:
|
||||||
|
arrows = positive_arrows
|
||||||
|
edges = positive_edges
|
||||||
|
neurons = positive_neurons
|
||||||
|
color = self.positive_edge_color
|
||||||
|
else:
|
||||||
|
arrows = negative_arrows
|
||||||
|
edges = negative_edges
|
||||||
|
neurons = negative_neurons
|
||||||
|
color = self.negative_edge_color
|
||||||
|
self.play(
|
||||||
|
LaggedStart(
|
||||||
|
Transform, edges,
|
||||||
|
lambda mob : (
|
||||||
|
mob,
|
||||||
|
Dot(
|
||||||
|
mob.get_center(),
|
||||||
|
stroke_color = edges[0].get_color(),
|
||||||
|
stroke_width = 1,
|
||||||
|
radius = 0.25*SMALL_BUFF,
|
||||||
|
fill_opacity = 0
|
||||||
|
)
|
||||||
|
),
|
||||||
|
rate_func = there_and_back
|
||||||
|
),
|
||||||
|
neurons.set_stroke, color, 3,
|
||||||
|
)
|
||||||
|
self.play(
|
||||||
|
LaggedStart(GrowArrow, arrows),
|
||||||
|
ApplyMethod(
|
||||||
|
neurons.set_fill, color, 1,
|
||||||
|
rate_func = there_and_back,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.dither()
|
||||||
|
self.play(Write(added_words, run_time = 1))
|
||||||
|
|
||||||
|
self.set_variables_as_attrs(
|
||||||
|
in_proportion_to_w = added_words,
|
||||||
|
prev_neuron_arrows = VGroup(positive_arrows, negative_arrows),
|
||||||
|
)
|
||||||
|
|
||||||
|
def only_keeping_track_of_changes(self):
|
||||||
|
arrows = self.prev_neuron_arrows
|
||||||
|
prev_neurons = self.network_mob.layers[-2].neurons
|
||||||
|
rect = SurroundingRectangle(VGroup(arrows, prev_neurons))
|
||||||
|
|
||||||
|
words = TextMobject("No direct influence")
|
||||||
|
words.next_to(rect, UP)
|
||||||
|
|
||||||
|
self.revert_to_original_skipping_status()
|
||||||
|
self.play(ShowCreation(rect))
|
||||||
|
self.play(Write(words))
|
||||||
|
self.dither()
|
||||||
|
self.play(FadeOut(VGroup(words, rect)))
|
||||||
|
|
||||||
|
def show_other_output_neurons(self):
|
||||||
|
two_neuron = self.two_neuron
|
||||||
|
two_decimal = self.two_decimal
|
||||||
|
two_edges = two_neuron.edges_in
|
||||||
|
|
||||||
|
|
||||||
|
def show_recursion(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue