深度学习案例:带有一个隐藏层的平面数据分类

该案例来自吴恩达深度学习系列课程一《神经网络和深度学习》第三周编程作业,作业内容是设计带有一个隐藏层的平面数据分类。作业提供的资料包括测试实例(testCases.py)和任务功能包(planar_utils.py),下载请移步参考链接一。

文章目录

  • 1 介绍
    • 1.1 案例应用核心公式
    • 1.2 涉及库和主要接口
  • 2 编码
    • 2.1 查看数据集相关参数
    • 2.2 简单逻辑回归应用效果
    • 2.3 搭建神经网络
    • 2.4 隐藏层单元数的变换
  • 3 调试
    • 3.1 运行时警告
    • 3.2 弃用警告
    • 3.3 数据转换警告
  • 4 参考

1 介绍

1.1 案例应用核心公式

两层神经网络的梯度下降

d W [ 1 ] = d J d W [ 1 ] dW^{[1]} = \frac{dJ}{dW^{[1]}} dW[1]=dW[1]dJ d b [ 1 ] = d J d b [ 1 ] db^{[1]} = \frac{dJ}{db^{[1]}} db[1]=db[1]dJ d W [ 2 ] = d J d W [ 2 ] {d}W^{[2]} = \frac{{dJ}}{dW^{[2]}} dW[2]=dW[2]dJ d b [ 2 ] = d J d b [ 2 ] {d}b^{[2]} = \frac{dJ}{db^{[2]}} db[2]=db[2]dJ

W [ 1 ] ⟹ W [ 1 ] − α d W [ 1 ] W^{[1]}\implies{W^{[1]} - \alpha dW^{[1]}} W[1]W[1]αdW[1] b [ 1 ] ⟹ b [ 1 ] − a d b [ 1 ] b^{[1]}\implies{b^{[1]} -adb^{[1]}} b[1]b[1]adb[1]

W [ 2 ] ⟹ W [ 2 ] − α d W [ 2 ] W^{[2]}\implies{W^{[2]} - \alpha{\rm d}W^{[2]}} W[2]W[2]αdW[2] b [ 2 ] ⟹ b [ 2 ] − a d b [ 2 ] b^{[2]}\implies{b^{[2]} - a{\rm d}b^{[2]}} b[2]b[2]adb[2]

正向传播(forward propagation)过程如下:

Z [ 1 ] ( n [ 1 ] , m ) = W [ 1 ] ( n [ 1 ] , n [ 0 ] ) X ( n [ 0 ] , m ) + b [ 1 ] ( n [ 1 ] , 1 ) → ( n [ 1 ] , m ) \underset{(n^{[1]}, m)}{Z^{[1]}} = \underset{(n^{[1]}, n^{[0]})}{W^{[1]}}\underset{(n^{[0]}, m)}{X} + \underset{(n^{[1]}, 1)\rightarrow(n^{[1]}, m)}{b^{[1]}} (n[1],m)Z[1]=(n[1],n[0])W[1](n[0],m)X+(n[1],1)(n[1],m)b[1]

A [ 1 ] ( n [ 1 ] , m ) = g [ 1 ] ( Z [ 1 ] ) \underset{(n^{[1]}, m)}{A^{[1]}}= g^{[1]}(Z^{[1]}) (n[1],m)A[1]=g[1](Z[1])

Z [ 2 ] ( n [ 2 ] , m ) = W [ 2 ] ( n [ 2 ] , n [ 1 ] ) A [ 1 ] ( n [ 1 ] , m ) + b [ 2 ] ( n [ 2 ] , 1 ) → ( n [ 2 ] , m ) \underset{(n^{[2]}, m)}{Z^{[2]}}= \underset{(n^{[2]}, n^{[1]})}{W^{[2]}}\underset{(n^{[1]}, m)}{A^{[1]}} + \underset{(n^{[2]}, 1)\rightarrow(n^{[2]}, m)}{b^{[2]}} (n[2],m)Z[2]=(n[2],n[1])W[2](n[1],m)A[1]+(n[2],1)(n[2],m)b[2]

A [ 2 ] ( n [ 2 ] , m ) = g [ 2 ] ( Z [ z ] ) = σ ( Z [ 2 ] ) \underset{(n^{[2]}, m)}{A^{[2]}} = g^{[2]}(Z^{[z]}) = \sigma(Z^{[2]}) (n[2],m)A[2]=g[2](Z[z])=σ(Z[2])

反向传播(back propagation)过程如下:

d Z [ 2 ] ( n [ 2 ] , m ) = A [ 2 ] − Y \underset{(n^{[2]}, m)}{dZ^{[2]}} = A^{[2]} - Y (n[2],m)dZ[2]=A[2]Y

d W [ 2 ] ( n [ 2 ] , n [ 1 ] ) = 1 m d Z [ 2 ] ( n [ 2 ] , m ) A [ 1 ] T ( m , n [ 1 ] ) \underset{(n^{[2]}, n^{[1]})}{dW^{[2]}} = {\frac{1}{m}}\underset{(n^{[2]}, m)}{dZ^{[2]}}\underset{(m,n^{[1]})}{A^{[1]T}} (n[2],n[1])dW[2]=m1(n[2],m)dZ[2](m,n[1])A[1]T

d b [ 2 ] ( n [ 2 ] , 1 ) = 1 m n p . s u m ( d Z [ 2 ] , a x i s = 1 , k e e p d i m s = T r u e ) \underset{(n^{[2]}, 1)}{db^{[2]}} = {\frac{1}{m}}np.sum(dZ^{[2]},axis=1,keepdims=True) (n[2],1)db[2]=m1np.sum(dZ[2],axis=1,keepdims=True)

d Z [ 1 ] ( n [ 1 ] , m ) = W [ 2 ] T ( n [ 1 ] , n [ 2 ] ) d Z [ 2 ] ( n [ 2 ] , m ) ∗ g [ 1 ] ′ ( Z [ 1 ] ) ( n [ 1 ] , m ) \underset{(n^{[1]},m)}{dZ^{[1]}}= \underset{(n^{[1]},n^{[2]})}{W^{[2]T}}\underset{(n^{[2]},m)}{{ d}Z^{[2]}}*\underset{(n^{[1]}, m)}{g^{[1]}{'}(Z^{[1]})} (n[1],m)dZ[1]=(n[1],n[2])W[2]T(n[2],m)dZ[2](n[1],m)g[1](Z[1])

d W [ 1 ] ( n [ 1 ] , n [ 0 ] ) = 1 m d Z [ 1 ] ( n [ 1 ] , m ) X T ( m , n [ 0 ] ) \underset{(n^{[1]}, n^{[0]})}{dW^{[1]}} = {\frac{1}{m}}\underset{(n^{[1]}, m)}{dZ^{[1]}}\underset{(m,n^{[0]})}{X^{T}} (n[1],n[0])dW[1]=m1(n[1],m)dZ[1](m,n[0])XT

d b [ 1 ] ( n [ 1 ] , 1 ) = 1 m n p . s u m ( d Z [ 1 ] , a x i s = 1 , k e e p d i m s = T r u e ) \underset{(n^{[1]},1)}{db^{[1]}} = {\frac{1}{m}}np.sum(dZ^{[1]},axis=1,keepdims=True) (n[1],1)db[1]=m1np.sum(dZ[1],axis=1,keepdims=True)

1.2 涉及库和主要接口

numpy:用Python进行科学计算的基本软件包。

numpy.round:均匀地四舍五入到给定的小数位数。

numpy.random.seed:设置随机数生成器的种子,可以使随机数的生成具有可重复性。

sklearn:为数据挖掘和数据分析提供的机器学习库。

sklearn.linear_model.LogisticRegressionCV:逻辑回归CV(又名logit,MaxEnt)分类器。

matplotlib:用于在Python中绘制图表的库。

matplotlib.pyplot.scatter:具有不同标记大小和/或颜色的y与x的散点图。


2 编码

2.1 查看数据集相关参数

check_data.py

import matplotlib.pyplot as plt
from planar_utils import load_planar_datasetX, Y = load_planar_dataset()  # 加载数据# 查看数据散点图
plt.scatter(X[0, :], X[1, :], c=Y, s=40, cmap=plt.cm.Spectral)
plt.show()# 计算和打印相关参数
print("X的维度为:" + str(X.shape))
print("Y的维度为:" + str(Y.shape))
print("数据集里的数据个数为:" + str(Y.shape[1]))

在这里插入图片描述

在这里插入图片描述

2.2 简单逻辑回归应用效果

logic_nn.py

import numpy as np
import matplotlib.pyplot as plt
import sklearn.linear_model
from planar_utils import plot_decision_boundary, load_planar_datasetX, Y = load_planar_dataset()# 搭建模型并训练
clf = sklearn.linear_model.LogisticRegressionCV()
clf.fit(X.T, Y.T)# 应用模型预测结果
predictions = clf.predict(X.T)
correct_predictions = ((np.dot(Y, predictions.T) + np.dot(1 - Y, 1 - predictions.T)) / float(Y.size)).reshape(1,)
print('准确率: %.2f' % (correct_predictions[0] * 100) + '%')# 绘制颜色块边界
plot_decision_boundary(lambda x: clf.predict(x), X, Y)
plt.title("Logistic Regression")
plt.show()

在这里插入图片描述

经过测试,准确性只有47%,原因是数据集不是线性可分的,所以逻辑回归表现不佳。

线性可分:指在特征空间中,存在一个超平面能够将不同类别的数据点完全分开,在二维空间中超平面表现为一条直线。

2.3 搭建神经网络

double_layer_nn.py

import numpy as np
import matplotlib.pyplot as plt
from planar_utils import plot_decision_boundary, sigmoid, load_planar_dataset# 层单元数量
def layer_sizes(X, Y):n_x = X.shape[0]n_h = 4n_y = Y.shape[0]return n_x, n_h, n_y# 初始化模型参数
def initialize_parameters(n_x, n_h, n_y):W1 = np.random.rand(n_h, n_x) * 0.01b1 = np.random.rand(n_h, 1)W2 = np.random.rand(n_y, n_h) * 0.01b2 = np.random.rand(n_y, 1)parameters = {"W1": W1, "b1": b1, "W2": W2, "b2": b2}return parameters# 前向传播
def forward_propagation(X, parameters):W1 = parameters["W1"]b1 = parameters["b1"]W2 = parameters["W2"]b2 = parameters["b2"]Z1 = np.dot(W1, X) + b1A1 = np.tanh(Z1)Z2 = np.dot(W2, A1) + b2A2 = sigmoid(Z2)cache = {"Z1": Z1, "A1": A1, "Z2": Z2, "A2": A2}return cache# 计算代价函数
def compute_cost(A2, Y):m = Y.shape[1]cost = (-1 / m) * np.sum(Y * np.log(A2) + (1 - Y) * np.log(1 - A2))cost = float(np.squeeze(cost))return cost# 反向传播
def backward_propagation(parameters, cache, X, Y):m = X.shape[1]W1 = parameters["W1"]W2 = parameters["W2"]A1 = cache["A1"]A2 = cache["A2"]dZ2 = A2 - YdW2 = (1 / m) * np.dot(dZ2, A1.T)db2 = (1 / m) * np.sum(dZ2, axis=1, keepdims=True)dZ1 = np.dot(W2.T, dZ2) * (1 - np.power(A1, 2))dW1 = (1 / m) * np.dot(dZ1, X.T)db1 = (1 / m) * np.sum(dZ1, axis=1, keepdims=True)grads = {"dW1": dW1, "db1": db1, "dW2": dW2, "db2": db2}return grads# 更新参数
def update_parameters(parameters, grads, learning_rate=1.2):W1 = parameters["W1"]b1 = parameters["b1"]W2 = parameters["W2"]b2 = parameters["b2"]dW1 = grads["dW1"]db1 = grads["db1"]dW2 = grads["dW2"]db2 = grads["db2"]W1 = W1 - learning_rate * dW1b1 = b1 - learning_rate * db1W2 = W2 - learning_rate * dW2b2 = b2 - learning_rate * db2parameters = {"W1": W1, "b1": b1, "W2": W2, "b2": b2}return parameters# 构建神经网络
def nn_model(X, Y, n_h, num_iterations, learning_rate=0.5, print_cost=False):n_x = layer_sizes(X, Y)[0]n_y = layer_sizes(X, Y)[2]parameters = initialize_parameters(n_x, n_h, n_y)for i in range(num_iterations):cache = forward_propagation(X, parameters)cost = compute_cost(cache["A2"], Y)grads = backward_propagation(parameters, cache, X, Y)parameters = update_parameters(parameters, grads, learning_rate)if print_cost and (i % 1000 == 0):print("第 %i 次循环,成本为: %f" % (i, cost))return parameters# 预测函数
def predict(parameters, X):cache = forward_propagation(X, parameters)predictions = np.round(cache["A2"])return predictions# 进行深度学习
X, Y = load_planar_dataset()
n_h = 4
parameters = nn_model(X, Y, n_h, num_iterations=10000, learning_rate=0.5, print_cost=True)
predictions = predict(parameters, X)
correct_predictions = ((np.dot(Y, predictions.T) + np.dot(1 - Y, 1 - predictions.T)) / float(Y.size)).reshape(1,)
print('准确率: %.2f' % (correct_predictions[0] * 100) + '%')# 绘制颜色块边界
plot_decision_boundary(lambda x: predict(parameters, x.T), X, Y)
plt.title("Decision Boundary for hidden layer size %i : %.2f " % (n_h, correct_predictions[0] * 100) + '%')
plt.show()

在这里插入图片描述

在这里插入图片描述

2.4 隐藏层单元数的变换

变换隐藏层的单元数量,观察对预测结果是否产生哪些影响。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

3 调试

3.1 运行时警告

E:\pythonPrograming\DLHomework\course1-week3\double_layer_nn.py:53: RuntimeWarning: divide by zero encountered in log

logprobs= np.multiply(np.log(A2), Y) + np.multiply((1 - Y), np.log(1 - A2))

E:\pythonPrograming\DLHomework\course1-week3\planar_utils.py:25: RuntimeWarning: overflow encountered in exp

s = 1/(1+np.exp(-x))

3.2 弃用警告

E:\pythonPrograming\DLHomework\course1-week3\double_layer_nn.py:135: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)

print ('准确率: %d' % float((np.dot(Y, predictions.T) + np.dot(1 - Y, 1 - predictions.T)) / float(Y.size) * 100) + '%')

3.3 数据转换警告

E:\pythonPrograming\DLHomework\course1-week3.venv\Lib\site-packages\sklearn\utils\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
y = column_or_1d(y, warn=True)

clf.fit(X.T, Y.T)

此处问题出现在逻辑回归效果 logic_nn.py 中,由于提供的 Y 值是一个二维数组,与函数所需的一维数组存在数据转换问题,可以人工使用ravel()flatten() 将 Y 转换为一维数组。


4 参考

【中文】【吴恩达课后编程作业】Course 1 - 神经网络和深度学习 - 第三周作业-CSDN博客

NumPy reference — NumPy v2.1 Manual

scikit-learn 1.5.2 documentation

API Reference — Matplotlib 3.9.2 documentation

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

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

相关文章

SD教程 重绘 ControlNet-Inpain

SD教程 重绘 ControlNet-Inpain ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/A1353192296/article/details/13…

【界面改版】JimuReport 积木报表 v1.9.0 版本发布,填报能力和大屏能力

项目介绍 积木报表JimuReport,是一款免费的数据可视化报表,含报表、仪表盘和大屏设计,像搭建积木一样完全在线设计!功能涵盖:数据报表、打印设计、图表报表、门户设计、大屏设计等! Web版报表设计器&#x…

【网络】1.UDP通信

UDP通信 1 server1.1 server建立的步骤1.2 运行server 2 client2.1 client的建立步骤2.2 运行client 3 总结3.1 server3.2 client 1 server server的启动方式是:./udpserver 8080 --> 格式就是./proc port端口 port端口自己指定 1.1 server建立的步骤 获取文件描…

告别冰冷机器声:GLM-4-Voice开启情感语音交互新时代!

目录 引言一、GLM-4-Voice概述二、GLM-4-Voice的架构三、GLM-4-Voice的主要功能四、GLM-4-Voice的技术原理五、GLM-4-Voice的应用场景六、GLM-4-Voice体验快速开始结语 引言 在人工智能的不断进步中,语音交互技术正逐渐成为人机沟通的重要桥梁。它不仅极大地提升了…

MySQL定时异机备份

场景:将A机器MySQL数据库部分表每日定时备份到B机器上 (只适用于Linux) 实现方式算是比简单了,就是用mysqldump生成文件,使用scp命令传输到另一台机器上。 1. 编写备份shell脚本 在A机器新建脚本 (当然没有vim的话vi…

使用VS2019将C#代码生成DLL文件在Unity3D里面使用(一)

系列文章目录 untiy知识点 文章目录 系列文章目录👉前言👉一、首先你要先有VS👉二、引用UnityAPI使用步骤👉2-1.引用unitydll文件到项目里面👉2-2.导入Dll文件 👉三、编辑dll代码👉四、导出dll…

平台化运营公司如何在创业市场招商

在当今商业环境中,平台化运营的公司正成为推动经济发展的重要力量。对于这类公司而言,在创业市场招商意义重大。 平台化运营公司具有独特特点:通过搭建开放共享平台连接供需双方,实现资源优化配置与价值创造。比如电子商务平台、社…

聚类分析算法——K-means聚类 详解

K-means 聚类是一种常用的基于距离的聚类算法,旨在将数据集划分为 个簇。算法的目标是最小化簇内的点到簇中心的距离总和。下面,我们将从 K-means 的底层原理、算法步骤、数学基础、距离度量方法、参数选择、优缺点 和 源代码实现 等角度进行详细解析。…

SpringMVC执行流程(视图阶段JSP、前后端分离阶段)、面试题

目录 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 3.前后端分离的项目SpringMVC执行流程 4. 面试题 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 流程图: 更加生动的描述: DisPatcherServlet…

十分钟Linux中的epoll机制

epoll机制 epoll是Linux内核提供的一种高效I/O事件通知机制,用于处理大量文件描述符的I/O操作。它适合高并发场景,如网络服务器、实时数据处理等,是select和poll的高效替代方案。 1. epoll的工作原理 epoll通过内核中的事件通知接口和文件…

GRE Over IPsec(华三)

GRE Over IPsec 顾名思义,GRE在内,IPsec在外 那么当数据进入tunnel隧道后,会先被GRE封装后再进行IPsec感兴趣流acl匹配,匹配上了则封装IPsec,没匹配上则丢包 实验: 需求:总部pc能够通过gre o…

echarts属性之xAxis

xAxis 直角坐标系 grid 中的 x 轴,一般情况下单个 grid 组件最多只能放上下两个 x 轴,多于两个 x 轴需要通过配置 offset 属性防止同个位置多个 x 轴的重叠。 所有属性 xAxis. id string 组件 ID。默认不指定。指定则可用于在 option 或者 API 中引…

盘点:2024年最新热门项目管理平台TOP11

一、项目管理平台的重要性 在当今竞争激烈的商业环境中,项目管理平台已成为企业提高效率和团队协作的关键工具。这主要是因为现代商业项目日益复杂,涉及多个部门、众多资源以及不断变化的需求。 首先,项目管理平台能够提高工作效率。例如&a…

PHP数据类型

几种常用的数据类型: String(字符串) Integer(整型) Float(浮点型) Boolean(布尔型) NULL(空值) Array(数组) Obje…

【大数据】Flink + Kafka 实现通用流式数据处理详解

目录 一、前言 二、流式数据处理场景介绍 2.1 流式数据处理概述 2.1.1 流式数据处理场景介绍 2.2 流式数据处理技术栈 2.2.1 数据采集 2.2.2 数据处理 2.2.3 数据存储 2.2.4 数据展示 2.3 流式数据处理场景面临的问题和挑战 三、通用的流式数据处理场景解决方案 3.1…

精准测试在基金团队应用实践

以下为作者观点: 一、引言 精准测试是一套计算机测试辅助分析系统,精准测试的核心组件包含,软件覆盖率分析、用例和代码的双向追踪、智能回归测试用例选取、缺陷定位、测试用例聚类分析、测试用例自动生成系统,这些功能完整的构…

参与国家标准制定对企业发展有哪些好处?

1. 提升企业竞争力: • 技术优势凸显:参与标准制定的过程中,企业能将自身先进的技术和管理理念融入标准,这不仅是对企业技术实力的认可,也能使企业在行业中占据技术制高点。 • 质量优势强化:国家标准对产品…

滚柱导轨出现异常损坏的原因

滚柱导轨是一种精密的直线滚动导轨,具有较高的承载能力和较高的刚性,对反复动作、起动、停止往复运动频率较高情况下可减少整机重量和传动机构及动力成本。滚柱导轨可获得较高的灵敏度和高性能的平面直线运动,在重载或变载的情况下&#xff0…

开发了一个成人学位英语助考微信小程序

微信小程序名称:石榴英语 全称:石榴英语真题助手 功能定位 北京成人学士学位英语辅助学习工具,包含记高频单词,高频词组,专项练习,模拟考试等功能。 开发背景 个人工作需要提高学习英文水平&#xff…

基于Matlab 火焰识别技术

Matlab 火焰识别技术 课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用,森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数,造成重大的损失。如果有一款监测软件,从硬件处获得的图像中监测是否有火焰&#xff…