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类添加一些预处理功能。