人工智能实战2019_第3次个人作业_邹镇洪

Written by joezou(邹镇洪), 2019/3/19

项目 内容
这个作业属于课程 人工智能实战 2019 - 北京航空航天大学
这个作业的要求在 第三次作业:使用minibatch的方式进行梯度下降
我在这个课程的目标是 学会利用云部署机器学习模型并完成一个app
这个作业在这些方面帮助我实现目标 练习神经网络批处理操作
其他参考文献

作业正文:

问题1:代码练习

  • 示例代码位置:/B-教学案例与实践/B6-神经网络基本原理简明教程/微软-方案1/NeuralNetwork/ch04/level4-BatchGradientDescent.py
  • 采用随机选取数据的方式
  • batch size分别选择5,10,15进行运行

代码如下

import numpy as np
import matplotlib.pyplot as plt
from pathlib import Path
from matplotlib.font_manager import FontProperties
from matplotlib.pyplot import savefig

def ReadData():
    Xfile = Path('TemperatureControlXData.dat')
    Yfile = Path('TemperatureControlYData.dat')
    if Xfile.exists() & Yfile.exists():
        X = np.load(Xfile)
        Y = np.load(Yfile)
        return X,Y
    else:
        return None,None

def forward(X,Y,w,b): # s输入单个batch的数据,输出误差
    Z = np.dot(X,w) + b - Y
    return Z

def backward(X,w,b,Z,rate,batchsize): # 当前batch的数据
    w -= rate / batchsize * np.dot(Z,X)
    b -= rate / batchsize * sum(Z)
    eta = [z**2 / 2 / batchsize for i in Z] #每个batch的误差
    return w,b,sum(Z), eta
    
def Simu(xx,yy,w,b,batchsize,EPOCH,rate):
    rank = np.arange(0,len(xx))
    np.random.shuffle(rank) # 随机顺序
    index = [rank[i:i+batchsize] for i in range(0,len(xx),batchsize)] # 随机batch
    iteration = len(index) # 迭代次数
    epoch,eta= 1,1
    LOSS = []
    while (eta>=1e-6)*(epoch<=EPOCH):
        eta = 0
        for i in range(iteration):
            X = [xx[k] for k in index[i]]
            Y = [yy[k] for k in index[i]]
            Z = forward(X,Y,w,b)
            w,b,_,eta_ = backward(X,w,b,Z,rate,len(index[i]))
            eta += eta_
        LOSS.append(eta)
        print('epoch=%d,iteration=%d,w=%.6f,b=%.6f,eta=%.6f\n' %(epoch, iteration, w, b,eta))
        epoch += 1
    result = w * 0.346 + b
    print("result is %.3f\n" %result)
    return w,b,LOSS

if __name__ == '__main__':
    w0, b0, rate,epoch = 0, 10, 1, 50
    Batchsize = [5,10,15]
    X, Y = ReadData()
    i=0
    plt.figure(figsize=(12,6))
    for size in Batchsize:
        w,b,LOSS = Simu(X, Y, w0, b0, size, epoch, rate)
        #point = np.arange(0.,1.,0.01)
        #line = [w*i+b for i in point]
        #xl = np.arange(1,epoch,1/size)
        color = ['gray','orange','blue']
        plt.plot(LOSS,color=color[i],label='batchsize='+str(size))
        i += 1
        font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
        plt.title(str(epoch)+'个epoch上的loss变化'+',学习率为'+str(rate),fontproperties=font)
        #plt.plot(X,Y,'.',color='orange')
        #plt.plot(point,line,color='blue')
    plt.ylabel('loss')
    plt.xlabel('epoch number')
    plt.legend()
    plt.show()
    savefig("D:/courses/AI in Action/codes/mini_batch/"+str(rate)+".png")





问题2:为什么是椭圆而不是圆?如何把这个图变成一个圆?

二次曲面-百度百科
MSE对应的loss函数为二次型,根据二次曲面分类:

\[loss=(wx+b-y)^2/2$$ 记loss为z,化为下列公式 $$x^2w^2+b^2+2xwb-2xyw-2yb-2z+y^2=0$$ 对应二次曲面为椭圆抛物面 因此在2D平面上的投影是椭圆 那么有没有可能为其他图像?有,只需让loss对应参数满足二次曲面的不同判别式即可,但不一定是MSE 如何才能变成圆?令二次曲面为(椭圆/双曲)抛物面即可,此时参数满足$$loss=(w^2±b^2)(x-y)$$但此时loss失去意义 #### 问题3:为什么中心是个椭圆区域而不是一个点? >当中心为一个点时表明可以完全拟合散点(最优解),而实际上不可能完全拟合散点,该区域表明基于MSE优化的最小误差对应的(w,b)值域,除非所有点都在直线上才是一个点。\]

posted @ 2019-03-14 19:58  joezou  阅读(292)  评论(0编辑  收藏  举报