前一篇博客讲述了SGD和Batch方法的代码实现,本篇博客主要是比较SGD和Batch方法的学习速度,通过平均误差来进行比较,为了确保公平,两种方法的权重用相同的值初始化。
在这里附上代码:
#!/usr/bin/env python
import math
import random
import BatchDelta
import SGDdelta
import matplotlib.pyplot as plt
if __name__ == '__main__':
#绘制曲线图
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
#设置横纵坐标
ansy = []; ansy1 =[]
ansx = []; ansx1 =[]
# Wij表示输入节点j到输出节点i之间的权值
WS = []
WB = []
# 标准输入
data = [[0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1]]
# 标准输出
D = [0, 0, 1, 1]
# 初始化权值
for i in range(0, 3):
WS.append(2 * random.random() - 1);
WB.append(WS[i]);
#print("WS:"+WS[i].__str__()+"WB:"+WB[i].__str__());
for i in range(0,1000):
es_sum=eb_sum=0;
WS = SGDdelta.DeltaSGD(WS,data,D);
WB = BatchDelta.Batch(WB,data,D);
for j in range(0,len(D)):
vs = vb = 0;
for k in range(0,len(WS)):
vs += WS[k]*data[j][k];
vb += WB[k]*data[j][k];
d = D[j];
ys = SGDdelta.Sigmid(vs);
yb = BatchDelta.Sigmid(vb);
es_sum = es_sum+(d - ys)**2;
eb_sum = es_sum+(d - yb)**2;
es_avg = es_sum*1.0/len(D);
#将SGD横纵坐标加入list中
ansx.append(i); ansy.append(es_avg)
eb_avg = eb_sum*1.0/len(D);
#将Batch横纵坐标加入list中
ansx1.append(i); ansy1.append(eb_avg)
print("es_avg:"+es_avg.__str__()+" eb_avg"+eb_avg.__str__());
#将坐标列表加入坐标系中
ax.plot(ansx, ansy)
ax.plot(ansx1,ansy1)
#设置曲线标识
plt.legend(( 'SGD', 'Batch'))
plt.grid(True)
#显示曲线图
plt.show()
这里通过利用前面博客的DeltaSGD函数和DeltaBatch函数训练神经网络一千次,并计算出均方差,将均方差存到list中通过调用
matplotlib.pyplot实现曲线图。
效果如下: