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…

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…

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

信息社会的发展&#xff0c;在很大程度上取决于信息与信号处理技术的先进性。数字信号处理技术的出现改变了信息 与信号处理技术的整个面貌&#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;不是说队列过期时间…

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…

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

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

Tomcat下载配置

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

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

概述 本文记录在本地部署腾讯混元大模型的过程。仅为部署记录,不涉及过多的技术要点。 混元大模型主页: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]…

Java锁 死锁及排查 JVM 工具 jconsole 工具 排查死锁

目录 概述 死锁案例 (面试) 如何排查死锁 使用 JVM 工具排查死锁 使用 jconsole 工具排查死锁 细节 概述 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力于涉那它们都将无法推进下去&#xff0c;如果系统资源充足&#xff0c;…

计算机网络 (49)网络安全问题概述

前言 计算机网络安全问题是一个复杂且多维的领域&#xff0c;它涉及到网络系统的硬件、软件以及数据的安全保护&#xff0c;确保这些元素不因偶然的或恶意的原因而遭到破坏、更改或泄露。 一、计算机网络安全的定义 计算机网络安全是指利用网络管理控制和技术措施&#xff0c;保…

CSS 合法颜色值

CSS 颜色 CSS 中的颜色可以通过以下方法指定&#xff1a; 十六进制颜色带透明度的十六进制颜色RGB 颜色RGBA 颜色HSL 颜色HSLA 颜色预定义/跨浏览器的颜色名称使用 currentcolor 关键字 十六进制颜色 用 #RRGGBB 规定十六进制颜色&#xff0c;其中 RR&#xff08;红色&…

使用docker-compose安装ELK(elasticsearch,logstash,kibana)并简单使用

首先服务器上需要安装docker已经docker-compose&#xff0c;如果没有&#xff0c;可以参考我之前写的文章进行安装。 https://blog.csdn.net/a_lllk/article/details/143382884?spm1001.2014.3001.5502 1.下载并启动elk容器 先创建一个网关&#xff0c;让所有的容器共用此网…

二十四、NetworkPolicy

NetworkPolicy 一、基础网路 Kubernetes网络模型设计的一个基础原则是:每个Pod都拥有一个独立的IP地址,并假定所有Pod都在一个可以直接连通的、扁平的网络空间中。所以不管它们是否运行在同一个Node(宿主机)中,都要求它们可以直接通过对方的IP进行访问。设计这个原则的原…

Java操作Excel导入导出——POI、Hutool、EasyExcel

目录 一、POI导入导出 1.数据库导出为Excel文件 2.将Excel文件导入到数据库中 二、Hutool导入导出 1.数据库导出为Excel文件——属性名是列名 2.数据库导出为Excel文件——列名起别名 3.从Excel文件导入数据到数据库——属性名是列名 4.从Excel文件导入数据到数据库…

下载文件,浏览器阻止不安全下载

背景&#xff1a; 在项目开发中&#xff0c;遇到需要下载文件的情况&#xff0c;文件类型可能是图片、excell表、pdf、zip等文件类型&#xff0c;但浏览器会阻止不安全的下载链接。 效果展示&#xff1a; 下载文件的两种方式&#xff1a; 一、根据接口的相对url&#xff0c;拼…

SD/MMC驱动开发

一、介绍 MMC的全称是”MultiMediaCard”――所以也通常被叫做”多媒体卡”&#xff0c;是一种小巧大容量的快闪存储卡,特别应用于移动电话和数字影像及其他移动终端中。MMC存贮卡只有7pin&#xff0c;可以支持MMC和SPI两种工作模式。 SD卡&#xff0c;数字安全记忆卡&#xf…