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

该案例来自吴恩达深度学习系列课程一《神经网络和深度学习》第三周编程作业,作业内容是设计带有一个隐藏层的平面数据分类。作业提供的资料包括测试实例(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_dataset

X, 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_dataset

X, 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 = 4
    n_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.01
    b1 = np.random.rand(n_h, 1)
    W2 = np.random.rand(n_y, n_h) * 0.01
    b2 = 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) + b1
    A1 = np.tanh(Z1)
    Z2 = np.dot(W2, A1) + b2
    A2 = 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 - Y
    dW2 = (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 * dW1
    b1 = b1 - learning_rate * db1
    W2 = W2 - learning_rate * dW2
    b2 = b2 - learning_rate * db2

    parameters = {"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

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

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

相关文章

学习threejs,使用粒子实现下雪特效

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.Points简介1.11 ☘️…

在Excel中如何快速筛选非特定颜色

Excel中的自动筛选是个非常强大的工具,不仅可以筛选内容,而且可以筛选颜色,例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格(下图右侧所示),其他单元格的填充色不固定,有几种颜色…

llama.cpp基础知识与原理导读

llama.cpp 是一个轻量化的 C++ 实现,专注于 Meta 的 LLaMA 模型的推理和部署。该项目致力于在不依赖庞大的深度学习框架(如 PyTorch、TensorFlow 等)的情况下,实现对 LLaMA 模型的高效运行,特别是在资源受限的设备上(如个人电脑和手机)。以下是 llama.cpp 的主要工作原理…

【Android14 ShellTransitions】(八)播放动画

书接上回,话说当WMCore部分走到了Transition.onTransactionReady,计算完参与动画的目标,构建出TransitionInfo后,接下来就把这个包含了动画参与者的TransitionInfo发给了WMShell,然后就该播放动画了,这部分…

ELK + Filebeat + Spring Boot:日志分析入门与实践(二)

目录 一、环境 1.1 ELKF环境 1.2 版本 1.3 流程 二、Filebeat安装 2.1 安装 2.2 新增配置采集日志 三、logstash 配置 3.1 配置输出日志到es 3.2 Grok 日志格式解析 3.2 启动 logstash ​3.3 启动项目查看索引 一、环境 1.1 ELKF环境 springboot项目:w…

C#实现word和pdf格式互转

1、word转pdf 使用nuget: Microsoft.Office.Interop.Word winform页面: 后端代码: //using Spire.Doc; //using Spire.Pdf; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using Sy…

成都睿明智科技有限公司抖音电商服务的领航者

在这个短视频风起云涌的时代,抖音电商以其独特的魅力迅速崛起,成为无数商家争夺流量与销量的新战场。在这片红海之中,如何脱颖而出,实现销售额的飞跃?今天,就让我们一同走进成都睿明智科技有限公司&#xf…

力扣hot100-->递归/回溯

目录 递归/回溯 1. 17. 电话号码的字母组合 2. 22. 括号生成 3. 39. 组合总和 4. 46. 全排列 5. 78. 子集 递归/回溯 1. 17. 电话号码的字母组合 中等 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到…

快速遍历包含合并单元格的Word表格

Word中的合并表格如下,现在需要根据子类(例如:果汁)查找对应的品类,如果这是Excel表格,那么即使包含合并单元格,也很容易处理,但是使用Word VBA进行查找,就需要一些技巧。…

js 获取当前时间与前一个月时间

// 获取当前时间的毫秒数 var currentTimeMillis new Date().getTime();// 获取前一个月的Date对象 var dateLastMonth new Date(); dateLastMonth.setMonth(dateLastMonth.getMonth() - 1);// 获取前一个月的毫秒数 var timeMillisLastMonth dateLastMonth.getTime();conso…

C++之多态的深度剖析

目录 前言 1.多态的概念 2.多态的定义及实现 2.1多态的构成条件 2.1.1重要条件 2.1.2 虚函数 2.1.3 虚函数的重写/覆盖 2.1.4 选择题 2.1.5 虚函数其他知识 协变(了解) 析构函数的重写 override 和 final关键字 3. 重载,重写&…

【linux网络编程】| socket套接字 | 实现UDP协议聊天室

前言:本节内容将带友友们实现一个UDP协议的聊天室。 主要原理是客户端发送数据给服务端。 服务端将数据再转发给所有链接服务端的客户端。 所以, 我们主要就是要实现客户端以及服务端的逻辑代码。 那么, 接下来开始我们的学习吧。 ps:本节内容…

【PTA】4-2 树的同构【数据结构】

给定两棵树 T1​ 和 T2​。如果 T1​ 可以通过若干次左右孩子互换就变成 T2​,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。 图一…

「Mac畅玩鸿蒙与硬件13」鸿蒙UI组件篇3 - TextInput 组件获取用户输入

在鸿蒙应用开发中,TextInput 组件用于接收用户输入,适用于文本、密码等多种输入类型。本文详细介绍鸿蒙 TextInput 组件的使用方法,包括输入限制、样式设置、事件监听及搜索框应用,帮助你灵活处理鸿蒙应用中的用户输入。 关键词 TextInput 组件用户输入输入限制事件监听搜索…

单元测试详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 为什么需要单元测试? 从产品角度而言,常规的功能测试、系统测试都是站在产品局部或全局功能进行测试,能够很好地与用户的需…

如何从PPT中导出600dpi的高清图

Step1. 修改PPT注册表 具体过程,参见如下链接:修改ppt注册表,导出高分辨率图片 Step2. 打开PPT,找到自己想要保存的图,选中图像,查看图像尺寸并记录 Step3. 重新新建一个PPT,并根据记录的图片…

「Mac畅玩鸿蒙与硬件7」鸿蒙开发环境配置篇7 - 使用命令行工具和本地模拟器管理项目

本篇将讲解在 macOS 上配置 HarmonyOS 开发环境的流程,聚焦 hvigorw 命令行工具的使用。我们将以创建 HelloWorld 项目为例,演示使用 hvigorw 进行项目构建、清理操作,并通过 DevEco Studio 的本地模拟器进行预览,帮助提升项目开发…

Linux基础—基础命令及相关知识5(ubuntu网络配置)

网络的配置方法 centos网络配置 centos的网卡位置 /etc/sysconfig/network-scripts/ifcfg-ens33(centos网卡文件) bootproto表示获得IP地址的方式是静态的还是动态 onboot表示启动系统时是否激活该网络接口 设置IP地址,子网掩码,网关,dns…

LabVIEW开发的控制阀监控与维护系统

LabVIEW开发一套自动测试软件,用于控制阀的实时监控、数据采集、维护管理以及报警通知。此系统的目标是通过便捷的操作界面、可靠的通信接口和高效的数据管理,为工厂设备管理提供全面的支持。 1. 项目需求 目标是实现一个控制阀管理系统,能够…

第7章 利用CSS和多媒体美化页面作业

2.用表格布局页面&#xff0c;利用CSS技术&#xff0c;及添加多媒体&#xff0c;制作并美化“心灵之音”页面。 浏览效果如下&#xff1a; 实例代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>心灵…