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类)来管理其中使用的参数。本步骤的主要任务已经完成了。在本步骤的最后,我们来实现一个更通用的神经网络模型。