其他分享
首页 > 其他分享> > 基于MNIST数据集的最优参数的比较

基于MNIST数据集的最优参数的比较

作者:互联网

        我们知道关于寻找最优参数是神经网络的目的,前面介绍了四种以及两种改进的方法来寻找最优参数,并画图进行了比较
神经网络技巧篇之寻找最优参数的方法icon-default.png?t=LA92https://blog.csdn.net/weixin_41896770/article/details/121375510
神经网络技巧篇之寻找最优参数的方法【续】icon-default.png?t=LA92https://blog.csdn.net/weixin_41896770/article/details/121419590        

        现在我们通过以前的一个经典实例(MNIST)来测试下,在进行实例测试之前,不熟悉的可以先参阅以前的两篇文章

MNIST数据集手写数字识别(一)icon-default.png?t=LA92https://blog.csdn.net/weixin_41896770/article/details/119576575

MNIST数据集手写数字识别(二)icon-default.png?t=LA92https://blog.csdn.net/weixin_41896770/article/details/119710429上一篇文章的基础上进行修改,构建一个5层的神经网络,每层100个神经元,我们来确认四种方法在学习进展上有多大程度的差异,并画图,横轴是学习的迭代次数,纵轴是损失函数的值

import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.optimizer import *
from common.multi_layer_net import MultiLayerNet

#读取MNIST数据
(x_train,t_train),(x_test,t_test)=load_mnist(normalize=True)
train_num=x_train.shape[0]#60000张训练数据
batch_num=200#每次随机抽取的数量
max_iter=500#迭代次数

#四种方法,构造5层(4个隐藏层+1个输出层)神经网络来评估
mySGDDict={}
mySGDDict['SGD']=SGD()
mySGDDict['Momentum']=Momentum()
mySGDDict['AdaGrad']=AdaGrad()
mySGDDict['Adam']=Adam()

networks={}
train_loss={}
for k in mySGDDict.keys():
    networks[k]=MultiLayerNet(inputSize=784,hiddenSizeList=[100,100,100,100],outputSize=10)
    train_loss[k]=[]
for i in range(max_iter):
    batch_mask=np.random.choice(train_num,batch_num)
    x_batch=x_train[batch_mask]
    t_batch=t_train[batch_mask]
    #分别使用四种方法进行训练
    for k in mySGDDict.keys():
        grads=networks[k].gradient(x_batch,t_batch)
        mySGDDict[k].update(networks[k].params,grads)
        loss=networks[k].loss(x_batch,t_batch)
        train_loss[k].append(loss)#保存损失函数的值
    if i%100==0:
        print('迭代次数:'+str(i+100))
        for k in mySGDDict.keys():
            loss=networks[k].loss(x_batch,t_batch)
            print(k+":"+str(loss))

def smooth_curve(x):
    '''使得图形变得更光滑'''
    window_len=11
    s=np.r_[x[window_len-1:0:-1],x,x[-1:-window_len:-1]]
    w=np.kaiser(window_len,2)
    y=np.convolve(w/w.sum(),s,mode='valid')
    return y[5:len(y)-5]

#画图
markers={'SGD':'o','Momentum':'x','AdaGrad':'s','Adam':'D'}#样式
x=np.arange(max_iter)
for k in mySGDDict.keys():
    plt.plot(x,smooth_curve(train_loss[k]),marker=markers[k],markevery=100,label=k)
plt.xlabel('iterations')
plt.ylabel('loss value')
plt.legend()
plt.show()

迭代次数:100
SGD:2.438386391808663
Momentum:2.3930390242209603
AdaGrad:2.2428315543940314
Adam:2.445649073594391
迭代次数:200
SGD:1.8504058784313966
Momentum:0.3388485347141527
AdaGrad:0.14634168979474382
Adam:0.14149500888618036
迭代次数:300
SGD:0.9987654073163665
Momentum:0.23492597754880898
AdaGrad:0.11494675925508649
Adam:0.13704056059009395
迭代次数:400
SGD:0.6673420358314794
Momentum:0.2281848809517749
AdaGrad:0.09351207134574782
Adam:0.12776555371113074
迭代次数:500
SGD:0.5480751297953668
Momentum:0.19940082236878404
AdaGrad:0.09958623479585509
Adam:0.10639644884259741

 

        从图中可知,与SGD相比较,其他三种方法学习得更快,而且速度基本相同,仔细看的话,AdaGrad的学习进行得稍微快一点,实际上的结果还跟学习率等超参数以及多少层神经网络有关系。

标签:loss,mySGDDict,batch,SGD,train,参数,最优,100,MNIST
来源: https://blog.csdn.net/weixin_41896770/article/details/121467693