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的计算图