美文网首页深度学习
深度学习入门(6)如何对神经网络模型训练结果进行评价

深度学习入门(6)如何对神经网络模型训练结果进行评价

作者: 阿旭123 | 来源:发表于2020-12-24 16:42 被阅读0次

    如何对神经网络模型训练结果进行评价

    上一篇文章《深度学习入门(5)【深度学习实战】无框架实现两层神经网络的搭建与训练过程》介绍了基于mnist的手写体数字集的两层神经网络的搭建与训练过程,通过损失函数的训练结果我们可以发现,随着训练的进行,损失函数逐渐减小,但是光这一点并不能很好的说明该神经网络的训练结果能够很好的对于其他数据也能够达到同样的精确度。这就涉及到神经网络的泛化能力问题。神经网络学习的最初目标是掌握泛化能力,因此,要评价神经网络的泛化能力,就必须使用不包含在训练数据中的数据。

    过拟合

    神经网络的学习中,必须确认是否能够正确识别训练数据以外的其他数据,即确认是否会发生过拟合。过拟合是指,虽然训练数据中的能够达到很好的识别精度,但是对于测试数据的识别精度却效果很差。

    神经网络的评价

    基于上一篇文章自己搭建的神经网络,本文我们对于不同的epoch次数下的训练数据和测试数据的识别精度进行输出,对两个识别精度进行比较,看该神经网络训练的结果是否也能够很好的识别测试数据。

    注:epoch表示学习中所有的训练数据均被使用过一次的更新次数。

    训练集与测试集精度的比较,实现代码如下:(网络的搭建代码见上一篇文章

    import sys, os
    import numpy as np
    import matplotlib.pyplot as plt
    from dataset.mnist import load_mnist
    from two_layer_net import TwoLayerNet #导入自己搭建的两层神经网络
    
    # 读入数据
    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)
    
    network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)
    
    iters_num = 10000  # 设定循环的次数1000
    train_size = x_train.shape[0]
    batch_size = 100
    learning_rate = 0.1
    
    train_acc_list = []  #记录训练集的识别精度
    test_acc_list = []   #记录测试集的识别精度
    
    iter_per_epoch = max(train_size / batch_size, 1)
    
    for i in range(iters_num):
        batch_mask = np.random.choice(train_size, batch_size)
        x_batch = x_train[batch_mask]
        t_batch = t_train[batch_mask]
        
        # 计算梯度
        #grad = network.numerical_gradient(x_batch, t_batch)
        grad = network.gradient(x_batch, t_batch)
        
        # 更新参数
        for key in ('W1', 'b1', 'W2', 'b2'):
            network.params[key] -= learning_rate * grad[key]
        
        loss = network.loss(x_batch, t_batch)
    
        if i % iter_per_epoch == 0:
            # 每一个epoch记录一次训练集与测试集的识别精度
            train_acc = network.accuracy(x_train, t_train)
            test_acc = network.accuracy(x_test, t_test)
            train_acc_list.append(train_acc)
            test_acc_list.append(test_acc)
            print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc))
    
    # 绘制训练集与测试集识别精度比较的图形
    markers = {'train': 'o', 'test': 's'}
    x = np.arange(len(train_acc_list))
    plt.plot(x, train_acc_list, label='train acc')
    plt.plot(x, test_acc_list, label='test acc', linestyle='--')
    plt.xlabel("epochs")
    plt.ylabel("accuracy")
    plt.ylim(0, 1.0)
    plt.legend(loc='lower right')
    plt.show()
    

    训练集与测试集的识别精度对比结果如下:

    不同epoch下的识别精度.png

    图中,实线表示训练数据的识别精度,虚线表示测试数据的识别精度

    如图所示,随着epoch的前进(神经网络训练的进行),我们发现使用训练数据和 测试数据评价的识别精度都提高了,并且,这两个识别精度基本上没有差异(两 条线基本重叠在一起)。因此,可以说这次的神经网络的训练过程中没有发生过拟合的现象,该神经网络是可以正常使用的。

    以上便是本文的主要内容,通过比较训练集与测试集在不同训练轮次epoch下的识别精度,验证了该神经网络训练的准确性。

    总结

    至此,前面几篇文章完成了神经网络基础知识以及训练过程等内容。包括神经网络的起源、损失函数、激活函数、梯度计算、手动搭建神经网络的训练过程以及对于神经网络好坏评价的判断方式等,后续会对神经网络其他的相关知识进行进一步的介绍。

    如果喜欢作者,欢迎点赞加关注,有不清楚的地方欢迎留言讨论。

    相关文章

      网友评论

        本文标题:深度学习入门(6)如何对神经网络模型训练结果进行评价

        本文链接:https://www.haomeiwen.com/subject/opimnktx.html