人工智能00032 深度学习与图像识别书评32 神经网络基础14
训练过程中,我们能够看到损失函数的值正在不断地变小,这虽然是一个好的现象,但是也只能说明神经网络能够正确识别训练集数据而已,并不能说明对于测试集数据,神经网络也能正确识别。
这里需要讲到的一个概念是过拟合。 过拟合是指:基于训练集的数据,神经网络可以正确识别,但是对于训练数据集以外的数据(比如测试集),就无法识别了。
神经网络学习的目的就是需要掌握泛化能力,因此要评价神经网络的泛化能力,就必须使用不包含在训练数据中的数据。
我们在这里引入了一个概念叫epoch。epoch是指,当一个完整的数据集通过了神经网络一次并且返回了一次时,这个过程称为一个epoch。
然而,当一个epoch对于计算机而言太庞大的时候,就需要将它分成多个小块。下面我们来 举例说明,对于10000笔训练数据,用大小为100的batch size进行学习的时候,重复随机梯度下降法100次,所有的训练数据就都学习了一次,此时100次就是一个epoch。
下面我们来思考一个问题:为什么要使用多于一个epoch? 在神经网络中,不仅传递完整的数据集一次是不够的,而且我们还需要将完整的数据集在同样的神经网络中传递多次。
但是请记住,我们使用的是有限的数据集,并且我们使用的是一个迭代过程,即梯度下降。
因此仅仅更新权重一次或者说使用一个epoch是不够的。随着epoch数量的增加,神经网络中权重的更新次数也在增加,曲线从欠拟合变为过拟合。
具体的实现过程也非常简单,在后续第7章我们介绍PyTorch实现神经网络的时候就能看到其具体实现。
最后,我们总结下几个概念:
深度学习中经常看到的epoch、iteration和batchsize。
下面我就来按照自己的理解说明这三者之间的区别,具体如下。
1)batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练都在训练集中提取batchsize个样本进行训练。
2)iteration:1个iteration等于使用batchsize个样本训练一次。
3)epoch:1个epoch等于使用训练集中的全部样本训练一次。
下面我们来修改下之前的逻辑,即增加epoch,结合代码我们可以比较清晰地了解到一个epoch就相当于是遍历了整个训练集数据。
增加了epoch之后,代码修改如下:
train_size = x_train.shape[0]
iters_num = 600
learning_rate = 0.001
epoch = 5
batch_size = 100
network = TwoLayerNet(input_size = 784,hidden_size=50,output_size=10)
for i in range(epoch):
print('current epoch is :', i)
for num in range(iters_num):
batch_mask = np.random.choice(train_size,batch_size)
x_batch = x_train[batch_mask]
y_batch = y_train[batch_mask]
grad = network.numerical_gradient(x_ batch,y_batch)
for key in ('W1','b1','W2','b2'):
network.params[key] -= learning_rate*grad[key]
loss = network.loss(x_batch,y_batch)
if num % 100 == 0:
print(loss)
print(network.accuracy(x_test,y_test))
从输出结果中我们可以看到,通过第一次epoch,Loss值从12.7减少到0.89,通过第二次epoch,Loss值从0.87降低到0.55。通过最后一次epoch,Loss值最终降低到0.25。
对于训练好的模型在测试集上的准确率也达到了95%。
('current epoch is :', 0)
12.749449349344754
1.321577706436449
2.4804280392909557
0.691451612120975
0.7644400653621658
0.8910328349199772
('current epoch is :', 1)
0.8793225139845198
0.5406429175201484
0.8747243449920528
1.214020823308522
0.48728660680810504
0.5577193622438239
('current epoch is :', 2)
0.32463475714288875
0.6505420260993182
0.32280894569470653
0.4885205422074785
0.7975956474074802
0.7105484843503084
('current epoch is :', 3)
0.18508314761722694
0.4604569413264499
0.630673497782514
0.484095564925412
0.32254112075495167
0.7981297562129817
('current epoch is :', 4)
0.5218448922347282
0.25448772007683046
0.17326277911392846
0.16531914875080655
0.3239636872223559
0.2515810758723941
小结
本章节我们花费了大量的篇幅介绍神经网络的各个组成部分,并且用Python代码基于数值微分实现了一个简单的神经网络,神经网络利用训练数据进行学习。
并用测试数据评价学习到的模型,神经网络的训练是以损失函数为指标进行的,更新权重以及偏移量,最终使得损失函数的值不断减小。数值微分是非常耗时的,但是其实现过程却比较容易理解。
第6章中,我们将要实现的是稍微复杂一点的误差反向传播,以高速地计算梯度。