神经网络入门:从基础到CNN全解析

一、神经网络到底是什么

神经网络是一类用来学习"输入和输出之间关系"的数学模型。

例如:

神经网络并不是像人一样真正"看懂"猫,而是通过大量图片学习:

  • 猫通常有什么形状
  • 哪里容易出现耳朵
  • 哪些纹理像毛发
  • 眼睛、鼻子、轮廓如何组合
  • 这些特征同时出现时,图片更可能属于猫

它最终学习到的是一个复杂函数:

y=f(x)

其中:

  • x:输入数据
  • f:神经网络
  • y:预测结果

更准确地说,神经网络是在学习:

这里的 θ 表示网络中的所有参数,例如权重和偏置。


二、人工神经元

神经网络最基本的单位叫人工神经元。

一个神经元接收多个输入:

每一个输入都有一个权重:

神经元首先计算加权求和:

然后经过激活函数:

y=f(z)

可以画成:

1. 权重 Weight

权重表示某个输入的重要程度。

例如预测一个学生是否通过考试:

复制代码
平时成绩:x1
考试成绩:x2
出勤率:x3

模型可能学到:

复制代码
考试成绩权重:0.7
平时成绩权重:0.2
出勤率权重:0.1

说明考试成绩对最终结果影响更大。

权重不是人工手动确定的,而是神经网络通过训练自动学出来的。

2. 偏置 Bias

偏置可以理解为一个额外的调整量。

公式:

z=wx+b

即使输入 x=0,神经元仍然可以通过偏置 b输出非零结果。

偏置让模型更加灵活。

可以把权重和偏置理解为:

复制代码
权重:控制输入有多重要
偏置:控制整体向左或向右调整多少

三、神经网络的基本结构

最普通的神经网络通常包含三部分:

例如识别手写数字:

1. 输入层

输入层负责接收原始数据。

例如一张 28×28的灰度图片,共有: 28×28=784个像素。

可以把图片拉平成一个长度为784的向量:

复制代码
[0, 0, 12, 35, 255, 200, ...]

因此输入层可以有784个输入节点。

输入层通常不负责复杂计算,只负责把数据传给后面的网络。

2. 隐藏层

隐藏层负责学习数据中的规律。

浅层隐藏层可能学习简单特征:

  • 边缘
  • 方向
  • 亮暗变化

更深的隐藏层会组合简单特征:

  • 线条
  • 角点
  • 圆弧
  • 眼睛
  • 鼻子
  • 人脸

可以理解为:

3. 输出层

输出层根据任务输出结果。

二分类任务,例如判断是否患病:

复制代码
输出一个概率:
0.92

表示模型认为属于正类的概率约为92%。

多分类任务,例如识别数字0~9:

复制代码
0:0.01
1:0.02
2:0.03
3:0.90
4:0.01
...

最高概率对应数字3,因此模型预测为3。


四、什么是"层"

一层神经网络本质上完成:

Y=f(WX+b)

其中:

  • X:输入
  • W:权重矩阵
  • b:偏置
  • f:激活函数
  • Y:输出

多个层叠加就是深度神经网络:

所谓"深度学习"中的"深度",通常就是网络包含较多隐藏层。


五、激活函数

如果神经网络中没有激活函数,那么无论叠加多少层,本质上都只是线性变换。

例如:

展开后仍然可以写成:

这意味着多层网络和一层网络没有本质区别。

激活函数的作用就是引入非线性,让网络能够学习复杂关系。


1. ReLU

ReLU是目前最常用的激活函数之一:

也就是:

复制代码
x < 0,输出0
x ≥ 0,输出x

示例:

复制代码
输入:[-2, -1, 0, 3, 5]
输出:[ 0,  0, 0, 3, 5]

优点:

  • 计算简单
  • 收敛较快
  • 缓解梯度消失
  • 适合大多数隐藏层

缺点是可能出现"神经元死亡"。

如果一个神经元长期输入为负,它一直输出0,对应梯度也可能一直为0,最后不再更新。


2. Sigmoid

公式:

输出范围:

因此常用于二分类输出层。

例如:

复制代码
输出0.92

可以解释为属于正类的概率为92%。

缺点:

  • 输入过大或过小时梯度很小
  • 容易发生梯度消失
  • 隐藏层中现在使用较少

3. Tanh

公式:

输出范围:

相比Sigmoid,输出以0为中心。

过去常用于循环神经网络。


4. Softmax

Softmax常用于多分类输出层。

假设模型输出:

复制代码
[2.0, 1.0, 0.1]

这些数还不是概率。

经过Softmax后可能变成:

复制代码
[0.66, 0.24, 0.10]

所有概率之和等于1。

因此适合:

  • 猫、狗、鸟分类
  • 数字0~9分类
  • 多个互斥类别分类

六、前向传播

前向传播就是数据从输入层一直传到输出层的过程。

完整过程:

举一个非常小的例子。

输入:

x1=2,x2=3

权重:

w1=0.5,w2=0.8

偏置:

b=0.1

先计算:

z=2×0.5+3×0.8+0.1

z=1+2.4+0.1=3.5

经过ReLU:

ReLU(3.5)=3.5

所以神经元输出3.5。

整个网络中的每一个节点都进行类似运算。


七、损失函数

模型预测完成后,需要判断预测得好不好。

损失函数就是用来计算:

复制代码
预测值和真实值之间差多少

损失越小,说明模型预测越准确。


1. 均方误差 MSE

常用于回归任务。

例如真实房价为100万元,模型预测90万元:

如果预测99万元:

第二个预测明显更好。


2. 交叉熵损失

常用于分类任务。

假设真实类别是猫。

模型A预测:

复制代码
猫:0.9
狗:0.1

模型B预测:

复制代码
猫:0.2
狗:0.8

模型A的损失较小,模型B的损失较大。

二分类交叉熵:

多分类通常使用:


八、反向传播

前向传播得到预测结果,然后计算损失。

接下来需要回答:

复制代码
每一个权重应该如何调整,才能让损失变小?

这就是反向传播。

流程:

反向传播会根据链式法则,从输出层向前计算每个参数对损失的影响。

例如:

表示权重 w 改变一点时,损失 L 会如何变化。

如果梯度为正,说明增大权重会使损失变大,因此应该减小权重。

如果梯度为负,说明增大权重会使损失变小,因此应该增大权重。


九、梯度下降

参数更新公式:

其中:

  • w:权重
  • η:学习率
  • :梯度

可以把损失函数想象成一座山:

复制代码
高处:损失大
低处:损失小

训练过程就像沿着山坡往最低点走。

梯度告诉我们:

复制代码
哪个方向是上坡

因此向梯度相反方向移动,就能逐渐降低损失。


十、学习率

学习率控制每次参数更新走多大一步。

学习率太大:

复制代码
可能一步跨过最低点
甚至来回震荡,无法收敛

学习率太小:

复制代码
训练速度很慢
需要很多轮才能收敛

示意:

复制代码
学习率过大:大步乱跳
学习率合理:稳定下降
学习率过小:缓慢移动

常见初始值有:

复制代码
0.1
0.01
0.001
0.0001

但具体值要根据任务和优化器调整。


十一、卷积神经网络 CNN

普通全连接神经网络可以处理图片,但图片尺寸稍大,参数数量就会非常庞大。

例如一张 100×100 的RGB图片:

100×100×3=30000

如果连接到1000个神经元,权重数量约为:

30000×1000=3000万

参数太多,计算量很大,也容易过拟合。

CNN通过卷积层提取局部特征,大幅减少参数数量。

典型CNN流程:


十二、卷积层

卷积层的主要作用是提取局部特征。

例如:

  • 边缘
  • 横线
  • 竖线
  • 斜线
  • 纹理
  • 角点
  • 局部形状

卷积层使用一个小矩阵在图片上滑动,这个小矩阵叫:

复制代码
卷积核
滤波器
Kernel
Filter

1. 卷积核如何工作

假设输入图片局部区域为:

复制代码
1 2 1
0 1 0
2 1 2

卷积核为:

复制代码
1  0 -1
1  0 -1
1  0 -1

逐元素相乘再相加:

1×1+2×0+1×(−1)

+0×1+1×0+0×(−1)+0

+2×1+1×0+2×(−1)

结果:

1−1+0+2−2=01-1+0+2-2=01−1+0+2−2=0

卷积核移动到下一个位置,继续计算。

最终会得到一个新的矩阵,叫特征图:

复制代码
Feature Map

2. 卷积为什么能提取特征

不同卷积核会对不同结构产生较强响应。

例如:

竖直边缘卷积核:

复制代码
1  0 -1
1  0 -1
1  0 -1

水平边缘卷积核:

复制代码
 1  1  1
 0  0  0
-1 -1 -1

网络训练过程中,不需要人工设置这些卷积核。

卷积核中的数值会像普通权重一样,通过反向传播自动学习。

因此:

复制代码
第1层卷积:学习边缘和纹理
第2层卷积:学习局部形状
第3层卷积:学习眼睛、耳朵等结构
更深层:学习完整物体特征

十三、卷积的三个重要参数

1. 卷积核大小 Kernel Size

常见:

复制代码
3×3
5×5
7×7

现在最常见的是 3×3。

卷积核越大,一次能看到的范围越大,但参数和计算量也越大。

多个 3×3卷积叠加,可以获得较大感受野,同时增加非线性表达能力。


2. 步长 Stride

步长表示卷积核每次移动几个格子。

stride=1:

复制代码
每次移动1格

stride=2:

复制代码
每次移动2格

步长越大,输出特征图越小。


3. 填充 Padding

卷积时,图片边缘被使用的次数较少,输出尺寸通常会变小。

Padding会在图片外围补0。

例如:

复制代码
原图:
1 2
3 4

补一圈0:

复制代码
0 0 0 0
0 1 2 0
0 3 4 0
0 0 0 0

作用:

  • 保留边缘信息
  • 控制输出尺寸
  • 允许网络堆叠更多卷积层

十四、卷积输出尺寸

假设:

  • 输入尺寸:N
  • 卷积核大小:K
  • Padding:P
  • Stride:S

输出尺寸:

例如输入为 32×32:

复制代码
K=3
P=1
S=1

则:

输出仍然是 32×32。

如果:

复制代码
K=3
P=1
S=2

则:

输出变成 16×16。


十五、通道 Channel

灰度图片只有一个通道:

复制代码
高度 × 宽度 × 1

RGB图片有三个通道

复制代码
高度 × 宽度 × 3

分别是:

复制代码
Red
Green
Blue

假设输入为:

32×32×3

使用64个卷积核,输出就有64个通道:

32×32×64

每个卷积核学习一种不同特征。

因此可以把通道理解为:

复制代码
不同特征的集合

例如某些通道关注边缘,某些通道关注纹理,某些通道关注颜色变化。


十六、池化层

池化层主要用于缩小特征图尺寸。

典型流程:

复制代码
卷积:提取特征
池化:压缩特征

池化通常没有需要训练的权重。


1. 最大池化 Max Pooling

假设输入区域:

复制代码
1 3
2 4

最大池化取最大值:

复制代码
4

对整个特征图以窗口滑动。

例如:

复制代码
1 3 2 1
4 6 5 2
7 2 8 3
1 4 2 9

使用 2×2最大池化,步长2:

第一个区域:

复制代码
1 3
4 6

最大值为6。

第二个区域:

复制代码
2 1
5 2

最大值为5。

最终得到:

复制代码
6 5
7 9

2. 平均池化 Average Pooling

平均池化取区域内平均值。

例如:

复制代码
1 3
2 4

平均值:

最大池化更强调最明显的特征。

平均池化保留区域整体信息。


3. 池化层的作用

池化可以:

  • 减少特征图尺寸
  • 减少计算量
  • 减少后续参数数量
  • 提高一定的平移鲁棒性
  • 扩大后续神经元的感受野

不过池化也会丢失部分空间信息。

现在一些网络会使用步长卷积代替池化层。


十七、卷积和池化的区别

项目 卷积层 池化层
主要作用 提取特征 压缩特征
是否有参数 通常没有
是否参与训练 通常不学习参数
输出通道 可改变 通常不改变
空间尺寸 可保持或缩小 通常缩小
典型操作 加权求和 最大值或平均值

可以记成:

复制代码
卷积负责看出"有什么"
池化负责保留"最重要的"

十八、展平 Flatten

经过多次卷积和池化后,数据可能是:

7×7×64

为了输入全连接层,需要把它展开成一维向量:

7×7×64=3136

即:

复制代码
7×7×64 特征图
       ↓ Flatten
长度3136的一维向量

Flatten本身不改变数值,只改变数据形状。


十九、全连接层

全连接层英文是:

复制代码
Fully Connected Layer
Dense Layer
Linear Layer

全连接表示上一层的每个节点,都和下一层的每个节点相连。

例如:

复制代码
输入层3个节点
隐藏层4个节点

权重数量为:

3×4=12

再加4个偏置,总参数为:

12+4=16

全连接层公式:

y=Wx+b


全连接层的作用

卷积层负责提取局部特征:

复制代码
边缘、纹理、形状、部位

全连接层负责综合这些特征,做最终判断:

复制代码
这些特征组合起来,到底是猫还是狗?

可以理解为:

复制代码
卷积层:找证据
全连接层:综合证据并作出决定

二十、一个完整CNN例子

假设输入图片:

32×32×3

网络结构:

这就是典型的图片分类CNN。


二十一、参数量怎么计算

1. 全连接层参数量

输入维度为100,输出维度为50。

权重数量:

100×50=5000

偏置数量:

50

总参数:

5000+50=5050


2. 卷积层参数量

卷积核大小:

3×3

输入通道:

3

输出通道:

64

每个卷积核参数:

3×3×3=27

一共有64个卷积核:

27×64=1728

再加64个偏置:

1728+64=1792

注意,卷积层参数量和图片宽高没有直接关系。

这正是卷积层参数较少的重要原因。


二十二、权重共享

卷积核在整张图片上滑动时,使用的是同一组参数。

例如一个竖直边缘卷积核:

复制代码
在图片左上角检测竖直边缘
在图片中间仍然使用同一个卷积核
在图片右下角仍然使用同一个卷积核

这叫权重共享。

优点:

  • 参数数量显著减少
  • 同一个特征可以在不同位置被识别
  • 更适合处理图像

二十三、局部感受野

全连接层中,一个神经元会连接所有输入。

卷积层中,一个神经元只观察输入的一小块区域。

例如 3×3 卷积核只观察9个位置。

这叫局部连接。

因为图像中相邻像素通常关系更密切,所以局部连接符合图像数据特点。

随着网络加深,后层神经元能间接看到更大的区域。

这个可见范围叫感受野。

例如:

复制代码
第一层:看到3×3区域
第二层:看到更大区域
第三层:看到更大范围

因此浅层学习局部特征,深层学习整体结构。


二十四、批次 Batch

训练时通常不会一次只输入一条数据,也不会一次把全部数据放进去。

而是分批训练。

例如有10000张图片,batch size设为32:

复制代码
每次输入32张图片
计算一次损失
执行一次参数更新

大约需要: 10000÷32≈313次迭代才能完整看完一次数据集。


二十五、Epoch、Batch、Iteration

这三个概念很容易混淆。

Epoch

整个训练集完整学习一遍,叫一个Epoch。

Batch

每次送入网络的一小批数据。

Iteration

网络完成一次前向传播、反向传播和参数更新,叫一次Iteration。

例如:

复制代码
训练集:1000条
Batch Size:100

则:

复制代码
1个Epoch = 10个Iteration

如果训练20个Epoch:

复制代码
总Iteration = 20 × 10 = 200

二十六、优化器

优化器负责根据梯度更新参数。

1. SGD

最基础的随机梯度下降。

w=w−η∇L

优点:

  • 原理简单
  • 有时泛化性能很好

缺点:

  • 收敛可能较慢
  • 容易震荡

2. Momentum

Momentum会保留之前更新方向的一部分。

类似小球滚下山坡,有惯性,因此能加速训练并减少震荡。

3. Adam

Adam会根据每个参数的梯度情况自动调整学习步长。

优点:

  • 使用方便
  • 收敛较快
  • 很多任务中表现稳定

因此初学者经常从Adam开始。

但不是所有任务中Adam都一定最好。


二十七、过拟合

过拟合指模型在训练集上表现很好,但在新数据上表现很差。

例如:

复制代码
训练准确率:99%
验证准确率:70%

说明模型可能记住了训练数据,而没有学会真正规律。

类似学生背下了练习题答案,但遇到新题就不会做。


二十八、如何缓解过拟合

1. 增加数据量

数据越丰富,模型越难只靠死记硬背。

2. 数据增强

图像任务常见操作:

  • 随机裁剪
  • 水平翻转
  • 旋转
  • 缩放
  • 颜色变化

让模型看到更多变化形式。

3. Dropout

训练时随机让部分神经元暂时失效。

例如Dropout=0.5,训练时大约随机关闭一半神经元。

这样可以防止网络过度依赖某几个节点。

注意:

复制代码
训练阶段:启用Dropout
测试阶段:关闭Dropout

4. L1和L2正则化

在损失函数中加入对权重大小的惩罚。

L2正则化:

它会限制权重变得过大。

5. Early Stopping

监控验证集损失。

如果训练集损失继续下降,但验证集损失开始上升,就提前停止训练。


二十九、欠拟合

欠拟合指模型连训练数据都没有学好。

例如:

复制代码
训练准确率:60%
验证准确率:58%

可能原因:

  • 网络太简单
  • 训练轮数太少
  • 学习率不合适
  • 特征不足
  • 正则化太强

解决方法:

  • 增加网络深度或宽度
  • 延长训练时间
  • 调整学习率
  • 减弱正则化
  • 使用更合适的模型

三十、Batch Normalization

批归一化常简称BN。

它会对中间特征进行标准化,再通过可学习参数进行调整。

作用通常包括:

  • 稳定训练
  • 加快收敛
  • 允许使用较大学习率
  • 一定程度缓解梯度问题

CNN中常见结构:

复制代码
卷积层
  ↓
BatchNorm
  ↓
ReLU

有些网络也采用:

复制代码
BatchNorm
  ↓
ReLU
  ↓
卷积层

具体顺序取决于网络设计。


三十一、梯度消失

深层网络反向传播时,需要连续乘很多导数。

如果这些导数大多小于1,梯度会越来越小。

结果是:

复制代码
靠近输入端的层几乎无法更新

这叫梯度消失。

Sigmoid在输入很大或很小时导数接近0,因此容易造成梯度消失。

常见缓解方式:

  • 使用ReLU
  • 合理初始化
  • BatchNorm
  • 残差连接
  • LSTM或GRU
  • 更合理的网络结构

三十二、梯度爆炸

如果连续乘积中的数值较大,梯度可能迅速增大。

结果:

  • 参数更新过大
  • 损失变成NaN
  • 训练不稳定

缓解方式:

  • 梯度裁剪
  • 合理初始化
  • 较小学习率
  • BatchNorm
  • 残差结构

三十三、权重初始化

如果所有权重都初始化为0,同一层的神经元会学到完全相同的内容。

因此通常使用随机初始化。

常见方式:

Xavier初始化

适合Sigmoid、Tanh等。

He初始化

适合ReLU。

初始化的目的不是让模型一开始就准确,而是让信号和梯度在不同层之间保持较稳定范围。


三十四、残差连接 ResNet

网络越深,并不一定越容易训练。

ResNet加入快捷连接:

y=F(x)+x

普通网络学习完整映射:

H(x)

残差网络让某些层学习:

F(x)=H(x)−x

结构:

复制代码
x ──────────────────┐
↓                   │
卷积 → BN → ReLU → 卷积
↓                   │
加法 <──────────────┘
↓
输出

残差连接可以:

  • 缓解深层网络退化
  • 改善梯度传播
  • 训练非常深的网络

ResNet是现代深度学习中非常重要的结构。


三十五、感受野

感受野表示某个特征点对应到原始输入中能观察多大的区域。

单层 3×3 卷积只能看到 3×3。

两层连续 3×3卷积,大致可以看到 5×5。

三层大致可以看到 7×7。

网络越深,感受野越大。

因此:

复制代码
浅层:关注边缘和纹理
中层:关注局部结构
深层:关注物体整体

三十六、常见神经网络类型

1. MLP

多层感知机,主要由全连接层组成。

适合:

  • 表格数据
  • 简单分类
  • 简单回归

缺点是处理图像时参数量大。

2. CNN

卷积神经网络。

适合:

  • 图像分类
  • 目标检测
  • 图像分割
  • 人脸识别
  • 医学影像

3. RNN

循环神经网络。

适合序列数据:

  • 文本
  • 语音
  • 时间序列

它会保留之前时刻的信息。

4. LSTM和GRU

是RNN的改进,用门控机制缓解长距离依赖和梯度消失。

5. Transformer

基于自注意力机制。

现在广泛用于:

  • 大语言模型
  • 机器翻译
  • 文本分类
  • 图像识别
  • 多模态模型

Transformer不再依赖传统卷积或循环结构,也能建模远距离关系。


三十七、神经网络完整训练流程

复制代码
第1步:准备数据
   ↓
第2步:数据清洗
   ↓
第3步:划分训练集、验证集、测试集
   ↓
第4步:数据预处理
   ↓
第5步:设计网络结构
   ↓
第6步:定义损失函数
   ↓
第7步:选择优化器
   ↓
第8步:前向传播
   ↓
第9步:计算损失
   ↓
第10步:反向传播
   ↓
第11步:更新参数
   ↓
第12步:重复多个Epoch
   ↓
第13步:在验证集调参
   ↓
第14步:在测试集做最终评估

训练循环可以概括为:

复制代码
预测 → 计算错误 → 分析错误来源 → 调整参数 → 再预测

三十八、训练集、验证集、测试集

训练集

用于更新模型参数。

验证集

用于:

  • 选择模型
  • 调整超参数
  • 判断是否过拟合
  • Early Stopping

测试集

只用于训练结束后的最终评估。

测试集不能反复用于调参,否则它实际上就变成了验证集。

常见划分:

复制代码
训练集:70%
验证集:15%
测试集:15%

或者:

复制代码
训练集:80%
验证集:10%
测试集:10%

三十九、参数和超参数

参数

模型通过训练自动学习:

  • 权重
  • 偏置
  • 卷积核

超参数

由开发者设置:

  • 学习率
  • Batch Size
  • Epoch数量
  • 网络层数
  • 卷积核大小
  • 通道数量
  • Dropout比例
  • 优化器类型

区别:

复制代码
参数:模型自己学
超参数:训练前人工设置

四十、分类任务常用评价指标

1. Accuracy

适合类别较均衡的问题。

2. Precision

关注:

复制代码
被模型预测为正的样本中,有多少是真的正类

3. Recall

关注:

复制代码
所有真正正类中,有多少被模型找出来

4. F1

用于平衡Precision和Recall。

医疗筛查中,Recall通常很重要,因为漏掉真正异常者可能带来较大风险。

不过医疗模型不能只看单一指标,还要结合特异度、AUC、校准度及临床场景。


四十一、CNN中各层的直观职责

可以用一个侦探破案的例子理解。

复制代码
卷积层:
寻找局部线索

激活函数:
保留有价值的非线性响应

池化层:
压缩线索,保留重点

更深的卷积层:
组合线索,形成高级证据

Flatten:
把所有证据整理成一份列表

全连接层:
综合证据

Softmax:
给出每个结论的概率

例如识别猫:

复制代码
第一层卷积:发现边缘
第二层卷积:发现毛发、圆弧
第三层卷积:发现耳朵、眼睛
更深层:形成猫脸特征
全连接层:综合判断是不是猫

四十二、一个必须记住的总框架

复制代码
原始数据
   ↓
输入层
   ↓
特征提取
   ├─ 卷积
   ├─ 激活
   ├─ 池化
   └─ 归一化
   ↓
高级特征
   ↓
Flatten或全局平均池化
   ↓
全连接层
   ↓
输出结果
   ↓
损失函数
   ↓
反向传播
   ↓
优化器更新参数
   ↓
重复训练

四十三、几个最容易混淆的问题

卷积层和全连接层都在做乘法,有什么区别?

两者本质上都是线性变换,但连接方式不同。

全连接层:

复制代码
每个输出连接所有输入
参数多
不保留空间结构

卷积层:

复制代码
只连接局部区域
参数共享
保留空间结构
适合图像

卷积后为什么还要ReLU?

卷积本身仍是线性运算。

如果没有激活函数,多层卷积最终仍可能等价于一个线性变换。

ReLU引入非线性,让网络能够表示复杂模式。

池化是不是必须的?

不是。

现代网络可以使用:

  • 步长卷积
  • 全局平均池化
  • 注意力下采样

替代传统池化。

全连接层是不是必须的?

也不是。

很多现代CNN在最后使用全局平均池化,直接把每个通道压缩成一个数,再输出类别。

这样可以减少参数和过拟合。

相关推荐
周倦岚2 天前
ArkTS中的MVC、MVP、MVVM
华为·mvc·harmonyos
IKUN家族2 天前
Spring MVC(一)
java·spring·mvc
米码收割机4 天前
【SSM】Spring MVC_MyBatis SSM商城系统(源码+论文)【独一无二】
spring·mvc·mybatis
中微极客7 天前
神经形态计算:从忆阻器到SNN训练工程实践
人工智能·mvc
旧物有情10 天前
游戏开发常用架构 #MVP,MVC
游戏·unity·架构·mvc
sun032213 天前
【笔记】Spring MVC 相关介绍
java·spring·mvc
Qredsun13 天前
RAG 系统 Embedding 流程分析与自托管 API 适配
mvc·embedding
月落星还在17 天前
Spring MVC 与 Spring Boot:从“手动挡”到“自动驾驶”的进化论,兼谈前后端分离的哲学
spring boot·spring·云原生·mvc
wang090721 天前
自己动手写一个spring之MVC_3
java·spring·mvc