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

相关推荐
万行3 分钟前
机器学习&第四章支持向量机
人工智能·机器学习·支持向量机
幻云20107 分钟前
Next.js之道:从入门到精通
人工智能·python
予枫的编程笔记12 分钟前
【Java集合】深入浅出 Java HashMap:从链表到红黑树的“进化”之路
java·开发语言·数据结构·人工智能·链表·哈希算法
llddycidy14 分钟前
峰值需求预测中的机器学习:基础、趋势和见解(最新文献)
网络·人工智能·深度学习
larance14 分钟前
机器学习的一些基本知识
人工智能·机器学习
l1t19 分钟前
利用DeepSeek辅助拉取GitHub存储库目录跳过特定文件方法
人工智能·github·deepseek
123445226 分钟前
Agent入门实战-一个题目生成Agent
人工智能·后端
IT_陈寒28 分钟前
Java性能调优实战:5个被低估却提升30%效率的JVM参数
前端·人工智能·后端
taihexuelang31 分钟前
大模型部署
人工智能·docker·容器
轻竹办公PPT32 分钟前
2025实测!AI生成PPT工具全总结
人工智能·python·powerpoint