人工智能实战2019_第三次作业_蔺立萱
||||
|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
|项目|内容
|课程链接| 人工智能实战 2019(北京航空航天大学)
|第三次作业要求|第三次作业:使用minibatch的方式进行梯度下降
|我的课程目标|熟练掌握python语言,神经网络相关应用,实操项目
|本次作业的帮助|掌握梯度下降的相关知识,锻炼编程实践能力
|我的github账户|linlixuan
1、题目
使用minibatch的方式进行梯度下降
- 示例代码位置:/B-教学案例与实践/B6-神经网络基本原理简明教程/微软-方案1/NeuralNetwork/ch04/level4-BatchGradientDescent.py
- 采用随机选取数据的方式
- batch size分别选择5,10,15进行运行
2、代码
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 25 15:21:22 2019
@author: Jam
"""
import numpy as np
import pandas as pd
from pathlib import Path
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (8, 8)
x_data_name = "TemperatureControlXData.dat"
y_data_name = "TemperatureControlYData.dat"
class CData(object):
def __init__(self, loss, w, b, epoch, iteration):
self.loss = loss
self.w = w
self.b = b
self.epoch = epoch
self.iteration = iteration
def 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
def shuffle_batch(X, y, batch_size):
rnd_idx = np.random.permutation(len(X))
n_batches = len(X)//batch_size
for batch_idx in np.array_split(rnd_idx, n_batches):
X_batch, y_batch = X[batch_idx], y[batch_idx]
yield X_batch, y_batch
def forward_prop(X, W, b):
return np.dot(X, W) + b
def backward_prop(X, y, y_hat):
dZ = y_hat - y
dW = 1/len(X)*X.T.dot(dZ)
db = 1/len(X)*np.sum(dZ, axis=0, keepdims=True)
return dW, db
def compute_loss(y_hat, y):
return np.mean(np.square(y_hat - y))/2
X, y = ReadData()
N, D = X.shape
learning_rate = 0.01
n_epochs = 50
batch_size = 10
W = np.random.randn(D, 1)
b = np.zeros(1)
best_loss = np.infty
W_lis = []
b_lis = []
loss_lis = []
for epoch in range(n_epochs):
for X_batch, y_batch in shuffle_batch(X, y, batch_size):
y_hat = forward_prop(X_batch, W, b)
dW, db = backward_prop(X_batch, y_batch, y_hat)
W = W - learning_rate*dW
b = b - learning_rate*db
W_lis.append(W[0, 0])
b_lis.append(b[0, 0])
loss = compute_loss(forward_prop(X, W, b), y)
loss_lis.append(loss)
if loss < best_loss:
best_loss = loss
plt.figure(figsize=(16, 10))
p5,=plt.plot(batch_result['5'])
p10,=plt.plot(batch_result['10'])
p15,=plt.plot(batch_result['15'])
plt.legend([p5,p10,p15],["batch_size=5","batch_size=10","batch_size=15"])
plt.ylim(0.004,0.01)
plt.xlim(0,1000)
plt.xlabel('epoch_times')
plt.ylabel('loss_MSE')
plt.show()
3、输出结果

4、问题2:为什么是椭圆而不是圆?如何把这个图变成一个圆?
- 由于b和w对loss的影响程度不同
- 当wb项系数为0且w、b的平方项系数相等时变成一个圆
5、问题3:为什么中心是个椭圆区域而不是一个点?
- 中心为loss的最小值点形成的区域,是一个无限逼近的状态,一系列loss相近的点对形成了中心的椭圆区域
- 由于无法精确为0,满足一定精度的点都被归为这个区域
posted on 2019-03-25 15:36 linlixuan00 阅读(156) 评论(0) 收藏 举报
浙公网安备 33010602011771号