继承block类,来构造新的模型,
sequential也是继承的block类,我们一般用sequential()
用继承block来自己构造的原因是,很灵活。

class NestMLP(nn.Block):
    def __init__(self, **kwargs):
        super(NestMLP, self).__init__(**kwargs)
        self.net=nn.Sequential()
        self.net.add(nn.Dense(64, activation='relu'), nn.Dense(32, activation='relu'))
        self.dense=nn.Dense(16, activation='relu')
    def forward(self, x):
        return self.dense(self.net(x))
net=nn.Sequential()
net.add(NestMLP(), nn.Dense(20), FancyMLP())
net.initialize()
net(X)

初始化:

from mxnet import init, nd
from mxnet.gluon import nn
net=nn.Sequential()
net.add(nn.Dense(256, activation='relu'))
net.add(nn.Dense(10))
net.initialize()  #要先初始化

X=nd.random.uniform(shape=(2,20))
Y=net(X)
print(X)

定义网络,从输入,通过网络,得到输出的过程。

避免延后初始化
如果系统在调用initialize函数时能够知道所有参数的形状,那么延后初始化就不会发生。我们在这里分别介绍两种这样的情况。
第一种情况是我们要对已初始化的模型重新初始化时。因为参数形状不会发生变化,所以系统能够立即进行重新初始化。
第二种情况是我们在创建层的时候指定了它的输入个数,使系统不需要额外的信息来推测参数形状。下例中我们通过in_units来指定每个全连接层的输入个数,使初始化能够在initialize函数被调用时立即发生。