人工智能实战第三次作业 焦宇恒
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 人工智能实战2019 |
这个作业的要求在哪里 | 作业要求 |
我在这个课程的目标是 | 学会人工智能基本算法 |
这个作业在哪个具体方面帮助我实现目标 | 使用minibatch的方法进行梯度下降 |
第四章学习总结
最小二乘法,梯度下降法,神经网络法(本质上还是梯度下降法) 三种算法的目标都是求得使误差函数取得最小值的参数w,b。
最小二乘法实际上是数学上由多元函数求偏导算极限的方法。通过次方法可以精确的求得数学解析解。但它的缺点是并非对所有误差函数,都能通过解析的方法求解(例如高次方程没有公式解)。
梯度下降是同过给定的步长在每个点从下降最快的方向逼近误差函数的最小值。通过多次迭代直到求得满足精度要求的最优解。这个过程类似于牛顿下山法求解高次方程 。
使用minibatch的方法梯度下降代码
# Copyright (c) Microsoft. All rights reserved.
# Licensed under the MIT license. See LICENSE file in the project root for full license information.# multiple iteration, loss calculation, stop condition, predication
import numpy as np
import matplotlib.pyplot as plt
from pathlib import Path
import randomx_data_name = "TemperatureControlXData.dat"
y_data_name = "TemperatureControlYData.dat"class CData(object):def __init__(self, loss, w, b, epoch, iteration):self.loss = lossself.w = wself.b = bself.epoch = epochself.iteration = iterationdef ReadData():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, None
# 读取数据,np.load方法把数据以矩阵或向量的方式输出def ForwardCalculationBatch(W, B, batch_x):Z = np.dot(W, batch_x) + Breturn Z
# 前向计算z=wx + b np.dot方法进行矩阵乘def BackPropagationBatch(batch_x, batch_y, batch_z):m = batch_x.shape[1]dZ = batch_z - batch_ydB = dZ.sum(axis=1, keepdims=True) / mdW = np.dot(dZ, batch_x.T) / mreturn dW, dB
# 反向计算dz = z - y, dw = (z - y)*x, db = z - ydef UpdateWeights(w, b, dW, dB, eta):w = w - eta * dWb = b - eta * dBreturn w, b
# 根据步长更新参数w,b的取值def InitialWeights(num_input, num_output, flag):if flag == 0:# zeroW = np.zeros((num_output, num_input))elif flag == 1:# normalizeW = np.random.normal(size=(num_output, num_input))elif flag == 2:# xavierW = np.random.uniform(-np.sqrt(6 / (num_input + num_output)),np.sqrt(6 / (num_input + num_output)),size=(num_output, num_input))B = np.zeros((num_output, 1))return W, B
# 初始化超参数def ShowResult(X, Y, w, b, iteration):# draw sample dataplt.plot(X, Y, "b.")# draw predication dataPX = np.linspace(0, 1, 10)PZ = w * PX + bplt.plot(PX, PZ, "r")plt.title("Air Conditioner Power")plt.xlabel("Number of Servers(K)")plt.ylabel("Power of Air Conditioner(KW)")plt.show()print("iteration=", iteration)print("w=%f,b=%f" % (w, b))def CheckLoss(W, B, X, Y):m = X.shape[1]Z = np.dot(W, X) + BLOSS = (Z - Y) ** 2loss = LOSS.sum() / m / 2return lossdef RandomSample(X,Y,batchsize):batch_x = np.zeros((1,batchsize))batch_y = np.zeros((1,batchsize))for i in range(batchsize):r=random.randint(0,X.shape[1]-1)batch_x[0,i] = X[0,r]X = np.delete(X,i,axis=1)batch_y[0,i] = Y[0,r]Y = np.delete(Y,i,axis=1)return batch_x, batch_y
# 通过随机的方式选取数据def GetMinimalLossData(dict_loss):key = sorted(dict_loss.keys())[0]w = dict_loss[key].wb = dict_loss[key].breturn w, b, dict_loss[key]
# 得到误差最小时取得w和bdef ShowLossHistory(dict_loss, method):loss = []for key in dict_loss:loss.append(key)# plt.plot(loss)plt.plot(loss[30:800])plt.title(method)plt.xlabel("epoch")plt.ylabel("loss")plt.show()def loss_2d(x, y, n, dict_loss, method, cdata):result_w = cdata.w[0, 0]result_b = cdata.b[0, 0]# show contour of losss = 150W = np.linspace(result_w - 1, result_w + 1, s)B = np.linspace(result_b - 1, result_b + 1, s)LOSS = np.zeros((s, s))for i in range(len(W)):for j in range(len(B)):w = W[i]b = B[j]a = w * x + bloss = CheckLoss(w, b, x, y)LOSS[i, j] = np.round(loss, 2)# end for j# end for iprint("please wait for 20 seconds...")while (True):X = []Y = []is_first = Trueloss = 0for i in range(len(W)):for j in range(len(B)):if LOSS[i, j] != 0:if is_first:loss = LOSS[i, j]X.append(W[i])Y.append(B[j])LOSS[i, j] = 0is_first = Falseelif LOSS[i, j] == loss:X.append(W[i])Y.append(B[j])LOSS[i, j] = 0# end if# end if# end for j# end for iif is_first == True:breakplt.plot(X, Y, '.')# end while# show w,b tracew_history = []b_history = []for key in dict_loss:w = dict_loss[key].w[0, 0]b = dict_loss[key].b[0, 0]if w < result_w - 1 or result_b - 1 < 2:continueif key == cdata.loss:break# end ifw_history.append(w)b_history.append(b)# end forplt.plot(w_history, b_history)plt.xlabel("w")plt.ylabel("b")title = str.format("Method={0}, Epoch={1}, Iteration={2}, Loss={3:.3f}, W={4:.3f}, B={5:.3f}", method, cdata.epoch,cdata.iteration, cdata.loss, cdata.w[0, 0], cdata.b[0, 0])plt.title(title)plt.show()def InitializeHyperParameters(method):if method == "SGD":eta = 0.1max_epoch = 50batch_size = 1elif method == "MiniBatch":eta = 0.1max_epoch = 50batch_size = 20elif method == "FullBatch":eta = 0.5max_epoch = 1000batch_size = 200return eta, max_epoch, batch_sizeif __name__ == '__main__':# 修改method分别为下面三个参数,运行程序,对比不同的运行结果# SGD, MiniBatch, FullBatchmethod = "MiniBatch"eta, max_epoch, batch_size = InitializeHyperParameters(method)W, B = InitialWeights(1, 1, 0)# calculate loss to decide the stop conditionloss = 5dict_loss = {}# read dataX, Y = ReadData()# count of samplesnum_example = X.shape[1]num_feature = X.shape[0]# if num_example=200, batch_size=10, then iteration=200/10=20max_iteration = (int)(num_example / batch_size)for epoch in range(max_epoch):# 设置迭代次数print("epoch=%d" % epoch)for iteration in range(max_iteration):# 根据batch_size确定循环次数# get x and y value for one samplebatch_x, batch_y = RandomSample(X, Y, batch_size)# get z from x,ybatch_z = ForwardCalculationBatch(W, B, batch_x)# calculate gradient of w and bdW, dB = BackPropagationBatch(batch_x, batch_y, batch_z)# update w,bW, B = UpdateWeights(W, B, dW, dB, eta)# calculate loss for this batchloss = CheckLoss(W, B, X, Y)print(epoch, iteration, loss, W, B)prev_loss = lossdict_loss[loss] = CData(loss, W, B, epoch, iteration)# end for# end forShowLossHistory(dict_loss, method)w, b, cdata = GetMinimalLossData(dict_loss)print(cdata.w, cdata.b)print("epoch=%d, iteration=%d, loss=%f" % (cdata.epoch, cdata.iteration, cdata.loss))# ShowResult(X, Y, W, B, epoch)print(w, b)x = 346 / 1000result = ForwardCalculationBatch(w, b, x)print(result)loss_2d(X, Y, 200, dict_loss, method, cdata)
结果分析
- batch_size = 5
- batch_size = 10
- batch_size = 15
full_batch, SDG, mini_batch只是选取数据集的方式不同也即误差函数不同。比如mini_batch中每个batch_size对应的误差函数都是不一样的
mini_batch方法随着batch_size的增大,“毛刺”减少,所得的结果震荡幅度小,收敛性强,结果更精确。
为什么是椭圆不是圆
- 当图像为圆时说明w和b对误差函数的影响是一样的,因此z对w,b的偏导数应该相同。这是由数据集决定的,如果所给的数据能恰好满足这个关系,那么就可以是圆。
为什么中心是椭圆区域不是一个点
- 可类比地图中等高线的定义,等高线是不连续的,同一片颜色区域表示在同一个值附近。
- 由于误差函数随着迭代次数的增加,误差函数的变化越来越小,因此越靠近中间的区域,面积越大。
转载于:https://www.cnblogs.com/JiaoYh98/p/10595497.html
人工智能实战第三次作业 焦宇恒相关推荐
- 人工智能实战2019 第二次作业 焦宇恒
标题 内容 这个作业属于哪个课程 人工智能实战2019 这个作业的要求在哪里 作业要求 这个作业关于什么 双变量的反向传播 参考文献 参考文献 实验代码 w = 3 b = 4 delta_z = 1 ...
- 人工智能实战第三次作业_尹正超
作业三:使用minibatch的方式进行梯度下降 项目 内容 这个作业属于哪个课程 人工智能实战 这个作业的要求在哪里 第三次作业-使用minibatch的方式进行梯度下降 我在这个课程的目标是 学习 ...
- 人工智能实战2019 第五次作业 焦宇恒 16721088
标题 内容 这个作业属于哪个课程 人工智能实战2019 这个作业的要求在哪里 逻辑与非门 这个作业在哪个具体方面帮助我实现目标 神经网络二分类法 逻辑与门训练样本 X1 X2 Y 0 0 0 0 1 ...
- 人工智能实战2019第六次作业 焦宇恒
标题 内容 这个作业属于哪个课程 人工智能实战2019 这个作业的要求在哪里 练习调整超参 这个作业在哪个具体方面帮助我实现目标 体验超参对学习结果的影响 实验结果 本次实验,假设各个变量相互独立使用 ...
- 人工智能实战2019 第0次作业 焦宇恒
项目 内容 这个作业属于哪个课程 buaa人工智能实战2019 这个作业的要求在哪里 作业 我在这个课程的目标是 理解人工智能基本算法,学会配置实验环境 这个作业在哪个具体方面帮助我实现目标 理清思路 ...
- 2019人工智能实战 第六次作业 段峙宇
项目 内容 课程内容 2019人工智能实战 作业要求 第六次作业 课程目标 将模型准确度调整至>97% 并给出最终loss曲线 本次作业的帮助 了解各项参数对训练准确性的影响程度 1.调节epo ...
- 人工智能实战第六次作业-尹正超
作业六 项目 内容 这个作业属于哪个课程 人工智能实战 这个作业的要求在哪里 第六次作业 我在这个课程的目标是 学习算法,积累项目经验,锻炼coding能力 这个作业在哪个方面帮助我实现目标 了解三重 ...
- 人工智能实战 第四次作业(DEBUG4FUN团队)
项目 内容 这个作业属于哪个课程 人工智能实战2019 这个作业的要求在哪里 第四次作业--第一部分(团队) 队伍名称 Debug4FUN 队伍组成 王俊杰.何峥.段峙宇.田博.张有驰.杨佳宁 作业内 ...
- 人工智能实战_第二次作业_杨佳宁
双变量的反向传播 作业要求 项目 内容 这个作业属于哪个课程 班级博客 这个作业的要求在哪里 作业要求 我在这个课程的目标是 对于人工智能有一定的了解 这个作业在哪个具体方面帮助我实现目标 能够有平台 ...
最新文章
- STM32-RCC内部总线时钟设置程序详讲
- faster rcnn接口_Faster R-CNN教程
- Web开发者需养成的好习惯
- __GLOBAL__I_a in libUPPayPlugin.a(UPPasswordTool.o)
- gnome mysql client_configure: error: Not found mysqlclient library
- 用户姓名保护python_Python操作LDAP,对用户进行认证(验证用户名以及密码)
- java学习笔记day06---匿名内部类
- Sql添加Oracle数据库的表空间和用户
- sql 算出下级销售总和_找出总和字符串
- Mac 远程命令工具
- Leetcode-MySQL-180. 连续出现的数字
- CentOS 7中 rsync 备份数据使用实例
- 使用Reloader实现更新configmap后自动重启pod
- react-navigation之动态修改title的内容
- cocos2dx打飞机项目笔记一:项目结构介绍
- 前端技术规划与战略:2022
- 单元化架构之流量调度篇
- 完全但不完美信息博弈
- Ant design Vue 如何在a-table表格标题/内容上添加一个按钮
- error C2440 无法转换到 AFX_PMSG mfc自定义信号及实现 PostMessage FindWindow