45.2_Model 类

45.2 Model类

模型或model这种词语已经在前面出现很多次了。模型这个词有“抽象描述事物本质的结构或系统”的意思,机器学习中使用的模型就是如此。它用式子抽象描述潜藏着复杂模式或规则的现象。神经网络也是通过式子表示的函数,我们用模型指代它。

我们要为模型创建一个新的类Model。这个Model类与Layer类具有相同的功能。我们还会增加一个用于可视化操作的方法,代码如下所示(这些代码会添加到dezero/models.py中)。

dezero/models.py

fromdezero import Layer   
fromdezero importutils   
class Model(Layer): def plot(self,\*inputs,to_file  $\equiv$  'model.png'): y  $=$  self.forward(*inputs) returnutils.plotDOT_graph(y,verbose=True,to_file  $\equiv$  to_file)

如代码所示,Model继承于Layer。因此,Model类的使用方法与我们此前看到的Layer类的使用方法相同。例如,我们可以编写class TwoLayerNet(Model):这样的代码。另外,Model类中增加了一个用于可视化操作的plot方法。该

方法将 *inputs参数中传来的数据传给 forward 方法进行计算,然后将创建的计算图导出为图像文件。将 utils.plot_DOT_graph 函数的参数设置为 verbose=True 后,ndarray 实例的形状和类型也会显示在计算图中。

最后,为了简化Model类的导入操作,在dezero/init.py中添加下面一行代码。

fromdezero.modelsimportModel

于是,我们就可以写出下面这样的代码。

import numpy as np   
fromdezero import Variable,Model   
importdezero.layers as L   
importdezero-functions as F   
class TwoLayerNet(Model): def__init__(self,hidden_size,out_size): super().__init_( self.l1  $=$  L.Linear(hiden_size) self.l2  $=$  L.Linear(out_size) def forward(self,x): y  $=$  F.sigmoid(self.l1(x)) y  $=$  self.l2(y) return y   
 $\mathbf{x} =$  Variable(np.random.randint(5,10),name  $\equiv$  'x') model  $=$  TwoLayerNet(100,10) model.plot(x)

如上面的代码所示,Model类的使用方法与我们此前看到的Layer类的使用方法相同。而且,它有一个用于将计算图可视化的方法。执行上面的代码可以得到图45-2这样的计算图。


图45-2 TwoLayerNet的计算图