深层神经网络示例

在这里插入图片描述
维度说明:

A[L]、Z[L]:(本层神经元个数、样本数)
W[L]:(本层神经元个数、上层神经元个数)
b[L]:(本层神经元个数、1)

dZ[L]:dA[L] * g’A(Z[L])
dZ[L]:(本层神经元个数、样本数)
dw = dL/dz * dz/dw = dz*x(链式法则)
db = dz(链式法则)
dW[L]:(本层神经元个数、上层神经元个数)
dA[L]:(本层神经元个数、样本数)
da = dz * w
dA[L-1] = W[L].T dZ[L],注意这里没有除以神经元个数,得到平均da。比如结果的第一个元素是多个dw1 * dz + dw1 * dz+ …dw1 * dz(神经元个数)的累加和

输出层采用sigmoid,隐藏层采用tanh

import numpy as np
# 设置一些画图相关的参数
import matplotlib.pyplot as plt

plt.rcParams['figure.figsize'] = (5.0, 4.0)
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
from project_03.utils.dnn_utils import *
from project_03.utils.testCases import *


def load_dataset():
    train_dataset = h5py.File('../deep_learn_01/project_01/datasets/train_catvnoncat.h5', 'r')
    train_set_x_orig = np.array(train_dataset['train_set_x'][:])
    train_set_y_orig = np.array(train_dataset["train_set_y"][:])  # 加载训练数据

    test_dataset = h5py.File('../deep_learn_01/project_01/datasets/test_catvnoncat.h5', "r")  # 加载测试数据
    test_set_x_orig = np.array(test_dataset["test_set_x"][:])
    test_set_y_orig = np.array(test_dataset["test_set_y"][:])

    classes = np.array(test_dataset["list_classes"][:])  # 加载标签类别数据,这里的类别只有两种,1代表有猫,0代表无猫

    train_set_y_orig = train_set_y_orig.reshape(
        (1, train_set_y_orig.shape[0]))  # 把数组的维度从(209,)变成(1, 209),这样好方便后面进行计算[1 1 0 1] -> [[1][1][0][1]]
    test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))  # 从(50,)变成(1, 50)
    return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes


def sigmoid(Z):
    A = 1 / (1 + np.exp(-Z))
    return A


def relu(Z):
    A = np.maximum(0, Z)
    assert (A.shape == Z.shape)
    return A


def initialize_parameters_deep(layers_dims):
    """
    :param layers_dims: list of neuron num
    example: layer_dims=[5,4,3],表示输入层有5个神经元,第一层有4个,最后二层有3个神经元(还有输出层的1个神经元)
    :return: parameters: the w,b of each layer
    """
    np.random.seed(1)
    parameters = {}
    L = len(layers_dims)
    for l in range(1, L):
        parameters[f"W{l}"] = np.random.randn(layers_dims[l], layers_dims[l - 1]) / np.sqrt(layers_dims[l - 1])
        parameters[f"b{l}"] = np.zeros((layers_dims[l], 1))
        assert (parameters[f"W{l}"].shape == (layers_dims[l], layers_dims[l - 1]))
        assert (parameters[f"b{l}"].shape == (layers_dims[l], 1))
    return parameters  # W1,b1,W2,b2


def linear_forward(A, W, b):
    """
    线性前向传播
    """
    Z = np.dot(W, A) + b
    assert (Z.shape == (W.shape[0], A.shape[1]))
    return Z


def linear_activation_forward(A_prev, W, b, activation):
    """
    :param A_prev: 上一层得到的A,输入到本层来计算本层的Z和A,第一层时A_prev就是输入X
    :param W:本层的w
    :param b:本层的b
    :param activation: 激活函数
    """
    Z = linear_forward(A_prev, W, b)
    if activation == "sigmoid":
        A = sigmoid(Z)
    elif activation == "relu":
        A = relu(Z)
    else:
        assert (1 != 1), "there is no support activation!"
    assert (A.shape == (W.shape[0], A_prev.shape[1]))
    linear_cache = (A_prev, W, b)
    cache = (linear_cache, Z)
    return A, cache


def L_model_forward(X, parameters):
    """
    前向传播
    :param X: 输入特征
    :param parameters: 每一层的初始化w,b
    """
    caches = []
    A = X
    L = len(parameters) // 2  # W1,b1,W2,b2, L=2
    for l in range(1, L):
        A_prev = A
        A, cache = linear_activation_forward(A_prev, parameters[f"W{l}"], parameters[f"b{l}"], 'relu')
        caches.append(cache)  # A1,(X,W1,b1,Z1)
    AL, cache = linear_activation_forward(A, parameters[f"W{L}"], parameters[f"b{L}"], activation="sigmoid")
    caches.append(cache)  # A2,(A1,W2,b2,Z2)
    assert (AL.shape == (1, X.shape[1]))
    return AL, caches


def compute_cost(AL, Y):
    m = Y.shape[1]
    logprobs = np.multiply(Y, np.log(AL)) + np.multiply((1 - Y), np.log(1 - AL))
    cost = (-1 / m) * np.sum(logprobs)
    assert (cost.shape == ())
    return cost


def linear_backward(dZ, cache):
    """
    :param dZ: 后面一层的dZ
    :param cache: 前向传播保存下来的本层的变量
    :return 本层的dw、db,前一层da
    """
    A_prew, W, b = cache
    m = A_prew.shape[1]

    dW = np.dot(dZ, A_prew.T) / m
    db = np.sum(dZ, axis=1, keepdims=True) / m
    dA_prev = np.dot(W.T, dZ)

    assert (dA_prev.shape == A_prew.shape)
    assert (dW.shape == W.shape)
    assert (db.shape == b.shape)
    return dA_prev, dW, db


def linear_activation_backward(dA, cache, activation):
    """
    :param dA: 本层的dA
    :param cache: 前向传播保存的本层的变量
    :param activation: 激活函数:"sigmoid"或"relu"
    :return 本层的dw、db,前一次的dA
    """
    linear_cache, Z = cache
    # 首先计算本层的dZ
    if activation == 'relu':
        dZ = 1 * dA
        dZ[Z <= 0] = 0
    elif activation == 'sigmoid':
        A = sigmoid(Z)
        dZ = dA * A * (1 - A)
    else:
        assert (1 != 1), "there is no support activation!"
    assert (dZ.shape == Z.shape)
    # 这里我们又顺带根据本层的dZ算出本层的dW和db以及前一层的dA
    dA_prev, dW, db = linear_backward(dZ, linear_cache)
    return dA_prev, dW, db


def L_model_backward(AL, Y, caches):
    """
    :param AL: 最后一层A
    :param Y: 真实标签
    :param caches: 前向传播的保存的每一层的相关变量  (A_prev, W, b),Z
    """
    grads = {}
    L = len(caches)  # 2
    Y = Y.reshape(AL.shape)  # 让真实标签与预测标签的维度一致

    dAL = -np.divide(Y, AL) + np.divide(1 - Y, 1 - AL)  # dA2
    # 计算最后一层的dW和db,由成本函数来计算
    current_cache = caches[-1]  # 1,2
    grads[f"dA{L - 1}"], grads[f"dW{L}"], grads[f"db{L}"] = linear_activation_backward(dAL, current_cache,
                                                                                       "sigmoid")  # dA1, dW2, db2
    # 计算前L-1层的dw和db,因为最后一层用的是sigmoid,
    for c in reversed(range(1, L)):  # reversed(range(1,L))的结果是L-1,L-2...1。是不包括L的。第0层是输入层,不必计算。 caches[0,1] L = 2  1,1
        # c表示当前层
        grads[f"dA{c - 1}"], grads[f"dW{c}"], grads[f"db{c}"] = linear_activation_backward(grads[f"dA{c}"],
                                                                                           caches[c - 1],
                                                                                           "relu")
    return grads


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


def dnn_model(X, Y, layers_dim, learning_rate=0.0075, num_iterations=3000, print_cost=False):
    np.random.seed(1)
    costs = []
    parameters = initialize_parameters_deep(layers_dim)
    for i in range(0, num_iterations):
        AL, caches = L_model_forward(X, parameters)
        cost = compute_cost(AL, Y)
        grads = L_model_backward(AL, Y, caches)
        parameters = update_parameters(parameters, grads, learning_rate)
        if print_cost and i % 100 == 0:
            print("训练%i次后成本是: %f" % (i, cost))
        costs.append(cost)
    # 画出成本曲线图
    plt.plot(np.squeeze(costs))
    plt.ylabel('cost')
    plt.xlabel('iterations (per tens)')
    plt.title("Learning rate =" + str(learning_rate))
    plt.show()
    return parameters


def predict(X, parameters):
    m = X.shape[1]
    n = len(parameters) // 2
    p = np.zeros((1, m))
    probas, caches = L_model_forward(X, parameters)
    # 将预测结果转化成0和1的形式,即大于0.5的就是1,否则就是0
    for i in range(0, probas.shape[1]):
        if probas[0, i] > 0.5:
            p[0, i] = 1
        else:
            p[0, i] = 0

    return p


if __name__ == "__main__":
    train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()
    # 我们要清楚变量的维度,否则后面会出很多问题。下面我把他们的维度打印出来。

    train_set_x_flatten = train_set_x_orig.reshape(train_set_x_orig.shape[0], -1).T
    test_set_x_flatten = test_set_x_orig.reshape(test_set_x_orig.shape[0], -1).T
    print("train_set_x_flatten shape: " + str(train_set_x_flatten.shape))
    print("test_set_x_flatten shape: " + str(test_set_x_flatten.shape))

    train_set_x = train_set_x_flatten / 255
    test_set_x = test_set_x_flatten / 255

    layers_dims = [12288, 20, 7, 5, 1]
    # 根据上面的层次信息来构建一个深度神经网络,并且用之前加载的数据集来训练这个神经网络,得出训练后的参数
    parameters = dnn_model(train_set_x, train_set_y, layers_dims, num_iterations=2000, print_cost=True)
    # 对训练数据集进行预测
    pred_train = predict(train_set_x, parameters)
    print("预测准确率是: " + str(np.sum((pred_train == train_set_y) / train_set_x.shape[1])))

    # 对测试数据集进行预测
    pred_test = predict(test_set_x, parameters)
    print("预测准确率是: " + str(np.sum((pred_test == test_set_y) / test_set_x.shape[1])))

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 513. 找树左下角的值

给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7提示: 二叉树的节点个数的范围是 [1,104]-231 < Node.val &…

python的字符串

字符串 简单操作 创建 利用 ‘ ’ 或 “ ” 将字符或数字包裹起来的都为字符串 a"你好" 格式化字符串 元组的字符格式化 字符串格式化函数 srt.format() f格式化 方法 split()//指定分割符经行分割 strip()//指定移除字符头尾的字符 join()//指定序列中的字符连接成新…

Java 设计模式系列:外观模式

简介 外观模式&#xff08;Facade Pattern&#xff09;是一种设计模式&#xff0c;又名门面模式&#xff0c;是一种通过为多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口&#xff0c;外部应用程序不用关心内部…

Redis系列命令更新--Redis哈希命令

一、设置密码验证&#xff1a; 使用文本编辑器&#xff0c;这里使用Notepad&#xff0c;打开Redis服务配置文件。 注意&#xff1a;不要找错了&#xff0c;通常为redis.windows-service.conf&#xff0c;而不是redis.windows.conf。后者是以非系统服务方式启动程序使用的配置…

2-33 基于matlab的用于计算无故障的斜齿轮对啮合时接触线长度随时间的变化

基于matlab的用于计算无故障的斜齿轮对啮合时接触线长度随时间的变化&#xff0c;根据需求设置斜齿轮对的相应参数&#xff0c;得到结果。程序已调通&#xff0c;可直接运行。 2-33 斜齿轮对啮合时接触线长度 齿轮参数 - 小红书 (xiaohongshu.com)

【日常记录】【CSS】display:inline 的样式截断

文章目录 1. 案例2. css属性&#xff1a;box-decoration-break参考地址 1. 案例 现在有一篇文章&#xff0c;某些句子&#xff0c;是要被标记的&#xff0c;加一些css 让他突出一下 可以看到&#xff0c;在最后&#xff0c;断开了&#xff0c;那如若要让 断开哪里的样式 和 开始…

《C专家编程》杂谈

库函数调用和系统调用的区别 系统调用比函数调用要慢很多&#xff0c;因为还要切换到内核模式。

时域分析----移动平均滤波器介绍及其在金融应用示例

介绍 移动平均滤波器&#xff08;Moving Average Filter&#xff09;是一种基本但功能强大的信号处理技术&#xff0c;广泛应用于各种数据平滑和去噪任务中。其主要目的是通过对数据进行平均处理&#xff0c;减少随机波动和噪声&#xff0c;从而突出数据中的趋势和规律。移动平…

二进制成分分析软件(组件漏洞扫描)

免费试用软件 华为云腾讯云 华为云 进入二进制成分分析页面 二进制扫描地址 一个账号免费扫描5次 腾讯云 进入二进制成分分析页面 二进制扫描地址 免费300M流量 其他二进制分析软件 推荐使用悬镜、墨菲安全&#xff0c;支持IDEA插件&#xff0c;在线分析maven依赖。 …

操作系统真象还原:文件描述符简介

14.3 文件描述符简介 14.3.1 文件描述符原理 inode 是操作系统为自己的文件系统准备的数据结构&#xff0c;它用于文件存储的管理&#xff0c;与用户关系不大&#xff0c;咱们要介绍的文件描述符才是与用户息息相关的。 文件描述符即 file descriptor&#xff0c;但凡叫“描…

【周末闲谈】Stable Diffusion会魔法的绘画师

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言Stable Diffusion介绍 使用ComfyUI 和 WebUIComfyUIWebUI 配置需求 Stable Diffusion资源分享吐司AiAUTOMATIC1111Civitai绘世整合包Nenly同学stability.ai 前言 在很早之前&…

【前端项目笔记】10 项目优化上线

项目优化上线 目标&#xff1a;优化Vue项目部署Vue项目&#xff08;上线提供使用&#xff09; 项目优化 项目优化策略&#xff1a; 生成打包报告&#xff1a;根据生成的报告发现问题并解决第三方库启用CDN&#xff1a;提高首屏页面的加载效率Element-UI组件按需加载路由懒加…

Django 删除所有数据

1&#xff0c;添加模型 Test/app11/models.py from django.db import modelsclass Post(models.Model):title models.CharField(max_length200)content models.TextField()pub_date models.DateTimeField(date published)class Book(models.Model):title models.CharFiel…

优势洗牌(田忌赛马

Nums2的位置不能改变&#xff0c;所以用优先队列&#xff0c;存储索引的同时弄出最大值&#xff0c;nums1用双指针排序&#xff0c;因为它位置可以比变化。 对nums2进行最大堆排序&#xff0c;存储索引位置和值 Nums1 sort排序即可。 class Solution {public int[] advantag…

Go:基本变量与数据类型

目录 前言 前期准备 Hello World! 一、基本变量 1.1 声明变量 1.2 初始化变量 1.3 变量声明到初始化的过程 1.4 变量值交换 1.5 匿名变量 1.6 变量的作用域 二、数据类型 1.1 整型 1.2 浮点型 1.3 字符串 1.4 布尔类型 1.5 数据类型判断 1.6 数据类型转换 1.…

Linux系列--用户、文件管理

一、概述 Linux系统中超级用户是root&#xff0c;通过超级用户root可以创建其它的普通用户&#xff0c;Linux是一个支持多用户的操作系统。在实际使用中&#xff0c;一般会分配给开发人员专属的账户&#xff0c;这个账户只拥有部分权限&#xff0c;如果权限太高&#xff0c;操作…

golang程序性能提升改进篇之文件的读写---第一篇

背景&#xff1a;接手的项目是golang开发的&#xff08;本人初次接触golang&#xff09;经常出现oom。这个程序是计算和io密集型&#xff0c;调用流量属于明显有波峰波谷&#xff0c;但是因为各种原因&#xff0c;当前无法快速通过serverless或者动态在高峰时段调整资源&#x…

持续学习的综述: 理论、方法与应用(三:泛化分析)

前文连接&#xff1a;持续学习的综述: 理论、方法与应用&#xff08;一&#xff09; 前文连接&#xff1a;持续学习的综述: 理论、方法与应用&#xff08;二&#xff1a;理论基础&#xff09; 泛化分析 目前持续学习的理论研究主要是在增量任务的训练集上进行的&#xff0c;假…

QT VTK 简单测试工程

目录 1 目录结构 2 文件源码 3 运行结果 4 报错及处理 使用编译好的VTK库进行测试 1 目录结构 2 文件源码 Pro文件 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. #…

STM32-寄存器点灯案例详解

本文以PA1引脚点亮LED灯为案例&#xff0c;解析了STM32寄存器操作的配置过程&#xff0c;以及从手册查询方法和寄存器配置步骤。 一、概念 1.十六进制和二进制之间相互转换关系 首先&#xff0c;需要了解十六进制和二进制之间的基本转换方法。十六进制是一种基数为16的数制&…