我们知道关于寻找最优参数是神经网络的目的,前面介绍了四种以及两种改进的方法来寻找最优参数,并画图进行了比较
神经网络技巧篇之寻找最优参数的方法https://blog.csdn.net/weixin_41896770/article/details/121375510
神经网络技巧篇之寻找最优参数的方法【续】https://blog.csdn.net/weixin_41896770/article/details/121419590
现在我们通过以前的一个经典实例(MNIST)来测试下,在进行实例测试之前,不熟悉的可以先参阅以前的两篇文章
MNIST数据集手写数字识别(一)https://blog.csdn.net/weixin_41896770/article/details/119576575
MNIST数据集手写数字识别(二)https://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的学习进行得稍微快一点,实际上的结果还跟学习率等超参数以及多少层神经网络有关系。