1.2.神经网络基础

目录

1.2.神经网络基础

1.2.1.Logistic回归

1.2.2 梯度下降算法

1.2.3 导数

1.2.4 向量化编程

1.2.5 正向传播与反向传播

1.2.6.练习


1.2.神经网络基础

1.2.1.Logistic回归

1.2.1.1.Logistic回归

逻辑回归是一个主要用于二分分类类的算法。那么逻辑回归是给定一个x , 输出一个该样本属于1对应类别的预测概率y​^​​=P(y=1∣x)。

Logistic 回归中使用的参数如下:  

  • 输入的特征向量:x∈R​n​x​​​​,x是一个n​x​​维的特征数量,用于训练的标签:y∈0,1
  • 参数:权重:w∈R​n​x​​​​, 偏置:b∈R
  • 输出预测结果
    • Sigmoid 函数:
    • 如果z的结果非常大,那么S的结果接近于1
    • 如果 z的结果较小或者是非常大的负数,那么S的结果接近于0

e_{}^{-z}​​的函数如下

例如:

1.2.2.1.逻辑回归损失函数

损失函数(loss function)用于衡量预测结果与真实值之间的误差。最简单的损失函数定义方式为平方差损失: 

逻辑回归一般使用:

该式子的理解:

  • 如果y=1,损失为−log​y​^​​,那么要想损失越小,​y​^​​的值必须越大,即越趋近于或者等于1
  • 如果y=0,损失为-log(1−​y​^​​),那么要想损失越小,那么​y​^​​的值越小,即趋近于或者等于0

损失函数是在单个训练样本中定义的,它衡量了在单个训练样本上的表现。代价函数(cost function)衡量的是在全体训练样本上的表现,即衡量参数 w 和 b 的效果,所有训练样本的损失平均值

1.2.2.梯度下降算法

目的:使损失函数的值找到最小值

方式:梯度下降

函数的梯度(gradient)指出了函数的最陡增长方向。梯度的方向走,函数增长得就越快。那么按梯度的负方向走,函数值自然就降低得最快了。模型的训练目标即是寻找合适的 w 与 b 以最小化代价函数值。假设 w 与 b 都是一维实数,那么可以得到如下的 J 关于 w 与 b 的图:

可以看到,成本函数 J 是一个凸函数,与非凸函数的区别在于其不含有多个局部最低。

参数w和b的更新公式为:

注:其中 α 表示学习速率,即每次更新的 w 的步伐长度。当 w 大于最优解 w′ 时,导数大于 0,那么 w 就会向更小的方向更新。反之当 w 小于最优解 w′ 时,导数小于 0,那么 w 就会向更大的方向更新。迭代直到收敛。

通过平面来理解梯度下降过程:

1.2.3.导数

理解梯度下降的过程之后,我们通过例子来说明梯度下降在计算导数意义或者说这个导数的意义。

1.2.3.1.导数

导数也可以理解成某一点处的斜率。斜率这个词更直观一些。

  • 各点处的导数值一样

我们看到这里有一条直线,这条直线的斜率为4。我们来计算一个例子

例:取一点为a=2,那么y的值为8,我们稍微增加a的值为a=2.001,那么y的值为8.004,也就是当a增加了0.001,随后y增加了0.004,即4倍

那么我们的这个斜率可以理解为当一个点偏移一个不可估量的小的值,所增加的为4倍。

可以记做

  • 各点的导数值不全一致
  • 例:取一点为a=2,那么y的值为4,我们稍微增加a的值为a=2.001,那么y的值约等于4.004(4.004001),也就是当a增加了0.001,随后y增加了4倍

取一点为a=5,那么y的值为25,我们稍微增加a的值为a=5.001,那么y的值约等于25.01(25.010001),也就是当a增加了0.001,随后y增加了10倍

1.2.3.2 导数计算图

那么接下来我们来看看含有多个变量的到导数流程图,假设J(a,b,c)=3(a+bc)

我们以下面的流程图代替

这样就相当于从左到右计算出结果,然后从后往前计算出导数

  • 导数计算

问题:那么现在我们要计算J相对于三个变量a,b,c的导数?

假设b=4,c=2,a=7,u=8,v=15,j=45

增加v从15到15.001,那么J≈45.003

增加a从7到7.001,那么v=≈15.001,J≈45.003

这里也涉及到链式法则

1.2.3.3 链式法则

1.2.3.4 逻辑回归的梯度下降

逻辑回归的梯度下降过程计算图,首先从前往后的计算图得出如下

那么计算图从前向过程为,假设样本有两个特征

问题:计算出J 关于z的导数

所以我们这样可以求出总损失相对于w​1​​,w​2​​,b参数的某一点导数,从而可以更新参数

相信上面的导数计算应该都能理解了,所以当我们计算损失函数的某个点相对于�1,�2,�w​1​​,w​2​​,b的导数之后,就可以更新这次优化后的结果。

1.2.4.向量化编程

每更新一次梯度时候,在训练期间我们会拥有m个样本,那么这样每个样本提供进去都可以做一个梯度下降计算。所以我们要去做在所有样本上的计算结果、梯度等操作

计算参数的梯度为:这样,我们想要得到最终的dw​1​​,dw​2​​,db,如何去设计一个算法计算?伪代码实现:

1.2.4.1 向量化优势

什么是向量化

由于在进行计算的时候,最好不要使用for循环去进行计算,因为有Numpy可以进行更加快速的向量化计算。

import numpy as np
import time
a = np.random.rand(100000)
b = np.random.rand(100000)
  • 第一种方法
# 第一种for 循环
c = 0
start = time.time()
for i in range(100000):c += a[i]*b[i]
end = time.time()print("计算所用时间%s " % str(1000*(end-start)) + "ms")
  • 第二种向量化方式使用np.dot
# 向量化运算
start = time.time()
c = np.dot(a, b)
end = time.time()
print("计算所用时间%s " % str(1000*(end-start)) + "ms")

Numpy能够充分的利用并行化,Numpy当中提供了很多函数使用

函数作用
np.ones or np.zeros全为1或者0的矩阵
np.exp指数计算
np.log对数计算
np.abs绝对值计算

所以上述的m个样本的梯度更新过程,就是去除掉for循环。原本这样的计算

1.2.4.2 向量化实现伪代码

  • 思路

可以变成这样的计算

注:w的形状为(n,1), x的形状为(n, m),其中n为特征数量,m为样本数量

我们可以让,得出的结果为(1, m)大小的矩阵 注:大写的W,X为多个样本表示

  • 实现多个样本向量化计算的伪代码

这相当于一次使用了M个样本的所有特征值与目标值,那我们知道如果想多次迭代,使得这M个样本重复若干次计算

1.2.5.正向传播与反向传播

前面我们所做的整个过程分为两个部分,一个是从前往后的计算出梯度与损失,另外一部分是从后往前计算参数的更新梯度值。所以在神经网络当中会经常出现两个概念,正向传播与反向传播。

正向传播是神经网络从输入到输出的过程,主要用于计算输出结果。

反向传播是根据输出和目标值之间的差距调整网络参数的过程,主要用于优化网络的权重和偏置。这两个过程交替进行,直到网络的损失函数最小化,达到训练目标。

1.2.6.练习

1.使用np.exp()实现sigmoid function和sigmoid gradient(梯度)

import numpy as np
def basic_sigmoid(x):"""计算sigmoid函数"""s = 1 / (1 + np.exp(-x))return sdef sigmoid_derivative(x):"""计算sigmoid function函数相对于其输入x的梯度(也称为斜率或者导数)."""s=basic_sigmoid(x)ds=s*(1-s)return ds

 2.实现单神经元网络

import numpy as np
import h5py
import scipy
from PIL import Image
from scipy import ndimage
from data import load_dataset
#%% md
## 要求
实现一个学习算法的整体结构
* 获取并定义模型输入
* 初始化参数
* 计算成本函数及其梯度
* 使用优化算法(梯度下降)* 循环:* 计算当前损失(正向传播)* 计算当前梯度(反向传播)* 更新参数(梯度下降)请实现相关函数,其中读取数据不需要实现。并在主模型函数中编写逻辑。
#%% md
### 读取数据
1、按照向量化伪代码实现的形状要求将样本数据进行转换
2、标准化数据处理
#%%
train_x, train_y, test_x, test_y, classes = load_dataset()
print ("训练集的样本数: ", train_x.shape[0])
print ("测试集的样本数: " , test_x.shape[0])
print ("train_x形状: ", train_x.shape)
print ("train_y形状: ", train_y.shape)
print ("test_x形状: ", test_x.shape)
print ("test_x形状: ", test_y.shape)
#%%
train_y
#%%
train_x = train_x.reshape(train_x.shape[0], -1).T
test_x = test_x.reshape(test_x.shape[0], -1).T
print(train_x.shape, test_x.shape)
#%%
train_x = train_x/255.
test_x = test_x/255.
#%%
def basic_sigmoid(x):"""计算sigmoid函数"""### 开始s = 1 / (1 + np.exp(-x))### 结束return s
#%% md
### 算法结构实现
分别构建算法的不同模块
* 初始化参数
* 计算成本函数及其梯度
* 使用优化算法(梯度下降)* 循环:* 计算当前损失(正向传播)* 计算当前梯度(反向传播)* 更新参数(梯度下降)<img src="images/题目逻辑.png" style="width:600px;height:550px;">
#%% md
### 初始化网络参数
#%%
def initialize_with_zeros(shape):"""创建一个形状为 (shape, 1) 的w参数和b=0.return:w, b"""### 开始w = np.zeros((shape, 1))b = 0### 结束assert(w.shape == (shape, 1))assert(isinstance(b, float) or isinstance(b, int))return w, b
#%% md
### 前向和反向传播
根据损失函数、前后传播向量化代码
#%%
def propagate(w, b, X, Y):"""参数:w,b,X,Y:网络参数和数据Return:损失cost、参数W的梯度dw、参数b的梯度db"""m = X.shape[1]# 前向传播### 开始# w (n,1), x (n, m)A = basic_sigmoid(np.dot(w.T, X) + b)# 计算损失cost = -1 / m * np.sum(Y * np.log(A) + (1 - Y) * np.log(1 - A))### 结束# 反向传播### 开始dz = A - Ydw = 1 / m * np.dot(X, dz.T)db = 1 / m * np.sum(dz)### 结束assert(dw.shape == w.shape)assert(db.dtype == float)cost = np.squeeze(cost)assert(cost.shape == ())grads = {"dw": dw,"db": db}return grads, cost
#%% md
### 优化过程
实现优化函数. 全局的参数随着 $w$  $b$ 对损失 $J$进行优化改变. 对参数 $\theta$实行 $ \theta = \theta - \alpha \text{ } d\theta$, 并制定 $\alpha$ 学习率。
#%%
def optimize(w, b, X, Y, num_iterations, learning_rate):"""参数:w:权重,b:偏置,X特征,Y目标值,num_iterations总迭代次数,learning_rate学习率Returns:params:更新后的参数字典grads:梯度costs:损失结果"""costs = []for i in range(num_iterations):# 梯度更新计算函数### 开始grads, cost = propagate(w, b, X, Y)# 取出两个部分参数的梯度dw = grads['dw']db = grads['db']# 按照梯度下降公式去计算w = w - learning_rate * dwb = b - learning_rate * db### 结束if i % 100 == 0:costs.append(cost)if i % 100 == 0:print("损失结果 %i: %f" %(i, cost))print(b)params = {"w": w,"b": b}grads = {"dw": dw,"db": db}return params, grads, costs
#%% md
### 预测函数(不用实现)
利用得出的参数来进行测试得出准确率
#%%
def predict(w, b, X):'''利用训练好的参数预测return:预测结果'''m = X.shape[1]Y_prediction = np.zeros((1,m))w = w.reshape(X.shape[0], 1)# 计算结果### 开始A = basic_sigmoid(np.dot(w.T, X) + b)### 结束for i in range(A.shape[1]):### 开始if A[0, i] <= 0.5:Y_prediction[0, i] = 0else:Y_prediction[0, i] = 1### 结束assert(Y_prediction.shape == (1, m))return Y_prediction
#%% md
### 整体逻辑实现
#%%
def model(X_train, Y_train, X_test, Y_test, num_iterations = 2000, learning_rate = 0.5):""""""### 开始# 初始化参数w, b = initialize_with_zeros(X_train.shape[0])# 梯度下降# params:更新后的网络参数# grads:最后一次梯度# costs:每次更新的损失列表params, grads, costs = optimize(w, b, X_train, Y_train, num_iterations, learning_rate)# 获取训练的参数# 预测结果w = params['w']b = params['b']Y_prediction_train = predict(w, b, X_train)Y_prediction_test = predict(w, b, X_test)### 结束# 打印准确率print("训练集准确率: {} ".format(100 - np.mean(np.abs(Y_prediction_train - Y_train)) * 100))print("测试集准确率: {} ".format(100 - np.mean(np.abs(Y_prediction_test - Y_test)) * 100))d = {"costs": costs,"Y_prediction_test": Y_prediction_test, "Y_prediction_train" : Y_prediction_train, "w" : w, "b" : b,"learning_rate" : learning_rate,"num_iterations": num_iterations}return d
#%% md
### 测试
#%%
d = model(train_x, train_y, test_x, test_y, num_iterations = 2000, learning_rate = 0.005)

 data.py

import numpy as np
import h5pydef load_dataset():train_dataset = h5py.File('datasets/train_catvnoncat.h5', "r")train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set featurestrain_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labelstest_dataset = h5py.File('datasets/test_catvnoncat.h5', "r")test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set featurestest_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labelsclasses = np.array(test_dataset["list_classes"][:]) # the list of classestrain_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes

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

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

相关文章

MIAOYUN信创云原生项目亮相西部“中试”生态对接活动

近日&#xff0c;以“构建‘中试’生态&#xff0c;赋能科技成果转化”为主题的“科创天府智汇蓉城”西部“中试”生态对接活动在成都高新区菁蓉汇隆重开幕。活动分为成果展览、“中试”生态主场以及成果路演洽谈对接三大板块。在成果展览环节&#xff0c;成都元来云志科技有限…

【vitePress】基于github快速添加评论功能(giscus)

一.添加评论插件 使用giscus来做vitepress 的评论模块&#xff0c;使用也非常的简单&#xff0c;具体可以参考&#xff1a;giscus 文档&#xff0c;首先安装giscus npm i giscus/vue 二.giscus操作 打开giscus 文档&#xff0c;如下图所示&#xff0c;填入你的 github 用户…

成就与远见:2024年技术与思维的升华

个人主页&#xff1a;chian-ocean 前言: 2025年1月17日&#xff0c;2024年博客之星年度评选——创作影响力评审的入围名单公布。我很荣幸能够跻身Top 300&#xff0c;虽然与顶尖博主仍有一定差距&#xff0c;但这也为我提供了更加明确的发展方向与指引。展望崭新的2025年&…

一文了解如何在Qt中间集成Halcon窗口并在子线程显示(附工程源码下载链接)

在基于图像处理的开发中&#xff0c;Halcon作为功能强大的图像处理库&#xff0c;经常需要与Qt结合&#xff0c;以便通过Qt提供的UI功能更好地显示和交互。本文将讲解如何在Qt中集成Halcon窗口&#xff0c;并通过子线程实现Halcon图像的显示&#xff0c;保证主线程的流畅运行。…

游戏引擎学习第80天

Blackboard&#xff1a;增强碰撞循环&#xff0c;循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改&#xff0c;以便实现一些新的功能。具体来说&#xff0c;是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏&#xff0c;目标是构建一些更丰富…

深度学习-89-大语言模型LLM之AI应用开发的基本概念

文章目录 1 什么是智能体(Agent)2 什么是大语言模型(LLM)2.1 LLM的训练及使用2.2 Transformer架构2.3 基于LLM的Agent框架3 什么是检索增强生成(RAG)3.1 RAG是什么3.2 生成式AI应用开发3.3 RAG的整体流程3.4 RAG技术3.4.1 简单RAG(Simple RAG)3.4.2 校正RAG(Corrective RAG)3.4…

电子科大2024秋《大数据分析与智能计算》真题回忆

考试日期&#xff1a;2025-01-08 课程&#xff1a;成电信软学院-大数据分析与智能计算 形式&#xff1a;开卷 考试回忆版 简答题&#xff08;4*15&#xff09; 1. 简述大数据的四个特征。分析每个特征所带来的问题和可能的解决方案 2. HDFS的架构的主要组件有哪些&#xff0…

Windows电脑安装USB Redirector并实现内外网跨网USB共享通信访问

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 我们每天都在与各种智能设备打交道&#xff0c;从手机到电脑&#xff0c;再到各种外设&#xff0c;它们已经…

Docker 实现MySQL 主从复制

一、拉取镜像 docker pull mysql:5.7相关命令&#xff1a; 查看镜像&#xff1a;docker images 二、启动镜像 启动mysql01、02容器&#xff1a; docker run -d -p 3310:3306 -v /root/mysql/node-1/config:/etc/mysql/ -v /root/mysql/node-1/data:/var/lib/mysql -e MYS…

多监控m3u8视频流,怎么获取每个监控的封面图(纯前端)

文章目录 1.背景2.问题分析3.解决方案3.1解决思路3.2解决过程3.2.1 封装播放组件3.2.2 隐形的视频div3.2.3 截取封面图 3.3 结束 1.背景 有这样一个需求&#xff1a; 给你一个监控列表&#xff0c;每页展示多个监控&#xff08;至少12个&#xff0c;m3u8格式&#xff09;&…

VS Code AI开发之Copilot配置和使用详解

随着AI开发工具的迅速发展&#xff0c;GitHub Copilot在Cursor、Winsuf、V0等一众工具的冲击下&#xff0c;推出了免费版本。接下来&#xff0c;我将为大家介绍GitHub Copilot的配置和使用方法。GitHub Copilot基于OpenAI Codex模型&#xff0c;旨在为软件开发者提供智能化的代…

前端开发Web

Ajax 概念:Asynchronous JavaScriptAnd XML&#xff0c;异步的JavaScript和XML 作用: 数据交换:通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。 异步交互:可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页的…

Oracle 深入学习 Part 14:Managing Password Security and Resources(管理密码安全性和资源)

Profiles Profile 是一个以名称标识的集合&#xff0c;用于管理 密码 和 资源限制。 每个用户都对应一个profiles&#xff0c;可以通过 CREATE USER 或 ALTER USER 命令分配给用户。 Profiles 可以启用或禁用。 Profiles 可以关联到默认的 DEFAULT Profile。 密码管理&…

ConvBERT:通过基于跨度的动态卷积改进BERT

摘要 像BERT及其变体这样的预训练语言模型最近在各种自然语言理解任务中取得了令人印象深刻的性能。然而&#xff0c;BERT严重依赖于全局自注意力机制&#xff0c;因此存在较大的内存占用和计算成本。尽管所有的注意力头都从全局角度查询整个输入序列以生成注意力图&#xff0…

路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)

近期因公司新办公区建设&#xff0c;原有的爱快路由器的SDWAN功能实现分支之间互联的服务还需要继续使用。在原有的小型网络中&#xff0c;使用的爱快路由器当作网关设备&#xff0c;所以使用较为简单,如下图所示。 现变更网络拓扑为三层网络架构&#xff0c;但原有的SDWAN分支…

豆包升级了“眼睛”,看APP截图就能写代码了!超低价让多模态AI普惠

金磊 发自 上海量子位 | 公众号 QbitAI 豆包的“眼睛”升级了&#xff0c;现在让它看一眼APP截图&#xff0c;就能直接给你生成代码&#xff01; 话不多说&#xff0c;我们直接给它上一个难度。 例如我们先随机截取一张网站的图片&#xff1a; 再来到火山方舟的大模型广场&…

PyTorch使用教程(9)-使用profiler进行模型性能分析

1、简介 PyTorch Profiler是一个内置的性能分析工具&#xff0c;可以帮助开发者定位计算资源&#xff08;如CPU、GPU&#xff09;的瓶颈&#xff0c;从而更好地优化PyTorch程序。通过捕获和分析GPU的计算、内存和带宽利用情况&#xff0c;能够有效识别并解决性能瓶颈。 2、原…

vue3+ts+uniapp 微信小程序(第一篇)—— 微信小程序定位授权,位置信息权限授权

文章目录 简介一、先看效果1.1 授权定位前&#xff0c;先弹出隐私协议弹框1.2 上述弹框点击同意&#xff0c;得到如下弹框1.3 点击三个点&#xff0c;然后点设置 1.4 在1.2步骤下&#xff0c;无论同意或者拒绝 二、manifest.json 文件配置三、微信公众平台配置3.1 登录进入微信…

vue3使用音频audio标签

文章目录 一、背景二、页面三、标签介绍四、代码五、代码说明场景1&#xff1a;针对加载固定格式的比如MP3文件&#xff0c;可直接使用\<audio>标签场景2&#xff1a;针对播放告警内容&#xff0c;比如中文或者英文词条情况 一、背景 项目使用vue3&#xff0c;需求针对告…

工业制造离不开的BOM

在制造业的浩瀚星空中&#xff0c;物料清单&#xff08;BOM&#xff09;犹如“北极星”&#xff0c;牢牢指引着产品从设计蓝图迈向实物诞生的全过程。 BOM的分类 按照设计制造的不同阶段&#xff0c;将BOM划分为设计BOM、工艺BOM、制造BOM三种类型。 设计BOM Engineering BO…