1.3.浅层神经网络

目录

1.3.浅层神经网络

1.3.1 浅层神经网络表示 

1.3.2 单个样本的向量化表示

1.3.4 激活函数的选择

1.3.5 修改激活函数

1.3.5 练习​​​​​​​


1.3.浅层神经网络

1.3.1 浅层神经网络表示 

之前已经说过神经网络的结构了,在这不重复叙述。假设我们有如下结构的网络

对于这个网络我们建立一个简单的图示?我们对第一个隐藏层记为[1],输出层为[2]。如下图

计算图如下

  • 每个神经元的计算分解步骤如下
  • 第一层中的第一个神经元

  • 第一层中的第二个神经元

得出第一层的计算:

1.3.2 单个样本的向量化表示

那么现在把上面的第一层的计算过程过程用更简单的形式表现出来就是这样的计算

那么对于刚才我们所举的例子,将所有层通过向量把整个前向过程表示出来,并且确定每一个组成部分的形状

前向过程计算: 

那么如果有多个样本,需要这样去做

  • 多个样本的向量化表示

假设一样含有M个样本,那么上述过程变成

1.3.4 激活函数的选择

涉及到网络的优化时候,会有不同的激活函数选择有一个问题是神经网络的隐藏层和输出单元用什么激活函数。之前我们都是选用 sigmoid 函数,但有时其他函数的效果会好得多,大多数通过实践得来,没有很好的解释性。

可供选用的激活函数有:

  • 1.tanh 函数(the hyperbolic tangent function,双曲正切函数):

效果比 sigmoid 函数好,因为函数输出介于 -1 和 1 之间。

注 :tanh 函数存在和 sigmoid 函数一样的缺点:当 z 趋紧无穷大(或无穷小),导数的梯度(即函数的斜率)就趋紧于 0,这使得梯度算法的速度会减慢。

  • 2.ReLU 函数(the rectified linear unit,修正线性单元)

当 z > 0 时,梯度始终为 1,从而提高神经网络基于梯度算法的运算速度,收敛速度远大于 sigmoid 和 tanh。然而当 z < 0 时,梯度一直为 0,但是实际的运用中,该缺陷的影响不是很大。

  • Leaky ReLU(带泄漏的 ReLU):

Leaky ReLU 保证在 z < 0 的时候,梯度仍然不为 0。理论上来说,Leaky ReLU 有 ReLU 的所有优点,但在实际操作中没有证明总是好于 ReLU,因此不常用。

1.3.4.1 为什么需要非线性的激活函数

使用线性激活函数和不使用激活函数、直接使用 Logistic 回归没有区别,那么无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,就成了最原始的感知器了。

1.3.5 修改激活函数

将上述网络的隐层激活函数修改为tanh,最后一层同样还是二分类,所以激活函数选择依然是sigmoid函数

  • 前向传播

  • 反向传播梯度下降

那么通过这个计算图来理解这个过程,单个样本的导数推导过程:

1.3.5 练习


import numpy as np
import matplotlib.pyplot as plt
import sklearn
import sklearn.datasets
import sklearn.linear_model
from load_dataset import load_planar_datasetX, Y = load_planar_dataset()print ('数据集特征值的形状:', X.shape)
print ('数据集目标值的:', Y.shape)
print ('样本数:', X.shape[1])def sigmoid(x):""""""s = 1/(1+np.exp(-x))return s* 步骤* 定义网络结构* 初始化参数* 循环一下步骤* 前向传播* 计算损失* 反向传播获得梯度* 梯度更新
#%% md
### 1、定义神经网络结构
网络输入输出以及隐藏层神经元个数
#%%
def layer_sizes(X, Y):""""""# 输入层大小2n_x = X.shape[0]# 隐层大小n_h = 4# 输出层大小n_y = Y.shape[0]### END CODE HERE ###return (n_x, n_h, n_y)
#%% md
### 2、 初始化模型参数
随机初始化权重以及偏置为0
#%%
def initialize_parameters(n_x, n_h, n_y):"""输入每层的神经元数量返回:隐层、输出层的参数"""np.random.seed(2)### 开始# 创建隐层的两个参数# 让值小一些W1 = np.random.randn(n_h, n_x) * 0.01b1 = np.zeros((n_h, 1))# 创建输出层前对应的参数W2 = np.random.randn(n_y, n_h) * 0.01b2 = 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
#%% md
### 3、循环中的第一步:前向传播
根据之前给的前向传播公式,完成该函数使用的函数:np.dot,np.tanh, np.sigmoid
#%%
def forward_propagation(X, parameters):"""Argument:X:(n_feature, m)Returns:A2:最后一层的输出cache:用于反向传播计算的存储中间计算结果的字典"""# 获取参数### 开始# 取出每一层的参数W1 = parameters['W1']b1 = parameters['b1']W2 = parameters['W2']b2 = parameters['b2']# 进行一层一层的运算Z1 = np.matmul(W1, X) + b1A1 = np.tanh(Z1)# 第二层Z2 = np.dot(W2, A1) + b2A2 = sigmoid(Z2)### 结束assert(A2.shape == (1, X.shape[1]))cache = {"Z1": Z1,"A1": A1,"Z2": Z2,"A2": A2}return A2, cache
#%% md
### 3、循环中的二步:计算损失
完成损失计算的过程,根据损失公式设计多个维度,使用np.multiply进行乘法运算
#%%
def compute_cost(A2, Y, parameters):"""parameters:最后一层输出,目标值,参数return:损失"""m = Y.shape[1]### 开始logpro = np.multiply(np.log(A2), Y) + np.multiply((1 - Y), (np.log(1 - A2)))cost = - 1 / m * np.sum(logpro)### 结束cost = np.squeeze(cost)assert(isinstance(cost, float))return cost
#%% md
### 3、循环中的第三步:反向传播
反向传播在这个网络中分为两步def backward_propagation(parameters, cache, X, Y):"""parameters:cache:存储每层前向传播计算结果X:数据特征Y:数据目标值return:每个参数的梯度"""# 得出训练样本数量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
#%% md
### 3、循环中的第四步:更新梯度
#%%
def update_parameters(parameters, grads, learning_rate = 0.005):"""参数:网络参数,梯度,学习率返回更新之后的参数"""# 获取参数以及梯度### 开始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 * db2### 结束parameters = {"W1": W1,"b1": b1,"W2": W2,"b2": b2}return parameters
#%% md
### 4、建立网络模型训练逻辑
#%%
def nn_model(X, Y, num_iterations = 10000, print_cost=False):""""""np.random.seed(3)n_x = layer_sizes(X, Y)[0]n_y = layer_sizes(X, Y)[2]# 初始化参数### 开始# 获取网络的层大小# 2, 4, 1n_x, n_h, n_y = layer_sizes(X, Y)parameters = initialize_parameters(n_x, n_h, n_y)W1 = parameters['W1']b1 = parameters['b1']W2 = parameters['W2']b2 = parameters['b2']### 结束# 循环for i in range(0, num_iterations):### 开始# 前向传播A2, cache = forward_propagation(X, parameters)# 计算损失cost = compute_cost(A2, Y, parameters)# 反向传播计算梯度grads = backward_propagation(parameters, cache, X, Y)# 利用梯度更新参数parameters = update_parameters(parameters, grads)### 结束if i % 1000 == 0:print ("迭代次数 %i: %f" %(i, cost))return parameters
#%% md
### 5、预测结果
#%%
def predict(parameters, X):""""""# 计算概率值,以及判断类别A2, cache = forward_propagation(X, parameters)predictions = np.array( [1 if x >0.5 else 0 for x in A2.reshape(-1,1)] ).reshape(A2.shape)return predictions
#%%
# 测试
parameters = nn_model(X, Y, num_iterations = 10000)predictions = predict(parameters, X)

 

 

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

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

相关文章

StarRocks强大的实时数据分析

代码仓库&#xff1a;https://github.com/StarRocks/starrocks?tabreadme-ov-file StarRocks | A High-Performance Analytical Database 快速开始&#xff1a;StarRocks | StarRocks StarRocks 是一款高性能分析型数据仓库&#xff0c;使用向量化、MPP 架构、CBO、智能物化…

2024年博客之星主题创作|猫头虎分享AI技术洞察:2025年AI发展趋势前瞻与展望

2025年AI发展趋势前瞻&#xff1a;猫头虎深度解析未来科技与商业机遇 摘要 2024年&#xff0c;AI技术迎来爆发式增长&#xff0c;AIGC、智能体、AIRPA、AI搜索、推理模型等技术不断突破&#xff0c;AI应用场景持续扩展。2025年&#xff0c;AI将进入全新发展阶段&#xff0c;W…

PG vs MySQL mvcc机制实现的异同

MVCC实现方法比较 MySQL 写新数据时&#xff0c;把旧数据写入回滚段中&#xff0c;其他人读数据时&#xff0c;从回滚段中把旧的数据读出来 PostgreSQL 写新数据时&#xff0c;旧数据不删除&#xff0c;直接插入新数据。 MVCC实现的原理 PG的MVCC实现原理 定义多版本的数据…

Android SystemUI——CarSystemBar视图解析(十一)

前面文章我们已经把 CarSystemBar 从启动到构建视图,再到将视图添加到 Window 的流程分析完毕,我们知道默认情况下在车载系统中只显示顶部栏和底部栏视图的。这里我们在前面文章的基础上以顶部栏为例具体解析其视图的结构。 一、顶部栏解析 通过《CarSystemBar车载状态栏》这…

51c~ONNX~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/11608027 一、使用Pytorch进行简单的自定义图像分类 ~ONNX 推理 图像分类是计算机视觉中的一项基本任务&#xff0c;涉及训练模型将图像分类为预定义类别。本文中&#xff0c;我们将探讨如何使用 PyTorch 构建一个简单的自定…

每打开一个chrome页面都会【自动打开F12开发者模式】,原因是 使用HBuilderX会影响谷歌浏览器的浏览模式

打开 HBuilderX&#xff0c;点击 运行 -> 运行到浏览器 -> 设置web服务器 -> 添加chrome浏览器安装路径 chrome谷歌浏览器插件 B站视频下载助手插件&#xff1a; 参考地址&#xff1a;Chrome插件 - B站下载助手&#xff08;轻松下载bilibili哔哩哔哩视频&#xff09…

go语言之OOP特性和演示

一、OOP特性 Go语言中的OOP特性 结构体&#xff1a;在Go中&#xff0c;结构体用于定义复合类型&#xff0c;类似于其他语言中的类。它可以包含字段&#xff08;属性&#xff09;和方法&#xff08;行为&#xff09;。方法&#xff1a;Go允许为任何自定义类型&#xff08;包括…

USB3020任意波形发生器4路16位同步模拟量输出卡1MS/s频率 阿尔泰科技

信息社会的发展&#xff0c;在很大程度上取决于信息与信号处理技术的先进性。数字信号处理技术的出现改变了信息 与信号处理技术的整个面貌&#xff0c;而数据采集作为数字信号处理的必不可少的前期工作在整个数字系统中起到关键 性、乃至决定性的作用&#xff0c;其应用已经深…

ChatGPT大模型极简应用开发-目录

引言 要理解 ChatGPT&#xff0c;了解其背后的 Transformer 架构和 GPT 技术一路的演进则变得非常必要。 ChatGPT 背后的 LLM 技术使普通人能够通过自然语言完成过去只能由程序员通过编程语言实现的任务&#xff0c;这是一场巨大的变革。然而&#xff0c;人类通常容易高估技术…

C++入门基础篇:域、C++的输入输出、缺省参数、函数重载、引用、inline、nullptr

本篇文章是对C学习前期的一些基础部分的学习分享&#xff0c;希望也能够对你有所帮助。 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 目录 1.第一个C程序 2. 域 3. namespace 3.1 namespace的作用 3.2 namespace的定义 3.3 namespace使用说明 4.C的输入和输出…

RabbitMQ---TTL与死信

&#xff08;一&#xff09;TTL 1.TTL概念 TTL又叫过期时间 RabbitMQ可以对队列和消息设置TTL&#xff0c;当消息到达过期时间还没有被消费时就会自动删除 注&#xff1a;这里我们说的对队列设置TTL,是对队列上的消息设置TTL并不是对队列本身&#xff0c;不是说队列过期时间…

先进制造aps专题二十七 西门子opcenter aps架构分析

欧美的商业aps&#xff0c;主要就是sap apo,西门子opcenter aps,达索quintiq 从技术的层面&#xff0c;西门子aps是不如sap apo的&#xff0c;但是西门子aps是西门子数字化工厂产品的核心&#xff0c;有很多特色&#xff0c;所以分析 西门子aps主要分计划器和排产器两个部分 计…

WPF如何跨线程更新界面

WPF如何跨线程更新界面 在WPF中&#xff0c;类似于WinForms&#xff0c;UI控件只能在UI线程&#xff08;即主线程&#xff09;上进行更新。WPF通过Dispatcher机制提供了跨线程更新UI的方式。由于WPF的界面基于Dispatcher线程模型&#xff0c;当你在非UI线程&#xff08;例如后…

ingress-nginx代理tcp使其能外部访问mysql

一、helm部署mysql主从复制 helm repo add bitnami https://charts.bitnami.com/bitnami helm repo updatehelm pull bitnami/mysql 解压后编辑values.yaml文件&#xff0c;修改如下&#xff08;storageclass已设置默认类&#xff09; 117 ## param architecture MySQL archit…

macOS Sequoia 15.3 beta3(24D5055b)发布,附黑、白苹果镜像下载地址

“ 镜像&#xff08;黑苹果引导镜像、白苹果Mac镜像、黑苹果虚拟机镜像&#xff09;下载地址&#xff1a;黑果魏叔官网。” 关于macOS Sequoia 15.3 beta3&#xff08;24D5055b&#xff09;&#xff0c;以下是对其的详细介绍&#xff1a; 一、版本发布信息 发布时间 &#xf…

豪越科技消防一体化安全管控平台:推动消防作训模式智慧转型

在当今数字化浪潮席卷全球的时代背景下&#xff0c;各行业都在积极寻求创新与变革&#xff0c;以提升工作效率、优化管理流程。消防行业作为保障社会安全的关键领域&#xff0c;其数字化转型的需求尤为迫切。豪越科技的消防一体化安全管控平台应运而生&#xff0c;为消防工作带…

Tomcat下载配置

目录 Win下载安装 Mac下载安装配置 Win 下载 直接从官网下载https://tomcat.apache.org/download-10.cgi 在圈住的位置点击下载自己想要的版本 根据自己电脑下载64位或32位zip版本 安装 Tomcat是绿色版,直接解压到自己想放的位置即可 Mac 下载 官网 https://tomcat.ap…

1161 Merging Linked Lists (25)

Given two singly linked lists L1​a1​→a2​→⋯→an−1​→an​ and L2​b1​→b2​→⋯→bm−1​→bm​. If n≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a list like a1​→a2​→bm​→a3​→a4​→bm−1​⋯. For ex…

【记录】腾讯混元大模型本地部署过程

概述 本文记录在本地部署腾讯混元大模型的过程。仅为部署记录,不涉及过多的技术要点。 混元大模型主页:https://github.com/Tencent/HunyuanVideo 该模型应该是当前开源的效果不错的模型,其实官方文档将部署过程写的相当详细了,但是这里为了便于后期的学习,特意将部署过程…

Go-知识 版本演进

Go-知识 版本演进 Go release notesr56(2011/03/16)r57(2011/05/03)Gofix 工具语言包工具小修订 r58(2011/06/29)语言包工具小修订 r59(2011/08/01)语言包工具 r60(2011/09/07)语言包工具 [go1 2012-03-28](https://golang.google.cn/doc/devel/release#go1)[go1.1 2013-05-13]…