45.3_使用Model来解决问题

45.3 使用Model来解决问题

下面使用Model类再次解决上一个步骤已经解决的问题,即sin函数的数据集的回归。下面代码中的阴影部分是与上一个步骤中的代码不同的地方。

steps/step45.py

import numpy as np  
fromdezero import Variable,Model  
importdezero.layersasL  
importdezero-functionsasF

创建数据集

np.random.seed(0)  
x = np.random.randint(100, 1)
$y = np \cdot \sin(2 * np \cdot pi * x) + np \cdot \text{random} \cdot \text{rand}(100, 1)$

设置超参数

lr = 0.2  
max_iter = 10000  
hidden_size = 10

定义模型

class TwoLayerNet(Model): def__init__(self,hidden_size,out_size): super().__init_() self.l1  $=$  L.Linear(hiden_size) self.l2  $=$  L.Linear(out_size) defforward(self,x): y  $=$  F.sigmoid(self.l1(x)) y  $=$  self.l2(y) returny   
model  $\equiv$  TwoLayerNet(hidden_size,1)

开始训练

for i in range(max_iter): y_pred = model(x) loss  $=$  F.mean_squared_error(y,y_pred) model.cleargrads() loss.backup() for p in model.params(): p.data  $\equiv$  lr\*p.grad.data if i % 1000  $= = 0$  . print(loss)

上面的代码将神经网络实现为继承于Model类的TwoLayerNet。这样,for语句中的代码变得更加简洁。所有的参数都可以从Model中访问,重置参数的梯度也由model.cleargrads()来完成。

现在我们从管理参数的泥潭中解脱出来了。今后不管要构建多么复杂的网络,我们都可以让Model类(或Layer类)来管理其中使用的参数。本步骤的主要任务已经完成了。在本步骤的最后,我们来实现一个更通用的神经网络模型。