49.4_用于训练的代码

49.4 用于训练的代码

下面使用 Spiral 类进行训练。代码如下所示(这里省略了 Python 的导入代码,阴影部分是与上一个步骤的代码不同的部分)。

steps/step49.py

max_epoch = 300  
batch_size = 30  
hidden_size = 10  
lr = 1.0  
train_set =dezerodatasets.Spiral()  
model = MLP((hidden_size,3))  
optimizer = optimizers.SGD(lr).setup(model)  
data_size = len(train_set)  
max_iter = math.ceil(data_size / batch_size)  
for epoch in range(max_epoch):  
    index = np.random.permutation(data_size)  
    sum_loss = 0  
    for i in range(max_iter):  
        #取出小批量数据  
        batch_index = index[i * batch_size:(i + 1) * batch_size]  
        batch = [train_set[i] for i in batch_index]  
        batch_x = np.array([[example[0] for example in batch])  
        batch_t = np.array([[example[1] for example in batch]])  
        y = model(batch_x)  
        loss = F softmax.Cross_entropy(y, batch_t)  
        model.cleargrads()  
        loss.backup()
optimizer.update() sum_loss  $+ =$  float(loss.data) \*len(batch_t) #Print loss every epoch avg_loss  $=$  sum_loss / data_size print('epoch%d,loss%.2f'  $\%$  (epoch  $^+$  1,avg_loss))

运行结果

epoch 1, loss 1.35  
epoch 2, loss 1.06  
epoch 3, loss 0.98  
epoch 4, loss 0.90  
...

与上一个步骤不同的地方是这里使用了 Spiral 类,创建小批量数据的代码也得到了相应的修改,其余的代码与上一个步骤中的代码相同。运行上面的代码,可以看到结果和之前一样,损失 (loss) 逐渐减少。

这样我们就使用Dataset类训练了神经网络。当改用其他数据集进行训练时,我们会体会到使用Dataset类的好处。例如,当大数据类符合DeZero数据集的要求时,我们只要将上面代码中的Spiral改为BigData,即可运行新的代码。确定数据集的接口后,我们就能以相同的方式处理各种数据集了。

最后为现在的Dataset类添加一些预处理功能。