实验三 多层神经网络

news2024/12/30 3:10:06

一、实验目的

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的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android | Activity 启动流程分析

前言 Activity 类是 android 应用的关键组件,在日常开发中,绝对少不了组件。既然用了这么久,你知道他的启动流程🐴?作为一个应用层开发者,大多数人可能觉得学习这些对日常开发可能没有太大帮助。但是多了解…

P3386 【模板】二分图最大匹配——匈牙利算法

【模板】二分图最大匹配 题目描述 给定一个二分图,其左部点的个数为 nnn,右部点的个数为 mmm,边数为 eee,求其最大匹配的边数。 左部点从 111 至 nnn 编号,右部点从 111 至 mmm 编号。 输入格式 输入的第一行是三…

文件描述符表、文件结构表和文件节点(SylixOS 学习笔记-更新中)

文件描述符表、文件结构表和文件节点 文件描述符表:每个进程都维护着自己的一个文件描述符表,每个文件描述符占其中一。该表记录进程打开的文件相关信息,因文件描述符为进程所有,文件描述符表也为进程内共享;文件表结构…

CDGA|把握三个“着眼点”,实现数据要素治理市场高质量发展

12月19日,国家发改委发文解读《意见》时指出,数据要素安全治理作为数据基础制度的四大组成部分之一,贯穿数据流通交易的各个环节,涉及数据要素市场培育的方方面面,发挥着不可替代的重要作用既有利于保障国家数据安全&a…

视频网站节约 30% 成本的秘密在这里

今年,爱奇艺宣布2022年第一季度首次实现季度盈利,这是爱奇艺在过去三个季度中,毛利率持续增长,且运营费用持续下降带来的结果。长视频行业发展十几年来,一直深陷亏损旋涡。爱奇艺的首次实现季度盈利,也意味…

多重背包问题(详解二进制优化原理)

多重背包问题及优化(详解优化原理)一、问题描述二、思路分析1、状态转移方程(1)状态表示:(2)状态转移:2、循环设计三、代码模板1、朴素版2、优化版一、问题描述 二、思路分析 这道题…

JVM垃圾回收机制

目录 目录 前言 一. GC (垃圾回收机制) STW问题 二. GC 回收哪部分内存 三. 具体怎么回收 1. 先找出垃圾 a.引用计数 b. 可达性分析 2. 回收垃圾 a. 标记清除 b. 复制算法 c. 标记整理 d. 分代回收 前言 我们都知道 Java 运行时内存的各个区域. 对于程序计数器 …

数据库与身份认证:在项目中操作 MySQL

在项目中操作数据库的步骤 ①安装操作 MySQL 数据库的第三方模块(mysql) ②通过 mysql 模块连接到 MySQL 数据库 ③通过 mysql 模块执行 SQL 语句 安装与配置 mysql 模块 1. 安装 mysql 模块 mysql 模块是托管于 npm 上的第三方模块。它提供了在 Nod…

智能wifi小车-RGB三色LED灯驱动

RGB三色LED灯简介 RGB指的就是三基色光,R红色,G绿色,B蓝色。LED芯片所发出的光一般都是蓝光,都是要通过红 绿 蓝这三种颜色的荧光粉去调颜色的。RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜…

首创证券将在上交所上市:募资约19亿元,规模不及信达证券

12月22日,首创证券股份有限公司(下称“首创证券”,SH:601136)将在上海证券交易所主板上市。本次上市,首创证券的发行价格为7.07元/股,发行市盈率22.98倍,发行数量为2.73亿股,募资总额…

JavaSE14-数组

目录 1.数组基本用法 1.1.什么是数组 1.2.数组声明 1.3.数组的创建与初始化 1.3.1.基本类型数组 1.3.2.对象数组 1.4.数组的使用 1.4.1.获取长度 & 访问元素 1.4.2.遍历数组 2.数组作为方法的参数 2.1.基本用法 2.2.内存 2.3.引用 2.4.初识 JVM 内存区域划分…

怎么做现货白银的心理障碍

克服投资的心理障碍,是怎么做现货白银投资的关键。很多时候,技术分析是很简单的。一根K线,一条均线,就能够让人获利。但是为什么使用同样工具的人,却不能获利呢?为什么他们还要去追求一些特别复杂的分析系统…

四平方和(蓝桥杯C/C++B组真题详解)(三种做法)

目录 题目详细&#xff1a;​编辑 题目思路&#xff1a; 暴力&#xff1a; 代码详解&#xff1a; 哈希&#xff1a; 二分&#xff1a; 题目详细&#xff1a; 题目思路&#xff1a; 这个题目大家可能马上就可以想到暴力做 例如这样 暴力&#xff1a; #include<iost…

TensorFlow和Keras应如何选择?

前些年&#xff0c;深度学习领域的研究人员、开发人员和工程师必须经常做出一些选择&#xff1a; 我应该选择易于使用但自定义困难的 Keras 库&#xff1f;还是应该使用难度更大的 TensorFlow API&#xff0c;编写大量代码&#xff1f;&#xff08;更不用说一个不那么容易使用…

pyspark之sparksql数据交互

在pyspark中&#xff0c;使用sparksql进行mysql数据的读写处理&#xff0c;将程序保存为test.py #-*- coding: UTF-8 -*- # 设置python的默认编码 import sys reload(sys) sys.setdefaultencoding(utf-8) # Spark 初始化 from pyspark.sql import SQLContext, SparkSession, …

【推荐】DDD领域驱动设计和中台实践资料合集

Domain Driven Design&#xff08;简称 DDD&#xff09;&#xff0c;又称为领域驱动设计&#xff0c;起源于杰出软件建模专家Eric Evans在2003年发表的书籍《DOMAIN-DRINEN DESIGN —TACKLING COMPLEXITY IN THE HEART OF SOFTWARE》&#xff08;中文译名《领域驱动设计—软件核…

卓海科技冲刺创业板:拟募资5.47亿 相宇阳控制52.9%股权

雷递网 雷建平 12月20日无锡卓海科技股份有限公司&#xff08;简称&#xff1a;“卓海科技”&#xff09;日前递交招股书&#xff0c;准备在深交所创业板上市。卓海科技计划募资5.47亿元&#xff0c;其中&#xff0c;1.04亿元用于半导体前道量检测设备扩产项目&#xff0c;1.84…

ev_api_server:大事件node接口项目开发

Headline 大事件后台 API 项目&#xff0c;API 接口文档请参考 https://www.showdoc.cc/escook?page_id3707158761215217 1. 初始化 1.1 创建项目 新建 api_server 文件夹作为项目根目录&#xff0c;并在项目根目录中运行如下的命令&#xff0c;初始化包管理配置文件&#x…

尚医通-前端Vue学习(十)

目录&#xff1a; &#xff08;1&#xff09;node.js介绍 &#xff08;2&#xff09;npm包管理工具 &#xff08;3&#xff09;es6模块化 &#xff08;4&#xff09;babel转码器 &#xff08;5&#xff09;webpack打包工具 &#xff08;1&#xff09;node.js介绍 浏览器的…

Python使用pandas导入xlsx格式的excel文件内容

Python使用pandas导入xlsx格式的excel文件内容1. 基本导入2. 列标题与数据对齐3. 指定导入某个sheet4. 指定行索引5. 指定列索引6. 指定导入列7. 指定导入的行数8. 更多的参数1. 基本导入 在 Python中使用pandas导入.xlsx文件的方法是read_excel()。 # codingutf-8 import pa…