博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
人工智能实战_第三次作业_田博
阅读量:4472 次
发布时间:2019-06-08

本文共 2294 字,大约阅读时间需要 7 分钟。

项目 内容
这个作业属于哪个课程
这个作业的要求在哪里
我在这个课程的目标是 了解人工智能,提高编程能力
这个作业在哪个具体方面帮助我实现目标 了解神经网络的基本工作原理,理解梯度下降

一、梯度下降的实现

代码

大家都写得差不多的 没什么意义的 你可以跳过的引用、读取文件、赋初值部分

import numpy as npimport matplotlib.pyplot as pltimport randomfrom pathlib import Pathx_data_name = "TemperatureControlXData.dat"y_data_name = "TemperatureControlYData.dat"eta = 0.1            #这几个参数还要再改滴max_epoch = 100batch_size = 5w = 1      b = 1def ReadData():             #读取X,Y数组    Xfile = Path(x_data_name)    Yfile = Path(y_data_name)    if Xfile.exists() & Yfile.exists():        X = np.load(Xfile)        Y = np.load(Yfile)        return X.reshape(1,-1),Y.reshape(1,-1)    else:        return None,NoneX, Y = ReadData()LOSS=[]

没有定义很多函数的 全部堆在一块的 甚至没有用数组点乘的 显得好low好low的o(╯□╰)o 但是实现要求的主程序来啦!

if __name__ == '__main__':    for i in range(max_epoch):        batch_list = [random.randint(0,199) for _ in range(batch_size)]     #随机生成数组        for j in range(batch_size):            batch_x = X[0,batch_list[j]]        #根据随机生成的数组选取数据x,y            batch_y = Y[0,batch_list[j]]            z = w * batch_x + b                              dz = z - batch_y                    #计算梯度            dw = dz * batch_x / batch_size            db = dz / batch_size            delta_w = dw.sum()            delta_b = db.sum()            w = w - eta * delta_w               #更新w,b            b = b - eta * delta_b            loss = ((z - batch_y) **2 / batch_size).sum()    #损失函数        LOSS.append(loss)    print("w=%f,b=%f"%(w,b))           plt.plot(LOSS)    plt.title("MiniBatch batch_size=%d eta=%f"%(batch_size,eta) )    plt.xlabel("epoch")    plt.ylabel("loss")    plt.show()

损失函数

1627962-20190325172223364-906852106.png

1627962-20190325172311354-434204230.png
1627962-20190325172340001-1744050495.png

反思

  • 我用的随机方法是随机生成1-200之间的十个数,对应X,Y数组中的数据。应该也可以每次都把数组顺序打乱,取前batch_size个数据。
  • 随机选取数据,结果真的太玄学了!同样的代码跑两遍,损失函数可能一个无比难看一个比较光滑。都不好总结规律了。
  • 一开始max_epoch选了50,到最后几组非常不光滑,那个波动都不能叫毛刺了应该叫波浪。现在改成200,光滑了很多,但毛刺也不少。
  • w和b的初值,一开始我用的是随机函数生成,这样图像就更不光滑更难看了,连续跑两遍的差别也就更大了,还是改成定值吧。
  • 关于学习率的改变,影响非常大。选取eta=0.05的时候,损失函数一开始忽上忽下,变化巨大,取到0.2的时候,损失函数就一泻千里长跪不起了。并且w和b最后的值随着eta的变化,变化得也很大,w大约有0.2的波动,b波动小一点但也接近0.1了。

二、思考题

1、损失函数的 2D 示意图为什么是椭圆而不是圆?如何把这个图变成一个圆?

1627962-20190325175946424-1952710670.png

展开,$w^2$ 和 $b^2$ 前面的系数不同,这其实是椭圆的一般表达式。因此颜色相同的部分会形成一个椭圆。
当$w^2$和$b^2$系数相同,也就是$\sum_{i=1}^m\x_i^2=0$,且w和b和wb前系数为0,就会形成圆。

2、为什么中心是个椭圆区域而不是一个点?

如果是一个点,那么该点就是loss=0的点。但实际上损失函数无限趋近于0而不可能精确为0,此时这些渐近的点形成了椭圆区域。

转载于:https://www.cnblogs.com/lovelyBobbie/p/10595375.html

你可能感兴趣的文章
java中的上传下载----ajaxFileUpload+struts2
查看>>
RMAN简明教程之六——RMAN的管理
查看>>
Silverlight/Windows8/WPF/WP7/HTML5周学习导读(8月13日-8月19日)
查看>>
BZOJ 1004([HNOI2008]Cards-Polya计数+k背包)
查看>>
也谈分层
查看>>
深入理解JVM(二)JVM内存模型
查看>>
ELK 安装笔记
查看>>
我的cppblog博客地址
查看>>
mysql jdbc源码分析片段 和 Tomcat's JDBC Pool
查看>>
错误记录:datagridview RowChange事件不触发
查看>>
java中的形参实参定义
查看>>
[Atcoder Regular Contest 061] Tutorial
查看>>
HTML拾遗
查看>>
Python tips: 什么是*args和**kwargs?
查看>>
checking for fcc ....no checking for cc .. no
查看>>
广义表
查看>>
工作笔记【2010-7-7】
查看>>
iOS开发-OC分支结构
查看>>
VB程序打包方法之如何在发布安装之后不带源码
查看>>
org.springframework.beans.NullValueInNestedPathException
查看>>