大数据

人工智能00032 深度学习与图像识别书评32 神经网络基础14

2023-12-11  本文已影响0人  水晓朴

训练过程中,我们能够看到损失函数的值正在不断地变小,这虽然是一个好的现象,但是也只能说明神经网络能够正确识别训练集数据而已,并不能说明对于测试集数据,神经网络也能正确识别。

这里需要讲到的一个概念是过拟合。 过拟合是指:基于训练集的数据,神经网络可以正确识别,但是对于训练数据集以外的数据(比如测试集),就无法识别了。

神经网络学习的目的就是需要掌握泛化能力,因此要评价神经网络的泛化能力,就必须使用不包含在训练数据中的数据。

我们在这里引入了一个概念叫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章中,我们将要实现的是稍微复杂一点的误差反向传播,以高速地计算梯度。

上一篇 下一篇

猜你喜欢

热点阅读