深层神经网络示例

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

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 pltplt.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, classesdef sigmoid(Z):A = 1 / (1 + np.exp(-Z))return Adef relu(Z):A = np.maximum(0, Z)assert (A.shape == Z.shape)return Adef initialize_parameters_deep(layers_dims):""":param layers_dims: list of neuron numexample: 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,b2def linear_forward(A, W, b):"""线性前向传播"""Z = np.dot(W, A) + bassert (Z.shape == (W.shape[0], A.shape[1]))return Zdef 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, cachedef L_model_forward(X, parameters):"""前向传播:param X: 输入特征:param parameters: 每一层的初始化w,b"""caches = []A = XL = len(parameters) // 2  # W1,b1,W2,b2, L=2for l in range(1, L):A_prev = AA, 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, cachesdef 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 costdef linear_backward(dZ, cache):""":param dZ: 后面一层的dZ:param cache: 前向传播保存下来的本层的变量:return 本层的dw、db,前一层da"""A_prew, W, b = cachem = A_prew.shape[1]dW = np.dot(dZ, A_prew.T) / mdb = np.sum(dZ, axis=1, keepdims=True) / mdA_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, dbdef linear_activation_backward(dA, cache, activation):""":param dA: 本层的dA:param cache: 前向传播保存的本层的变量:param activation: 激活函数:"sigmoid"或"relu":return 本层的dw、db,前一次的dA"""linear_cache, Z = cache# 首先计算本层的dZif activation == 'relu':dZ = 1 * dAdZ[Z <= 0] = 0elif 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以及前一层的dAdA_prev, dW, db = linear_backward(dZ, linear_cache)return dA_prev, dW, dbdef L_model_backward(AL, Y, caches):""":param AL: 最后一层A:param Y: 真实标签:param caches: 前向传播的保存的每一层的相关变量  (A_prev, W, b),Z"""grads = {}L = len(caches)  # 2Y = Y.reshape(AL.shape)  # 让真实标签与预测标签的维度一致dAL = -np.divide(Y, AL) + np.divide(1 - Y, 1 - AL)  # dA2# 计算最后一层的dW和db,由成本函数来计算current_cache = caches[-1]  # 1,2grads[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 gradsdef update_parameters(parameters, grads, learning_rate):L = len(parameters) // 2for l in range(1, L + 1):parameters[f"W{l}"] = parameters[f"W{l}"] - grads[f"dW{l}"] * learning_rateparameters[f"b{l}"] = parameters[f"b{l}"] - grads[f"db{l}"] * learning_ratereturn parametersdef 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 parametersdef predict(X, parameters):m = X.shape[1]n = len(parameters) // 2p = np.zeros((1, m))probas, caches = L_model_forward(X, parameters)# 将预测结果转化成0和1的形式,即大于0.5的就是1,否则就是0for i in range(0, probas.shape[1]):if probas[0, i] > 0.5:p[0, i] = 1else:p[0, i] = 0return pif __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).Ttest_set_x_flatten = test_set_x_orig.reshape(test_set_x_orig.shape[0], -1).Tprint("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 / 255test_set_x = test_set_x_flatten / 255layers_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])))

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【BUG】已解决:ModuleNotFoundError: No module named ‘PIL‘

已解决&#xff1a;ModuleNotFoundError: No module named ‘PIL‘ 目录 已解决&#xff1a;ModuleNotFoundError: No module named ‘PIL‘ 【常见模块错误】 错误原因&#xff1a; 解决办法&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我…

时序数据库如何选型?详细指标总结!

工业物联网场景&#xff0c;如何判断什么才是好的时序数据库&#xff1f; 工业物联网将机器设备、控制系统与信息系统、业务过程连接起来&#xff0c;利用海量数据进行分析决策&#xff0c;是智能制造的基础设施&#xff0c;并影响整个工业价值链。工业物联网机器设备感知形成了…

《Techporters架构搭建》-Day02 集成Mybatis-plus

集成Mybatis-plus Mybatis-plus集成Mybatis-plus步骤小结 Mybatis-plus Mybatis-plus官网 MyBatisPlus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。它引入了一些新的特性&…

CSRF+XSS组合攻击实战

目录 0x01安装靶场 0x02分析功能点的请求接口&#xff0c;构造恶意请求 0x03寻找xss漏洞 0x01安装靶场 下载源码&#xff0c;解压到网站根目录 1.修改数据库配置文件 打开源码&#xff0c;进入到include目录下&#xff0c;打开数据库配置文件database.inc.php 将数据库的…

Template_C++

C模板 C提供了function template. function template&#xff1a;实际上是建立一个通用函数&#xff0c;其函数类型和形参类型不具体制定&#xff0c;用一个虚拟的类型来代表。这个通用的函数就称为函数模版。 是不是可以这样理解&#xff0c;函数模版就是给了一种功能&…

Keil开发IDE

Keil开发IDE 简述Keil C51Keil ARMMDK DFP安装 简述 Keil公司是一家业界领先的微控制器&#xff08;MCU&#xff09;软件开发工具的独立供应商。Keil公司由两家私人公司联合运营&#xff0c;分别是德国慕尼黑的Keil Elektronik GmbH和美国德克萨斯的Keil Software Inc。Keil公…

WebRTC音视频-环境搭建

目录 期望效果 1:虚拟机和系统安装 2:WebRTC客户端环境搭建 2.1&#xff1a;VScode安装 2.2&#xff1a;MobaXterm安装 3:WebRTC服务器环境搭建 3.1&#xff1a;安装openssh服务器 3.2&#xff1a;安装Node.js 3.3&#xff1a;coturn穿透和转发服务器 3.3.1&a…

全国数据智能与智慧政务行业产教融合共同体学术年会暨广东行政职业学院(广东青年职业学院)第一届“求是论坛”成功举办

为进一步深化现代职业教育体系建设理论研究&#xff0c;丰富行业产教融合共同体实践探索&#xff0c;7月13日&#xff0c;全国数据智能与智慧政务行业产教融合共同体学术年会暨广东行政职业学院&#xff08;广东青年职业学院&#xff09;第一届“求是论坛”在广东行政职业学院&…

【iOS】static、extern、const、auto关键字以及联合使用

目录 前言extern关键字static关键字const关键字 联合使用static和externstatic和constextern和const auto关键字 先了解一下静态变量所在的全局/静态区的特点&#xff1a;【iOS】内存五大分区 前言 上面提到的全局/静态区中存放的是全局变量或静态变量&#xff1a; 全局变量…

LabVIEW软件开发的雷区在哪里?

在LabVIEW软件开发中&#xff0c;有几个需要注意的雷区&#xff0c;以避免常见的错误和提高开发效率&#xff1a; 1. 不良的代码结构 雷区&#xff1a;混乱的代码结构和不清晰的程序逻辑。 后果&#xff1a;导致难以维护和调试的代码&#xff0c;增加了错误和故障的风险。 …

AI算法18-最小角回归算法Least Angle Regression | LARS

​​​ 最小角回归算法简介 最小角回归&#xff08;Least Angle Regression, LAR&#xff09;是一种用于回归分析的统计方法&#xff0c;它在某些方面类似于最小二乘回归&#xff0c;但提供了一些额外的优点。最小角回归由Bradley Efron等人提出&#xff0c;主要用于处理具有…

Leetcode双指针法应用

1.双指针法 文章目录 1.双指针法1.1什么是双指针法&#xff1f;1.2解题思路1.3扩展 1.1什么是双指针法&#xff1f; 双指针算法是一种在数组或序列上操作的技巧&#xff0c;实际上是对暴力枚举算法的一种优化&#xff0c;通常涉及到两个索引&#xff08;或指针&#xff09;从两…

【D3.js in Action 3 精译_020】2.6 用 D3 设置与修改元素样式 + 名人专访(Nadieh Bremer)+ 2.7 本章小结

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可视化最佳实践&#xff08;下&#xff09;1.4 本章小结 第二章…

Chromium CI/CD 之Jenkins实用指南2024-在Windows节点上创建任务(九)

1. 引言 在现代软件开发流程中&#xff0c;持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;已成为确保代码质量和加速发布周期的关键实践。Jenkins作为一款广泛应用的开源自动化服务器&#xff0c;通过其强大的插件生态系统和灵活的配置选项&#xf…

Spring Boot项目中使用MyBatis Generator (MBG) 自动生成Mapper文件

Spring Boot项目中使用MyBatis Generator (MBG) 自动生成Mapper文件可以很大程度上减少编码。本文着重介绍如何在实战中使用MGB自动生成Mapper文件 1. 添加MyBatis Generator依赖 在pom.xml中添加必要的依赖 <dependency><groupId>org.mybatis.spring.boot</…

如何在Linux上部署Ruby on Rails应用程序

在Linux上部署Ruby on Rails应用程序是一个相对复杂的过程&#xff0c;需要按照一系列步骤进行。下面是一个基本的部署过程&#xff0c;涵盖了从安装所需软件到部署应用程序的所有步骤。 安装必要的软件 在部署Ruby on Rails应用程序之前&#xff0c;需要确保Linux系统上安装了…

【LeetCode】day15:110 - 平衡二叉树, 257 - 二叉树的所有路径, 404 - 左叶子之和, 222 - 完全二叉树的节点个数

LeetCode 代码随想录跟练 Day15 110.平衡二叉树257.二叉树的所有路径404.左叶子之和222.完全二叉树的节点个数 110.平衡二叉树 题目描述&#xff1a; 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 平衡二叉树的定义是&#xff0c;对于树中的每个节点&#xff0c;其左右…

三、初识C语言(3)

1.操作符 &#xff08;1&#xff09;算术操作符 - * / % 商 余&#xff08;取模&#xff09; 小算法&#xff1a; 若a<b&#xff0c;则a%b a 若a%b c&#xff0c;则0 < c < b-1 若两个int 类型数相除&#xff0c;结果有小数会被舍弃。 保留小数…

阿里云 申请免费ssl 证书

1控制台--数字证书管理服务 2 创建所需域名证书

下载安装VSCode并添加插件作为仓颉编程入门编辑器

VSCode下载地址&#xff1a;下载 Visual Studio Code - Mac、Linux、Windows 插件下载&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 仓颉社区中下载解压 cangjie.vsix 插件 打开VSCode 按 Ctrl Shift X 弹出下图 按照上图步骤依次点击选中我们下…