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 s

def 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 - Y
    dw = 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 * dw
        b = 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] = 0
        else:
            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 h5py
    
    
def 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 features
    train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labels

    test_dataset = h5py.File('datasets/test_catvnoncat.h5', "r")
    test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set features
    test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labels

    classes = np.array(test_dataset["list_classes"][:]) # the list of classes
    
    train_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

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

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

相关文章

Matlab总提示内存不够用,明明小于电脑内存

目录 前言情况1&#xff08;改matlab最大内存限制&#xff09;情况2&#xff08;重启电脑&#xff09;情况3 前言 在使用matlab中&#xff0c;有时候需要占用的内存并没有超过电脑内存依旧会报错&#xff0c;提示内存不够用&#xff0c;可以尝试下面几种方法&#xff0c;总有一…

使用AI生成金融时间序列数据:解决股市场的数据稀缺问题并提升信噪比

“GENERATIVE MODELS FOR FINANCIAL TIME SERIES DATA: ENHANCING SIGNAL-TO-NOISE RATIO AND ADDRESSING DATA SCARCITY IN A-SHARE MARKET” 论文地址&#xff1a;https://arxiv.org/pdf/2501.00063 摘要 金融领域面临的数据稀缺与低信噪比问题&#xff0c;限制了深度学习在…

深入解析人工智能中的协同过滤算法及其在推荐系统中的应用与优化

目录 什么是协同过滤算法核心原理基本步骤相似度计算代码实现详解1.流程图2.创建基础的数据结构存储用户评分数据3.计算用户相似度4.获取相似用户5.推荐方法 算法优化建议1. 数据预处理优化去除异常值和噪声数据进行数据标准化使用稀疏矩阵优化存储 2. 相似度计算优化使用局部敏…

react install

react 安装 React 是一个用于构建用户界面的 JavaScript 库。以下是安装 React 的步骤&#xff1a; 使用 Create React App Create React App 是一个官方支持的命令行工具&#xff0c;用于快速搭建 React 应用。 安装 Node.js 和 npm 确保你的计算机上安装了 Node.js 和 npm…

程序员不可能不知道的常见锁策略

前面我们学习过线程不安全问题&#xff0c;我们通过给代码加锁来解决线程不安全问题&#xff0c;在生活中我们也知道有很多种类型的锁&#xff0c;同时在代码的世界当中&#xff0c;也对应着很多类型的锁&#xff0c;今天我们对锁一探究竟&#xff01; 1. 常见的锁策略 注意: …

智启未来,AI筑梦科技新星”------华清远见成都中心2025冬令营圆满结束

2025年1月11日-16日&#xff0c;华清远见成都中心为期6天的“智启未来&#xff0c;AI筑梦科技新星”2025冬令营活动圆满结束。此次活动吸引了众多对人工智能和无人驾驶技术充满热情的学生参与&#xff0c;共同开启了一段点燃科技梦想的精彩旅程。 报道接待 以AI无人驾驶小车为核…

Debezium日常分享系列之:对于从Oracle数据库进行快照的性能优化

Debezium日常分享系列之&#xff1a;对于从Oracle数据库进行快照的性能优化 源数据库Kafka Connect监控测试结果 源数据库 Oracle 19c&#xff0c;本地&#xff0c;CDB数据库主机的I/O带宽为6 GB/s&#xff0c;由此主机上运行的所有数据库共享临时表空间由42个文件组成&#x…

RabbitMQ--延迟队列

&#xff08;一&#xff09;延迟队列 1.概念 延迟队列是一种特殊的队列&#xff0c;消息被发送后&#xff0c;消费者并不会立刻拿到消息&#xff0c;而是等待一段时间后&#xff0c;消费者才可以从这个队列中拿到消息进行消费 2.应用场景 延迟队列的应用场景很多&#xff0c;…

3DsMax设置中文界面

按键盘上的“Win”键&#xff0c;直接输入3dsmax&#xff0c;选择Simplified Chinese打开&#xff0c;之后就都是中文了

opencv在图片上添加中文汉字(c++以及python)

opencv在图片上添加中文汉字&#xff08;c以及python&#xff09;_c opencv绘制中文 知乎-CSDN博客 环境&#xff1a; ubuntu18.04 desktopopencv 3.4.15 opencv是不支持中文的。 这里C代码是采用替换原图的像素点来实现的&#xff0c;实现之前我们先了解一下汉字点阵字库。…

线程同步与Mutex

梦想是逃离世界… 文章目录 一、什么是线程同步&#xff1f;二、线程同步机制三、互斥锁&#xff08;Mutex&#xff09;四、loock 和 unlock五、Mutex的四种类型 一、什么是线程同步&#xff1f; 线程同步(Thread Synchronization)是多线程编程中的一个重要概念&#xff0c;它…

基于SpringBoot和PostGIS的全球首都信息管理设计与实现

目录 前言 一、首都空间表的设计 1、三张空间表的结构 二、SpringBoot后台管理的设计与实现 1、模型层的实现 2、业务层及控制层实现 三、前端的实现与成果可视化 1、新增数据的保存 2、首都的实际管理成果 3、全球首都信息 四、总结 前言 首都&#xff0c;一个国家的…

计算机网络 (50)两类密码体制

前言 计算机网络中的两类密码体制主要包括对称密钥密码体制&#xff08;也称为私钥密码体制、对称密码体制&#xff09;和公钥密码体制&#xff08;也称为非对称密码体制、公开密钥加密技术&#xff09;。 一、对称密钥密码体制 定义&#xff1a; 对称密钥密码体制是一种传…

【数据结构篇】顺序表 超详细

目录 一.顺序表的定义 1.顺序表的概念及结构 1.1线性表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 二.动态顺序表的实现 1.准备工作和注意事项 2.顺序表的基本接口&#xff1a; 2.0 创建一个顺序表 2.1 顺序表的初始化 2.2 顺序表的销毁 2.3 顺序表的打印 3.顺序…

C 语言雏启:擘画代码乾坤,谛观编程奥宇之初瞰

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一课主要是让大家初步了解C语言&#xff0c;了解我们的开发环境&#xff0c;main函数&#xff0c;库…

根据 Web 服务器端的架构相关知识,将PHP改JAVA重构企业网站系统

目录 案例 【题目】 【问题 1】(7 分) 【问题 2】(8 分) 【问题 3】(10 分) 答案 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于应用服务器的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某电子产品制造公司&#xff0c…

多选multiple下拉框el-select回显问题(只显示后端返回id)

首先保证v-model的值对应options数据源里面的id <el-form-item prop"subclass" label"分类" ><el-select v-model"formData.subclass" multiple placeholder"请选择" clearable :disabled"!!formData.id"><e…

java快速导出word文档

点关注不迷路&#xff0c;欢迎再访&#xff01; 精简博客内容&#xff0c;尽量已行业术语来分享。 努力做到对每一位认可自己的读者负责。 帮助别人的同时更是丰富自己的良机。 文章目录 前言一.添加 Apache POI 依赖二.填充文档内容三.导出文档效果测试 前言 在 Java 应用程序…

《MambaIR:一种基于状态空间模型的简单图像修复基线方法》学习笔记

paper&#xff1a;2402.15648 目录 摘要 一、引言 1、模型性能的提升依赖于网络感受野的扩大&#xff1a; 2、全局感受野和高效计算之间存在固有矛盾&#xff1a; 3、改进版 Mamba的巨大潜力 4、Mamba 在图像修复任务中仍面临以下挑战&#xff1a; 5、方法 6、主要贡献…

ngnix上传小文件成功,大文件报错

ngnix错误日志 "/var/tmp/nginx/client//0000001299" failed (2: No such file or directory), client: 10.188.141.160, server: 127.0.0.1, request: "POST /fts/sys/common/biUpload HTTP/1.1", host: "10.20.166.179", referrer: "http…