一、实验目的

(1)学习并掌握常见的机器学习方法;

(2)能够结合所学的python知识实现机器学习算法;

(3)能够用所学的机器学习算法解决实际问题。

二、实验内容与要求

(1)理解多层神经网络的架构及参数更新,能够结合多层神经网络实现分类问题;

(2)根据所提供的代码,完成多层神经网络的代码,能够进行分类与回归;

(3)能够正确输出结果

三、实验过程及代码

3.1 初始化参数

(1)初始化两层网络参数

def initialize_parameters(n_x,n_h,n_y):

W1 = np.random.randn(n_h, n_x) * 0.01

b1 = np.zeros((n_h, 1))

W2 = np.random.randn(n_y, n_h) * 0.01

b2 = np.zeros((n_y, 1))

#使用断言确保我的数据格式是正确的

assert(W1.shape == (n_h, n_x))

assert(b1.shape == (n_h, 1))

assert(W2.shape == (n_y, n_h))

assert(b2.shape == (n_y, 1))

parameters = {"W1": W1,

"b1": b1,

"W2": W2,

"b2": b2}

return parameters

(2)初始化多层网络参数

def initialize_parameters_deep(layers_dims):

np.random.seed(3)

parameters = {}

L = len(layers_dims)

for l in range(1,L):

parameters["W" + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) / np.sqrt(layers_dims[l - 1])

parameters["b" + str(l)] = np.zeros((layers_dims[l], 1))

#确保我要的数据的格式是正确的

assert(parameters["W" + str(l)].shape == (layers_dims[l], layers_dims[l-1]))

assert(parameters["b" + str(l)].shape == (layers_dims[l], 1))

return parameters

3.2 前向传播分

分两步,同时保存A_pre,w,b,Z,A

(1)线性前向传播

def linear_forward(A_prev,W,b):

"""

实现前向传播的线性部分。

参数:

A_prev - 来自上一层(或输入数据)的激活,维度为(上一层的节点数量,示例的数量)

W - 权重矩阵,numpy数组,维度为(当前图层的节点数量,前一图层的节点数量)

b - 偏向量,numpy向量,维度为(当前图层节点数量,1)

返回:

Z - 激活功能的输入,也称为预激活参数

cache - 一个包含“A”,“W”和“b”的字典,存储这些变量以有效地计算后向传递

"""

#Please do something

return Z,linear_cache

(2)激活函数前向传播

def linear_activation_forward(A_prev,W,b,activation):

"""

实现LINEAR-> ACTIVATION 这一层的前向传播

参数:

A_prev - 来自上一层(或输入层)的激活,维度为(上一层的节点数量,示例数)

W - 权重矩阵,numpy数组,维度为(当前层的节点数量,前一层的大小)

b - 偏向量,numpy阵列,维度为(当前层的节点数量,1)

activation - 选择在此层中使用的激活函数名,字符串类型,【"sigmoid" | "relu"】

返回:

A - 激活函数的输出,也称为激活后的值

cache - 一个包含“linear_cache”和“activation_cache”的字典,我们需要存储它以有效地计算后向传递

"""

#Please do something

return A,cache

3.3 model的前向传播

def L_model_forward(X,parameters):

"""

实现[LINEAR-> RELU] *(L-1) - > LINEAR-> SIGMOID计算前向传播,也就是多层网络的前向传播,为后面每一层都执行LINEAR和ACTIVATION

参数:

X - 数据,numpy数组,维度为(输入节点数量,示例数)

parameters - initialize_parameters_deep()的输出

返回:

AL - 最后的激活值

caches - 包含以下内容的缓存列表:

linear_relu_forward()的每个cache(有L-1个,索引为从0到L-2)

linear_sigmoid_forward()的cache(只有一个,索引为L-1)

"""

#Please do something

return AL,caches

3.4 计算cost function

def compute_cost(AL,Y):

"""

交叉熵误差函数,定义成本函数。

参数:

AL - 与标签预测相对应的概率向量,维度为(1,示例数量)

Y - 标签向量(例如:如果不是猫,则为0,如果是猫则为1),维度为(1,数量)

返回:

cost - 交叉熵成本

"""

#Please do something

return cost

3.5 反向传播

(1)反向传播用于计算相对于参数的损失函数的梯度,向前和向后传播的流程图如下:

(2)对于线性的部分的公式:

(3)单层实现反向传播的线性部分

def linear_backward(dZ,linear_cache):

"""

为单层实现反向传播的线性部分(第L层)

参数:

dZ - 相对于(当前第l层的)线性输出的成本梯度

cache - 来自当前层前向传播的值的元组(A_prev,W,b)

返回:

dA_prev - 相对于激活(前一层l-1)的成本梯度,与A_prev维度相同

dW - 相对于W(当前层l)的成本梯度,与W的维度相同

db - 相对于b(当前层l)的成本梯度,与b维度相同

"""

#Please do something

return dA_prev, dW, db

(4)实现LINEAR-> ACTIVATION层的后向传播

def linear_activation_backward(dA,cache,activation="relu"):
    """
    实现LINEAR-> ACTIVATION层的后向传播。
    
    参数:
         dA - 当前层l的激活后的梯度值
         cache - 我们存储的用于有效计算反向传播的值的元组(值为linear_cache,activation_cache)
         activation - 要在此层中使用的激活函数名,字符串类型,【"sigmoid" | "relu"】
    返回:
         dA_prev - 相对于激活(前一层l-1)的成本梯度值,与A_prev维度相同
         dW - 相对于W(当前层l)的成本梯度值,与W的维度相同
         db - 相对于b(当前层l)的成本梯度值,与b的维度相同
    """
    #Please do something
    
    return dA_prev,dW,db

(5)多层网络的向后传播

def L_model_backward(AL,Y,caches):

"""

对[LINEAR-> RELU] *(L-1) - > LINEAR - > SIGMOID组执行反向传播,就是多层网络的向后传播

参数:

AL - 概率向量,正向传播的输出(L_model_forward())

Y - 标签向量(例如:如果不是猫,则为0,如果是猫则为1),维度为(1,数量)

caches - 包含以下内容的cache列表:

linear_activation_forward("relu")的cache,不包含输出层

linear_activation_forward("sigmoid")的cache

返回:

grads - 具有梯度值的字典

grads [“dA”+ str(l)] = ...

grads [“dW”+ str(l)] = ...

grads [“db”+ str(l)] = ...

"""

#Please do something

return grads

3.6 更新参数

def update_parameters(parameters, grads, learning_rate):
    L = len(parameters) // 2 #整除
    for l in range(L):
        parameters["W" + str(l + 1)] = parameters["W" + str(l + 1)] - learning_rate * grads["dW" + str(l + 1)]
        parameters["b" + str(l + 1)] = parameters["b" + str(l + 1)] - learning_rate * grads["db" + str(l + 1)]
    return parameters

四、实验分析及总结

(1)两层神经网络测试结果:

(2)多层神经网络测试结果:

(3)真实样本测试:

测试图片:                                         测试结果:

测试图片:                                           测试结果:

单来说就是将单个感知器作为一个神经网络节点,然后用此类节点组成一个层次网络结构,我们称此网络即为人工神经网络(本人自己的理解)。当网络的层次大于等于3层(输入层+隐藏层(大于等于1)+输出层)时,我们称之为多层神经网络。

对于反向传播算法主要从以下几个方面进行总结:

(1)局部极小值:对于多层网络,误差曲面可能含有多个不同的局部极小值,梯度下降可能导致陷入局部极小值。缓解局部极小值的方法主要有增加冲量项,使用随机梯度下降,多次使用不同的初始权值训练网络等。

(2)权值过多:当隐藏节点越多,层数越多时,权值成倍的增长。权值的增长意味着对应的空间的维数越高,过高的维数易导致训练后期的过拟合。

(3)过拟合:当网络的训练次数过多时,可能会出现过拟合的情况。解决过拟合主要两种方法:一种是使用权值衰减的方式,即每次迭代过程中以某个较小的因子降低每个权值;另一种方法就是使用验证集的方式来找出使得验证集误差最小的权值,对训练集较小时可以使用交叉验证等。

(4)算法终止策略:当迭代次数达到设定的阀值时,或者损失函数小于设定的阀值时。

结果显示:训练集高,测试集低,稍微有点过拟合。

处理过拟合的方法:1.减少特征个数 2.增加lamda的值。

实验三 多层神经网络相关推荐

  1. MATLAB实现智能计算方法实验:实验三 BP神经网络

    资源链接 MATLAB实现智能计算方法课程所有实验代码资源链接为:MATLAB实现智能计算方法课程所有实验代码资源 本实验代码和excel文件可在GitHub仓库和gitee仓库中进行下载 实验汇总 ...

  2. 【神经网络实验】Numpy手写多层神经网络

    引言 这个作业的目的是给你们介绍建立,训练和测试神经系统网络模型.您不仅将接触到使用Python包构建神经系统网络从无到有,还有数学方面的反向传播和梯度下降.但在实际情况下,你不一定要实现神经网络从零 ...

  3. 机器学习——人工神经网络之多层神经网络(多层与三层)

    目录 一.多层神经网络 1.多层神经网络数学模型 2.数学模型中的非线性函数fai 1)非线性函数fai存在的意义 2)非线性函数fai具体是什么? 3.多层神经网络与单层神经网络的区别与改进 1)单 ...

  4. NNDL 实验五 前馈神经网络(2)自动梯度计算 优化问题

    目录 4.3 自动梯度计算 1. 使用pytorch的预定义算子来重新实现二分类任务.(必做) 4.3.1 利用预定义算子重新实现前馈神经网络 4.3.2 完善Runner类 4.3.3 模型训练 4 ...

  5. matlab 求obb,实验六MATLAB神经网络工具箱DOC

    实验六MATLAB神经网络工具箱DOC 实验七MATLAB神经网络工具箱一.实验目的1.掌握 Matlab 对感知器网络的构建与训练方法.2.掌握 Matlab 对线性神经网络的构建与训练方法.3.掌 ...

  6. 机器学习 实验三 手写汉字识别

    机器学习 实验三 手写汉字识别 一.实验环境 PC机,Python 二.代码 一.使用神经网络 #%% import pandas as pd import tensorflow as tf impo ...

  7. 【神经网络】tensorflow实验10 -- 人工神经网络(1)

    1. 实验目的 ①理解并掌握误差反向传播算法: ②能够使用单层和多层神经网络,完成多分类任务: ③了解常用的激活函数. 2. 实验内容 ①设计单层和多层神经网络结构,并使用TensorFlow建立模型 ...

  8. TensorFlow基础10-(误差反向传播算法以及实现多层神经网络)

    记录TensorFlow听课笔记 文章目录 记录TensorFlow听课笔记 一,误差反向传播算法 二,链式求导法则 三,隐含层有多个神经元的误差反向传播 四,激活函数 五,实现多层神经网络 一,误差 ...

  9. 理解神经网络,从简单的例子开始(2)使用python建立多层神经网络

    这篇文章将讲解如何使用python建立多层神经网络.在阅读这篇文章之前,建议先阅读上一篇文章:理解神经网络,从简单的例子开始.讲解的是单层的神经网络.如果你已经阅读了上一篇文章,你会发现这篇文章的代码 ...

最新文章

  1. 7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------剑指offer系列
  2. 软件性能测试类型和指标
  3. 实现OC与JS的交互
  4. Python模块——subprocess
  5. MySQL学习笔记(二)—— MySQL的安装
  6. qt创建图形项,添加自定义窗口
  7. 先序abdfcegh 中序bfdagehc 后序线索二叉树_二叉树的遍历(先序、中序、后序、层序)...
  8. TensorFlow 2.0开发者预览版放出!上手尝鲜可以开始了
  9. Android 4.3 新特性
  10. linux 进程意外关闭,Webdriver异常:进程意外关闭,状态为1
  11. Java Lambda
  12. 极光推送源码api封装改造
  13. UART串口通信协议详解
  14. android获取app使用时间,android如何获取系统里各个应用的使用时间
  15. 什么是强化学习?(贝尔曼方程)
  16. 我的单车游记:向西,向西,到栖霞去(一)
  17. APP 微信支付java后台代码(解决支付失败返回-1)
  18. yum-utils与yum-config-manager
  19. 最优化方法:非线性方程的求极值方法
  20. 爬虫——爬取网页数据存入表格

热门文章

  1. pcie台式网卡无法开热点
  2. 程序化交易的基本特点分析
  3. 计算机硬盘没显示,移动硬盘不显示在我的电脑
  4. PHP图片压缩到指定的大小
  5. 如何在众多快递物流中筛选出代收的单号
  6. 抽奖机(用随机数)2.0-python
  7. 打印机扫描计算机远程扫描仪,未在设备上将扫描类型设置为(远程扫描仪)的解决方法...
  8. tensorflow sess.run()
  9. mysql特殊符号无法储存_解决MYSQL数据库无法保存emoji表情及特殊符号问题
  10. Android UI系列之侧滑粘稠效果的实现