继承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函数被调用时立即发生。