45.4_MLP类
45.4 MLP类
刚才我们实现了一个由两个全连接层组成的模型。定义模型的代码摘录如下。
steps/step45.py
class TwoLayerNet(Model): def __init__(self, hidden_size, out_size): super().__init__(self.l1 = L.Linear(hidden_size) self.l2 = L.Linear(out_size) def forward(self, x): y = F.sigmoid(self.l1(x)) y = self.l2(y) return y上面的代码在1个类中实现了2层网络。考虑到今后的扩展,我们来实现一个更通用的全连接层的网络。代码如下所示。
dezero/models.py
importdezero-functionsasF
importdezero.layersasL
classMLP(Model): def__init__(self,fc_output_sizes,activation $\equiv$ F.sigmoid): super().__init_() self.activation $=$ activation self.layers $= []$ fori,out_sizein enumerate(fc_output_sizes): layer $=$ L.Linear(out_size) setattr(self,'l' $^+$ str(i),layer) self.layers.append(layer) defforward(self,x): forlinself.layers[-1]: x $=$ self.activation(l(x)) return self.layers[-1](x)下面简单介绍一下这段代码。首先在初始化操作中接收fc_output_sizes参数和activation参数。这里的fc是full connect(全连接)的缩写。fc_output_sizes可以是元组或列表,用于指定全连接层的输出大小。例如,(10, 1)表示创建2个Linear层,第1层的输出大小为10,第2层的输出大小为1。(10, 10, 1)则表示再创建一个Linear层。另外,activation用来指定激活函数(默认为F.sigmoid函数)。

这里以MLP为类名来实现模型。MLP是Multi-Layer Perceptron的缩写,意思是多层感知器。MLP是全连接层神经网络的别名。
MLP类是前面的TwoLayerNet类经过自然扩展后得到的类。需要注意,这里使用setattr函数来设置实例变量。之所以使用该函数,是因为我们不能使用self.l2 = ...这样的代码进行设置。另外,DeZero通过将层设置为模型的实例变量来对层的参数进行管理。
MLP类的介绍到此结束。有了MLP类,我们可以轻松实现下面的 层网络。
model $=$ MLP((10,1)) #2层 model $=$ MLP((10,20,30,40,1)) #5层今后我们也将使用这个通用的MLP类。这里我们把MLP类的代码添加到dezero/models.py中。以上就是本步骤的内容。
步骤46
通过Optimizer更新参数
我们此前使用了梯度下降法来更新参数。在深度学习领域,除了梯度下降法,人们还提出了各种优化方法。在本步骤,我们会把参数的更新工作(用于更新的代码)模块化,并创建一个能轻松更换优化方法的机制。