人工智能实战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)    收藏  举报

导航