1. 简单回顾Numpy神经网络

实现功能

随机输入一组坐标数据进入神经网络模型,模型判断该坐标是否位于一个半径为1的圆圈内部,并且用matplotlib画出该点的位置,如果坐标在圆圈内部则标注为黄色点,如果在外侧则标注为蓝色点。

代码结构

代码主要分为三个部分:

1.操作函数区域:

①标准化函数(normalize)(将数据离散化,避免出现线性收敛的情况),

②ReLU激活函数(为网络数据引入非线性的特征,保证数据处于一个较为发散的状态)

③Softmax激活函数(将最终的输出值转化为概率分布的形式,方便计算损失函数)

④规范化函数(classify)(规范化最终结果,输出最终的坐标)

⑤损失函数(loss)(主要采用cross entropy的模式,因为与softmax配合可以很方便的计算误差值)

⑥需求函数(demand)(需求函数主要反映最后一层之前的z怎么改变,实际上就是求误差的具象化函数)

2.神经网络搭建区域:

****神经网络层对象:****参数;权重(weights)偏置(biases)

①层前馈运算(layer_forward):主要用于层的前馈运算,反映神经网络数据的正向传播

调整矩阵(反映当前层的权重应该如何变化):初步反向传播,back-propagation的准备工作,由上一层的输出和本层误差值参与运算

②层反馈运算(layer_backward):主要用于当前层的反馈运算,输出当前层的权重调整值和上一层的误差值(需求值)

****神经网络对象:****参数:形状(shape),层类数组(EachLayerArray)

①层前馈运算集合(network_forward):针对每层进行前馈运算,并且逐个标准化,最后输出一个每层的输出值的数组

②层反馈运算集合(network_backward):针对每层进行反馈运算,首先将网络备份后进行逐层反馈运算,并且修改数据,最后输出改变后的网络

③单批次训练:训练一次并且得到反馈,首先进行正向传播,得到误差与真实值比较,如果误差小则停止,如果误差大则反向传播逐层修改权重值,修改后再进行一次相同数据的正向传播,判断反向传播后的误差与正向传播的误差,如果误差变小,则将改变后的值存入真正的网络,如果误差增大则不做修改

④多批次训练;可以一次性输入多个batches进行训练,并且判断训练结果计算优化率,如果优化率较低则直接将网络进行更新,如果优化率为0则将网络打散重新训练,保证网络不会进入死亡状态。最后用plot进行图画表示

概念详解

**标准化:**将数据转化在0-1之间,避免指数爆炸的情况(因为在softmax函数中用到了指数,如果不对数据进行标准化,最后的指数值很可能会非常大)

**激活函数:**主要用到了ReLU和softmax,ReLU函数是小于零时为0,大于零为数据本身,这个函数的好处是非常简单并且极易求导;softmax函数则是将最终的输出转化为概率分布,这是一个非常神奇的函数,其优雅的特性就像是专门为了神经网络而生,恰到好处的收敛值,极易实现的求导值,并且梯度非常容易计算,最后转化出的概率值也相当直观,是很多神经网络最后一层输出的首选,因为真的非常好用。

激活函数的主要作用就是保证数据的活性,就像神经元一样,神经元需要在信号强度达到一定的值才会触发,激活函数的功能之一就是过滤一些细小的杂音(就像ReLU),第二个功能就是保证输出的数据是离散的,因为经过线性变换的数据最终的结果往往都是可预测的,只有给这些死亡的数据添加随机性,才能探索到更多的可能,但是可能出现过拟合的情况,所以需要斟酌使用

**规范化:**对数据进行处理,得到想要的结果,这种数据处理可以自己任意定义

**损失函数:**神经网络最重要的概念,是用于计算真正的值和输出值的差异,是衡量一个神经网络是否合适的重要依据,一般通过cross entropy(交叉熵)函数进行计算

**误差(需求值):**对最后一层的线性输出相对于损失函数求导,就可以得出当前层的误差值,误差值是给当前层的线性输出提供修改参考,是反向传播的重要参数

Q&A:

**如何正向传播:**正向传播是通过矩阵的乘法进行,通过线性变换(wa+b),激活函数,得到每一层的输出值,也就是下一层的输入值,一层一层重叠起来,就是正向传播,也就是前馈运算。

**如何反向传播:**反向传播是通过梯度运算进行,因为需要对网络的值进行修正,所以反向传播涉及很多偏导数的计算,偏导数就是衡量当前层与标准输出的损失,反向传播主要就由误差和偏导以及链式法则运算构成

一个简单的神经网络模型:

python 复制代码
import numpy as np

# 假设我们有以下变量:
# x: 输入数据的batch, 形状为 (n_features, n_samples)
# y_true: 真实标签的one-hot编码, 形状为 (n_classes, n_samples)
# W: 权重矩阵, 形状为 (n_classes, n_features)
# b: 偏置向量, 形状为 (n_classes, 1)

# 初始化权重和数据 (这里使用随机数据作为示例)
n_samples = 10
n_features = 5
n_classes = 3
x = np.random.rand(n_features, n_samples)
y_true = np.zeros((n_classes, n_samples))
y_true[0, 0:3] = 1  # 假设前3个样本属于类别0
y_true[1, 3:6] = 1  # 假设接下来3个样本属于类别1
y_true[2, 6:] = 1   # 假设最后4个样本属于类别2
W = np.random.rand(n_classes, n_features)
b = np.random.rand(n_classes, 1)

# Softmax函数
def softmax(z):
    e_z = np.exp(z - np.max(z, axis=0))  # 防止指数运算溢出
    return e_z / e_z.sum(axis=0)

# 交叉熵损失函数
def cross_entropy_loss(p, y):
    # 只计算实际标签对应的概率的损失
    return -np.sum(y * np.log(p)) / y.shape[1]

# 前向传播
z = np.dot(W, x) + b
p = softmax(z)

# 计算损失
loss = cross_entropy_loss(p, y_true)

# 反向传播
# 损失函数关于z的梯度
dL_dz = p - y_true

# z关于W的梯度
dL_dW = np.dot(dL_dz, x.T) / n_samples

# z关于b的梯度
dL_db = np.sum(dL_dz, axis=1, keepdims=True) / n_samples

# 现在我们有了损失关于权重和偏置的梯度,可以用于网络参数的更新
# 例如,使用简单的梯度下降更新规则
learning_rate = 0.01
W -= learning_rate * dL_dW
b -= learning_rate * dL_db

# 输出损失值以检查
print("Cross-entropy loss:", loss)

需求实现完整代码:

https://download.csdn.net/download/2203_75650990/92205132

相关推荐
Lab4AI大模型实验室3 小时前
【每日Arxiv热文】还在为视频编辑发愁?港科大&蚂蚁集团提出Ditto框架刷新SOTA!
人工智能·计算机视觉·视频编辑·ai agent·智能体学习
阿里云大数据AI技术3 小时前
云栖实录 | 实时计算 Flink 全新升级 - 全栈流处理平台助力实时智能
大数据·人工智能
新加坡内哥谈技术3 小时前
谷歌Quantum Echoes算法:迈向量子计算现实应用的重要一步
人工智能
Godspeed Zhao4 小时前
自动驾驶中的传感器技术70——Navigation(7)
人工智能·机器学习·自动驾驶
这儿有一堆花4 小时前
AI 翻译入门指南:机器如何理解语言
人工智能·web
明月照山海-4 小时前
机器学习周报十九
人工智能·机器学习
王哈哈^_^4 小时前
PyTorch vs TensorFlow:从入门到落地的全方位对比
人工智能·pytorch·python·深度学习·计算机视觉·tensorflow·1024程序员节
链上日记4 小时前
POPAI全球启动仪式成功举办|AI×Web3全球算力革命启航
人工智能
岁月宁静4 小时前
用 Node.js 封装豆包语音识别AI模型接口:双向实时流式传输音频和文本
前端·人工智能·node.js