https://d2l.ai/chapter_builders-guide/model-construction.html
To Q1, If changing MySequential
to store blocks in a Python list, I got warning when call net.initialize()
:
UserWarning: “MySequential.blocklist” is an unregistered container with Blocks. Note that Blocks inside the list, tuple or dict will not be registered automatically. Make sure to register them using register_child() or switching to nn.Sequential/nn.HybridSequential instead.
Looks like the “list of blocks” is unregistered container and cannot be registered automatically. And the warning suggest that we can register_child
manually. Following that, we can then get the same result as using the _children
dictionary.
Here is the code:
class MySequential(nn.Block):
def __init__(self, **kwargs):
self.blocklist = []
super().__init__(**kwargs)
def add(self, block):
self.blocklist = self.blocklist + [block] # Change to list
self.register_child(block, block.name) # To fix issue: manually register child
print(self.blocklist)
def forward(self, x):
for block in self.blocklist:
x = block(x)
return x
1 Like
- What kinds of problems will occur if you change MySequential to store blocks in a Python
list?
My answer -> list can contain not unique object, casing problems in forward passing