用deepseek学大模型08-卷积神经网络(CNN)
yuanbao.tencent.com
从入门到精通卷积神经网络(CNN),着重介绍的目标函数,损失函数,梯度下降 标量和矩阵形式的数学推导,pytorch真实能跑的代码案例以及模型,数据,预测结果的可视化展示, 模型应用场景和优缺点,及如何改进解决及改进方法数据推导。
一、目标函数与损失函数数学推导
1. 均方误差(MSE)
标量形式:
E ( w ) = 1 2 ∑ i = 1 N ( y i − y ^ i ) 2 E(\mathbf{w}) = \frac{1}{2} \sum_{i=1}^N (y_i - \hat{y}_i)^2 E(w)=21i=1∑N(yi−y^i)2
矩阵形式:
E ( W ) = 1 2 ( Y − Y ^ ) T ( Y − Y ^ ) E(\mathbf{W}) = \frac{1}{2} (\mathbf{Y} - \mathbf{\hat{Y}})^T (\mathbf{Y} - \mathbf{\hat{Y}}) E(W)=21(Y−Y^)T(Y−Y^)
其中 Y ^ = W X + b \mathbf{\hat{Y}} = \mathbf{WX} + \mathbf{b} Y^=WX+b,适用于回归任务。
2. 交叉熵损失
分类任务公式:
L = − 1 N ∑ i = 1 N ∑ c = 1 C y i , c log ( y ^ i , c ) L = -\frac{1}{N} \sum_{i=1}^N \sum_{c=1}^C y_{i,c} \log(\hat{y}_{i,c}) L=−N1i=1∑Nc=1∑Cyi,clog(y^i,c)
其中 C C C 为类别数, y ^ i , c \hat{y}_{i,c} y^i,c 为 softmax 输出概率。
二、梯度下降的数学推导
标量形式(以 MSE 为例):
∂ E ∂ w j = ∑ i = 1 N ( y i − y ^ i ) ⋅ x i , j \frac{\partial E}{\partial w_j} = \sum_{i=1}^N (y_i - \hat{y}_i) \cdot x_{i,j} ∂wj∂E=i=1∑N(yi−y^i)⋅xi,j
参数更新:
w j ← w j − η ∂ E ∂ w j w_j \leftarrow w_j - \eta \frac{\partial E}{\partial w_j} wj←wj−η∂wj∂E
矩阵形式(卷积层梯度):
设第 l l l 层卷积核为 W [ l ] \mathbf{W}^{[l]} W[l],反向传播梯度为:
∂ L ∂ W [ l ] = A [ l − 1 ] ∗ ∂ L ∂ Z [ l ] \frac{\partial L}{\partial \mathbf{W}^{[l]}} = \mathbf{A}^{[l-1]} \ast \frac{\partial L}{\partial \mathbf{Z}^{[l]}} ∂W[l]∂L=A[l−1]∗∂Z[l]∂L
其中 ∗ \ast ∗ 表示互相关运算, Z [ l ] \mathbf{Z}^{[l]} Z[l] 为卷积输出。
三、PyTorch 代码案例(MNIST 分类)
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
import matplotlib.pyplot as plt# 数据加载
transform = transforms.Compose([transforms.ToTensor()])
train_data = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)# 定义 CNN 模型
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=3)self.pool = nn.MaxPool2d(2, 2)self.fc = nn.Linear(32*13*13, 10)def forward(self, x):x = self.pool(torch.relu(self.conv1(x))) # 输出尺寸: (32, 13, 13)x = x.view(-1, 32*13*13)x = self.fc(x)return xmodel = CNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)# 训练循环
losses = []
for epoch in range(5):for images, labels in train_loader:optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()losses.append(loss.item())print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}')# 可视化训练损失
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()
四、可视化展示
- 特征图可视化:使用
torchvision.utils.make_grid
显示卷积层输出。 - 预测结果对比:绘制真实标签与预测标签的混淆矩阵。
- 训练过程监控:绘制损失和准确率曲线(示例见代码)。
五、应用场景与优缺点
应用场景 | 优缺点 |
---|---|
图像分类(ResNet) | ✅ 自动特征提取;❌ 对旋转/缩放敏感 |
目标检测(YOLO) | ✅ 高效定位;❌ 小目标检测困难 |
医学影像分割(U-Net) | ✅ 像素级精度;❌ 需要大量标注数据 |
六、改进方法
- 梯度消失问题:使用残差连接(ResNet)。
- 感受野限制:引入空洞卷积(Dilated Convolution)。
- 计算效率:采用深度可分离卷积(MobileNet)。
数学推导补充(矩阵形式)
设卷积层输入为 X ∈ R H × W × C \mathbf{X} \in \mathbb{R}^{H\times W\times C} X∈RH×W×C,卷积核 W ∈ R k × k × C × D \mathbf{W} \in \mathbb{R}^{k\times k\times C\times D} W∈Rk×k×C×D,输出特征图 Z \mathbf{Z} Z 的计算为:
Z i , j , d = ∑ c = 1 C ∑ u = − k / 2 k / 2 ∑ v = − k / 2 k / 2 W u , v , c , d ⋅ X i + u , j + v , c \mathbf{Z}_{i,j,d} = \sum_{c=1}^C \sum_{u=-k/2}^{k/2} \sum_{v=-k/2}^{k/2} \mathbf{W}_{u,v,c,d} \cdot \mathbf{X}_{i+u,j+v,c} Zi,j,d=c=1∑Cu=−k/2∑k/2v=−k/2∑k/2Wu,v,c,d⋅Xi+u,j+v,c
反向传播时,梯度计算需展开为矩阵乘法形式。
如需更详细的代码扩展或特定改进方法的推导,请进一步说明需求。
CNN与MLP的深度对比分析
一、核心结构差异
维度 | CNN | MLP |
---|---|---|
连接方式 | 局部连接 + 权值共享 | 全连接 |
参数规模 | 参数少(卷积核复用) | 参数爆炸(每层全连接) |
输入结构 | 保留空间维度(H×W×C) | 必须展平为向量(H×W×C → D) |
特征提取 | 自动学习局部到全局的层次特征 | 依赖人工特征工程或隐式全局特征 |
二、数学本质对比
-
卷积运算 vs 矩阵乘法
- CNN:通过卷积核滑动计算局部特征(稀疏交互)
Z = W ∗ X + b \mathbf{Z} = \mathbf{W} \ast \mathbf{X} + \mathbf{b} Z=W∗X+b - MLP:通过全连接权重矩阵计算全局特征(密集交互)
Z = W T X + b \mathbf{Z} = \mathbf{W}^T \mathbf{X} + \mathbf{b} Z=WTX+b
- CNN:通过卷积核滑动计算局部特征(稀疏交互)
-
反向传播差异
- CNN梯度计算需考虑感受野叠加,通过转置卷积实现梯度传播
- MLP梯度直接通过链式法则逐层传递,无空间结构约束
三、性能优势对比
任务类型 | CNN优势 | MLP劣势 |
---|---|---|
图像分类 | ✅ 平移不变性(卷积核共享) | ❌ 需学习重复模式,参数效率低 |
目标检测 | ✅ 空间特征保留,适合定位 | ❌ 展平破坏空间关系 |
语义分割 | ✅ 像素级特征关联 | ❌ 无法处理高分辨率输出 |
参数量对比 | MNIST任务:约50K参数(CNN) | MNIST任务:约800K参数(MLP) |
四、代码对比(PyTorch实现)
CNN模型(接上文代码)
# 卷积层定义
self.conv1 = nn.Conv2d(1, 32, kernel_size=3) # 参数数: 32×1×3×3=288
MLP模型对比
class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.fc1 = nn.Linear(28*28, 512) # 参数数: 784×512=401,408self.fc2 = nn.Linear(512, 10) # 参数数: 512×10=5,120def forward(self, x):x = x.view(-1, 28*28)x = torch.relu(self.fc1(x))return self.fc2(x)
参数量对比:CNN模型参数量约为MLP的 1/16(50K vs 800K)
五、本质优势解析
-
平移不变性 (Translation Invariance)
- CNN通过卷积核共享,自动识别目标在不同位置的特征
- MLP需在不同位置重复学习相同模式,效率低下
-
层次特征学习
- 低级特征 → 边缘/纹理(浅层卷积)
- 高级特征 → 物体部件/整体(深层卷积)
- MLP缺乏显式的层次特征提取机制
-
参数效率
- 示例:输入尺寸224×224的RGB图像
- CNN第一层(3×3卷积,32通道):3×3×3×32 = 864参数
- MLP第一层(全连接,512节点):224×224×3×512 ≈ 77M参数
- 示例:输入尺寸224×224的RGB图像
六、适用场景选择指南
场景 | 推荐模型 | 原因 |
---|---|---|
图像/视频处理 | CNN | 空间特征保留,参数高效 |
结构化表格数据 | MLP | 无空间关联,全连接更直接 |
时序数据(LSTM替代) | MLP/RNN | CNN需设计1D卷积,可能不如RNN自然 |
小样本学习 | MLP | CNN需要大量数据防止过拟合 |
七、改进方向对比
问题 | CNN解决方案 | MLP解决方案 |
---|---|---|
过拟合 | Dropout, 数据增强 | L2正则化, 早停 |
梯度消失 | 残差连接(ResNet) | 激活函数改进(ReLU) |
计算效率 | 深度可分离卷积(MobileNet) | 网络剪枝, 量化 |
全局依赖建模 | 自注意力机制(Vision Transformer) | 增加隐藏层宽度 |
八、数学视角的差异本质
设输入为 X ∈ R H × W × C \mathbf{X} \in \mathbb{R}^{H\times W\times C} X∈RH×W×C,两种网络的函数表达能力差异:
-
CNN函数空间:
F C N N = { f ∣ f ( X ) = ConvBlock ( X ; W ) } \mathcal{F}_{CNN} = \{ f | f(\mathbf{X}) = \text{ConvBlock}(\mathbf{X}; \mathbf{W}) \} FCNN={f∣f(X)=ConvBlock(X;W)}
具有平移等变性: f ( Shift ( X ) ) = Shift ( f ( X ) ) f(\text{Shift}(\mathbf{X})) = \text{Shift}(f(\mathbf{X})) f(Shift(X))=Shift(f(X)) -
MLP函数空间:
F M L P = { f ∣ f ( X ) = W 2 T σ ( W 1 T vec ( X ) ) } \mathcal{F}_{MLP} = \{ f | f(\mathbf{X}) = \mathbf{W}_2^T \sigma(\mathbf{W}_1^T \text{vec}(\mathbf{X})) \} FMLP={f∣f(X)=W2Tσ(W1Tvec(X))}
丢失空间结构信息,需从数据中重新学习位置相关性
九、实战建议
- 图像任务首选CNN:即使简单任务(如MNIST),CNN在准确率和鲁棒性上显著优于MLP
- 混合架构趋势:现代模型常结合两者优势(如CNN提取特征 + MLP分类头)
- 计算资源考量:MLP在小型结构化数据上训练更快,CNN需要GPU加速
通过理解这些本质区别,可以更明智地根据任务特性选择模型架构。
卷积核的数学实现与梯度推导详解
一、卷积核的数学形式
卷积核的本质是局部特征提取器,其数学实现可分为单通道和多通道两种情况。
1. 单通道卷积(2D卷积)
输入:单通道特征图 X ∈ R H × W X \in \mathbb{R}^{H \times W} X∈RH×W
卷积核: K ∈ R k × k K \in \mathbb{R}^{k \times k} K∈Rk×k(假设 k k k 为奇数)
输出:特征图 Z ∈ R ( H − k + 1 ) × ( W − k + 1 ) Z \in \mathbb{R}^{(H-k+1) \times (W-k+1)} Z∈R(H−k+1)×(W−k+1)
数学表达式:
Z i , j = ∑ u = 0 k − 1 ∑ v = 0 k − 1 K u , v ⋅ X i + u , j + v + b Z_{i,j} = \sum_{u=0}^{k-1} \sum_{v=0}^{k-1} K_{u,v} \cdot X_{i+u, j+v} + b Zi,j=u=0∑k−1v=0∑k−1Ku,v⋅Xi+u,j+v+b
其中 b b b 为偏置项,输出每个位置的计算对应输入的一个局部区域与核的点积。
2. 多通道卷积(3D卷积)
输入:多通道特征图 X ∈ R H × W × C i n X \in \mathbb{R}^{H \times W \times C_{in}} X∈RH×W×Cin
卷积核: K ∈ R k × k × C i n × C o u t K \in \mathbb{R}^{k \times k \times C_{in} \times C_{out}} K∈Rk×k×Cin×Cout
输出: Z ∈ R ( H − k + 1 ) × ( W − k + 1 ) × C o u t Z \in \mathbb{R}^{(H-k+1) \times (W-k+1) \times C_{out}} Z∈R(H−k+1)×(W−k+1)×Cout
数学表达式:
对每个输出通道 c c c:
Z i , j , c = ∑ u = 0 k − 1 ∑ v = 0 k − 1 ∑ d = 1 C i n K u , v , d , c ⋅ X i + u , j + v , d + b c Z_{i,j,c} = \sum_{u=0}^{k-1} \sum_{v=0}^{k-1} \sum_{d=1}^{C_{in}} K_{u,v,d,c} \cdot X_{i+u, j+v, d} + b_c Zi,j,c=u=0∑k−1v=0∑k−1d=1∑CinKu,v,d,c⋅Xi+u,j+v,d+bc
每个输出通道对应一个独立的偏置 b c b_c bc。
二、梯度计算推导
以单通道卷积为例,推导卷积核参数的梯度。设损失函数为 L L L,需计算 ∂ L ∂ K u , v \frac{\partial L}{\partial K_{u,v}} ∂Ku,v∂L。
1. 前向传播公式回顾
Z = X ∗ K + b Z = X \ast K + b Z=X∗K+b
其中 ∗ \ast ∗ 表示有效卷积(无padding,stride=1)。
2. 反向传播梯度计算
假设已知上层传递的梯度 ∂ L ∂ Z \frac{\partial L}{\partial Z} ∂Z∂L,根据链式法则:
∂ L ∂ K u , v = ∑ i = 0 H − k ∑ j = 0 W − k ∂ L ∂ Z i , j ⋅ ∂ Z i , j ∂ K u , v \frac{\partial L}{\partial K_{u,v}} = \sum_{i=0}^{H-k} \sum_{j=0}^{W-k} \frac{\partial L}{\partial Z_{i,j}} \cdot \frac{\partial Z_{i,j}}{\partial K_{u,v}} ∂Ku,v∂L=i=0∑H−kj=0∑W−k∂Zi,j∂L⋅∂Ku,v∂Zi,j
由前向传播公式可得:
∂ Z i , j ∂ K u , v = X i + u , j + v \frac{\partial Z_{i,j}}{\partial K_{u,v}} = X_{i+u, j+v} ∂Ku,v∂Zi,j=Xi+u,j+v
因此:
∂ L ∂ K u , v = ∑ i = 0 H − k ∑ j = 0 W − k ∂ L ∂ Z i , j ⋅ X i + u , j + v \frac{\partial L}{\partial K_{u,v}} = \sum_{i=0}^{H-k} \sum_{j=0}^{W-k} \frac{\partial L}{\partial Z_{i,j}} \cdot X_{i+u, j+v} ∂Ku,v∂L=i=0∑H−kj=0∑W−k∂Zi,j∂L⋅Xi+u,j+v
矩阵形式:
∂ L ∂ K = X ⋆ ∂ L ∂ Z \frac{\partial L}{\partial K} = X \star \frac{\partial L}{\partial Z} ∂K∂L=X⋆∂Z∂L
其中 ⋆ \star ⋆ 表示**互相关(cross-correlation)**运算。
3. 多通道扩展
对于多通道输入和多个卷积核的情况,梯度计算需按通道累加:
∂ L ∂ K u , v , d , c = ∑ i = 0 H − k ∑ j = 0 W − k ∂ L ∂ Z i , j , c ⋅ X i + u , j + v , d \frac{\partial L}{\partial K_{u,v,d,c}} = \sum_{i=0}^{H-k} \sum_{j=0}^{W-k} \frac{\partial L}{\partial Z_{i,j,c}} \cdot X_{i+u, j+v, d} ∂Ku,v,d,c∂L=i=0∑H−kj=0∑W−k∂Zi,j,c∂L⋅Xi+u,j+v,d
三、数学推导可视化
图示说明:梯度计算本质是输入特征图与输出梯度的互相关操作
四、PyTorch代码实现
以下代码展示手动实现卷积前向传播与梯度计算:
import torchdef conv2d_forward(X, K, b, stride=1):# X: (H, W), K: (k, k), b: scalark = K.shape[0]H, W = X.shapeout_h = (H - k) // stride + 1out_w = (W - k) // stride + 1Z = torch.zeros(out_h, out_w)for i in range(0, out_h):for j in range(0, out_w):receptive_field = X[i*stride:i*stride+k, j*stride:j*stride+k]Z[i,j] = (receptive_field * K).sum() + breturn Zdef conv2d_backward(dL_dZ, X, K_shape, stride=1):# dL_dZ: 上层梯度, X: 输入, K_shape: 卷积核尺寸k = K_shape[0]dL_dK = torch.zeros(k, k)for u in range(k):for v in range(k):# 计算每个K[u,v]的梯度X_slice = X[u:u+dL_dZ.shape[0]*stride:stride, v:v+dL_dZ.shape[1]*stride:stride]dL_dK[u,v] = (X_slice * dL_dZ).sum()return dL_dK# 测试示例
X = torch.tensor([[1,2,3,4], [5,6,7,8], [9,10,11,12]], dtype=torch.float32)
K = torch.tensor([[1,0], [0,1]], dtype=torch.float32)
b = 0.0# 前向传播
Z = conv2d_forward(X, K, b, stride=1)
print("Output feature map:\n", Z)# 假设上层梯度为全1矩阵
dL_dZ = torch.ones_like(Z)
dL_dK = conv2d_backward(dL_dZ, X, K.shape)
print("Gradient of K:\n", dL_dK)
五、关键公式总结
计算类型 | 公式 |
---|---|
前向传播 | Z i , j = ∑ u , v K u , v X i + u , j + v + b Z_{i,j} = \sum_{u,v} K_{u,v} X_{i+u,j+v} + b Zi,j=∑u,vKu,vXi+u,j+v+b |
核梯度 | ∂ L ∂ K u , v = ∑ i , j ∂ L ∂ Z i , j X i + u , j + v \frac{\partial L}{\partial K_{u,v}} = \sum_{i,j} \frac{\partial L}{\partial Z_{i,j}} X_{i+u,j+v} ∂Ku,v∂L=∑i,j∂Zi,j∂LXi+u,j+v |
输入梯度* | ∂ L ∂ X p , q = ∑ u , v ∂ L ∂ Z p − u , q − v K u , v \frac{\partial L}{\partial X_{p,q}} = \sum_{u,v} \frac{\partial L}{\partial Z_{p-u,q-v}} K_{u,v} ∂Xp,q∂L=∑u,v∂Zp−u,q−v∂LKu,v |
*注:输入梯度计算需要处理边界条件(padding区域补零)
六、工程实现优化
-
im2col优化:将卷积操作转换为矩阵乘法
- 将输入局部块展开为列向量
- 卷积核展开为行向量
- 计算 Z = K f l a t ⋅ X i m 2 c o l Z = K_{flat} \cdot X_{im2col} Z=Kflat⋅Xim2col
-
CUDA加速:利用GPU并行计算每个输出位置的卷积结果
-
Winograd算法:减少乘法次数,提升小卷积核效率
七、常见问题解答
Q1:为什么梯度计算使用互相关而不是严格卷积?
- 数学推导中梯度 ∂ L ∂ K \frac{\partial L}{\partial K} ∂K∂L 的计算本质是输入与输出梯度的互相关
- 卷积核旋转180度后等价于互相关操作
Q2:如何处理带padding的卷积梯度?
- 前向传播时若使用padding,反向传播需在输入梯度计算时裁剪对应区域
Q3:多GPU训练时梯度如何同步?
- 每个GPU计算局部梯度,通过All-Reduce操作汇总梯度
通过深入理解卷积核的数学实现与梯度计算原理,可以更好地进行模型调试、定制化卷积操作设计以及性能优化。
池化层(Pooling Layer)是卷积神经网络中用于特征降维的核心组件,其数学形式与梯度计算方式如下:
一、Pool层的定义与数学形式
池化层通过对特征图进行下采样操作,保留主要特征并减少数据维度。常见类型包括:
-
最大池化(Max Pooling)
数学形式:
Z i , j = max ( u , v ) ∈ R X i ⋅ s + u , j ⋅ s + v Z_{i,j} = \max_{(u,v) \in \mathcal{R}} X_{i \cdot s + u, j \cdot s + v} Zi,j=(u,v)∈RmaxXi⋅s+u,j⋅s+v
其中 R \mathcal{R} R 是池化窗口(如2x2区域), s s s 为步长。 -
平均池化(Average Pooling)
数学形式:
Z i , j = 1 ∣ R ∣ ∑ ( u , v ) ∈ R X i ⋅ s + u , j ⋅ s + v Z_{i,j} = \frac{1}{|\mathcal{R}|} \sum_{(u,v) \in \mathcal{R}} X_{i \cdot s + u, j \cdot s + v} Zi,j=∣R∣1(u,v)∈R∑Xi⋅s+u,j⋅s+v
其中 ∣ R ∣ |\mathcal{R}| ∣R∣ 是窗口内元素数量。
二、梯度计算方式
池化层的反向传播需根据前向传播的记录信息进行梯度分配:
-
最大池化梯度
梯度仅传递到前向传播中最大值所在位置,其他位置梯度为0:
∂ L ∂ X p , q = { ∂ L ∂ Z i , j , 若 X p , q 是前向传播中的最大值 0 , 其他情况 \frac{\partial L}{\partial X_{p,q}} = \begin{cases} \frac{\partial L}{\partial Z_{i,j}}, & \text{若 } X_{p,q} \text{ 是前向传播中的最大值} \\ 0, & \text{其他情况} \end{cases} ∂Xp,q∂L={∂Zi,j∂L,0,若 Xp,q 是前向传播中的最大值其他情况
需通过上采样(up
操作)恢复梯度矩阵。 -
平均池化梯度
梯度均匀分配到前向传播对应的池化窗口内所有位置:
∂ L ∂ X p , q = 1 ∣ R ∣ ∑ ( i , j ) ∈ W ∂ L ∂ Z i , j \frac{\partial L}{\partial X_{p,q}} = \frac{1}{|\mathcal{R}|} \sum_{(i,j) \in \mathcal{W}} \frac{\partial L}{\partial Z_{i,j}} ∂Xp,q∂L=∣R∣1(i,j)∈W∑∂Zi,j∂L
其中 W \mathcal{W} W 是包含该位置的所有输出梯度区域。
三、PyTorch代码示例
# 最大池化层定义
max_pool = nn.MaxPool2d(kernel_size=2, stride=2)
# 反向传播时自动记录最大值位置,梯度仅回传至对应位置# 平均池化层定义
avg_pool = nn.AvgPool2d(kernel_size=2, stride=2)
# 反向传播时梯度均分到窗口内所有位置
四、核心作用总结
功能 | 最大池化 | 平均池化 |
---|---|---|
特征保留 | 突出显著特征(如边缘) | 平滑特征(如背景) |
梯度传播特性 | 稀疏梯度,加速收敛 | 稠密梯度,稳定性高 |
典型应用场景 | 图像分类(ResNet、VGG) | 语义分割(U-Net) |
池化层通过减少特征图尺寸提升计算效率,并通过位置不变性增强模型鲁棒性。实际应用中需根据任务特性选择池化类型,例如分类任务常用最大池化,分割任务可能结合平均池化。
在PyTorch中,nn.Conv2d
是构建卷积神经网络的核心组件,其参数含义如下:
核心参数解析
-
in_channels
- 输入数据的通道数
- 例如:灰度图为1,RGB图像为3
- 决定卷积核的深度(每个卷积核需匹配输入通道数)
-
out_channels
- 输出特征图的通道数(即卷积核数量)
- 每个卷积核生成一个独立的特征图
- 典型设置:逐层递增(如16→32→64)
-
kernel_size
- 卷积核的尺寸(整数或元组)
- 常见值:3×3(平衡感受野与计算量)
- 公式:输出尺寸 W o u t = ⌊ W i n + 2 p − k s ⌋ + 1 W_{out} = \lfloor \frac{W_{in} + 2p -k}{s} \rfloor +1 Wout=⌊sWin+2p−k⌋+1
( k k k为核尺寸, p p p为填充, s s s为步长)
-
stride
- 卷积核滑动步长(默认1)
- 步长越大,输出特征图尺寸越小
- 典型应用:步长2用于下采样
-
padding
- 输入边缘填充像素数(默认0)
- 保持输入输出尺寸一致时需设置
padding=(k-1)/2
- 支持非对称填充需用
nn.ZeroPad2d
预处理
-
dilation
- 卷积核元素间距(默认1)
- 增大感受野不增加参数(空洞卷积)
- 示例:
dilation=2
时3×3核等效5×5感受野
-
groups
- 分组卷积设置(默认1)
groups=in_channels
时实现深度可分离卷积- 减少参数量的重要技巧
-
bias
- 是否添加偏置项(默认True)
- 公式: o u t p u t = c o n v ( i n p u t ) + b output = conv(input) + b output=conv(input)+b
-
padding_mode
- 填充模式(默认’zeros’)
- 可选:‘reflect’(镜像填充)、‘replicate’(边缘复制)等
典型应用示例
import torch.nn as nn# 输入3通道(RGB), 输出64通道, 3x3卷积核
conv = nn.Conv2d(in_channels=3, out_channels=64,kernel_size=3,stride=1,padding=1,bias=True)
参数选择建议
- 通道数:通常逐层翻倍(16→32→64)以提取复杂特征
- 核尺寸:优先使用3×3小核堆叠(相比5×5参数量更少)
- 步长:分类网络常在前几层用步长2快速下采样
- 高级技巧:结合分组卷积(MobileNet)或空洞卷积(语义分割)优化性能
通过合理配置这些参数,可以构建高效的特征提取网络。实际应用中需根据任务需求调整参数组合,并通过可视化工具(如TensorBoard)观察特征图变化。
相关文章:

用deepseek学大模型08-卷积神经网络(CNN)
yuanbao.tencent.com 从入门到精通卷积神经网络(CNN),着重介绍的目标函数,损失函数,梯度下降 标量和矩阵形式的数学推导,pytorch真实能跑的代码案例以及模型,数据,预测结果的可视化展示, 模型应用场景和优缺点…...

蓝桥杯单片机基础部分——6、555定时器
前言 NE555是一个纯硬件的设计,旦硬件电路确定了,其功能也确定了,没有可编程的部分,也没什么好去理解的地方,如果理解不了就直接背代码,这里也不是很常考,大家了解一下就可以了,知道…...
Python学习心得函数
一、函数的定义及调用 1.函数的定义: 函数的定义:函数是将一段能实现某种特定功能的代码,使用函数名进行封装,并通过函数名称进行调用。从而达到一次编写,多次调用的目的。 2.函数类型分为两类: &#…...

神经网络实验——MLP
目录 1 目的 2 方法 3 源代码 4 结果 1 目的 ①熟悉 Python 的输入输出流; ②学会使用 matplotlib进行图像可视化; ③掌握神经网络的基本原理,学会使用 sklearn 库中的 MLPClassifier 函数构建基础的多层感知机神经网络分类器; ④学会使用网格查找进行超参数优…...

配置Api自动生成
我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/TVlJdMgYLoDJrsxAwMgcCE14nxt 使用Springfox Swagger生成API,并导入Postman,完成API单元测试 Swagger: 是一套API定义的规范,按照这套规范的要求去定义接口及接口相关信息,再通过可…...

dify-AI 私有部署可修改前端页面
dify文档 官方文档:欢迎使用 Dify | Dify 源码:https://github.com/langgenius/dify.git 安装docker 官网:https://www.docker.com/ 部署服务到docker cd dify cd docker cp .env.example .env docker compose up -d查看效果 http://localh…...
使用 @Results 注解来手动指定字段映射
在 MyBatis 中,Results 注解用于手动指定查询结果的字段映射,尤其当数据库列名与 Java 对象的字段名不一致时。你可以通过 Results 和 Result 注解来精确控制每一列与类属性之间的映射关系。 示例:使用 Results 注解来手动指定字段映射 假设你…...

数据治理中 大数据处理一般都遵循哪些原则
在数据治理中,大数据处理通常遵循以下原则: 最小化原则:企业应只收集实现特定目的所需的数据,避免数据冗余和安全风险。 合法性原则:企业必须遵守相关法律法规,确保数据处理符合法律要求,降低法…...

从0到1:STM32温控系统开发踩坑指南
1. 设计目标 核心功能:实现0-100℃范围内的温度闭环控制 性能指标: 测量精度:0.5℃(使用DS18B20传感器) 控制响应时间:<5秒 显示分辨率:0.1℃ 扩展功能: LCD实时显示当前温度…...
修改时无条件,可以自定义id条件(通过查询)
在这段代码中,$(row).attr(data-rarity, data.rarity); 的作用是给表格的每一行 (row) 添加一个 data-rarity 的自定义属性,属性的值是该行数据中的 rarity 字段。 解释: 1.row 是当前行的 DOM 元素。 2.data.rarity 是从 data 对象中获取的…...

工业制造能耗管理新突破,漫途MTIC-ECM平台助力企业绿色转型!
在工业制造领域,能源消耗一直是企业运营成本的重要组成部分。随着“双碳”目标的推进,如何实现高效能耗管理,成为制造企业亟待解决的问题。漫途MTIC-ECM能源能耗在线监测平台,结合其自研的硬件产品,为工业制造企业提供…...
实现一个简单的协同过滤推荐算法
题目描述: 协同过滤是推荐系统中的一种常用技术,其基本思想是利用用户之间的相似性或物品之间的相似性来进行推荐。本次面试题要求实现一个基于用户的协同过滤推荐算法。 具体要求: 定义两个类:User 和 Item,分别表示用…...

eNSP防火墙综合实验
一、实验拓扑 二、ip和安全区域配置 1、防火墙ip和安全区域配置 新建两个安全区域 ip配置 Client1 Client2 电信DNS 百度web-1 联通DNS 百度web-2 R2 R1 三、DNS透明代理相关配置 1、导入运营商地址库 2、新建链路接口 3、配置真实DNS服务器 4、创建虚拟DNS服务器 5、配置D…...
操作系统知识(二)
1、线程切换进行了哪些动作 在操作系统中,线程切换(也称为上下文切换)是指操作系统将 CPU 的控制权从一个线程转移到另一个线程的过程。这个过程涉及多个步骤和动作,主要包括以下几个方面: 1. 保存当前线程的上下文 …...

图论:tarjan 算法求解强连通分量
题目描述 有一个 n n n 个点, m m m 条边的有向图,请求出这个图点数大于 1 1 1 的强连通分量个数。 输入格式 第一行为两个整数 n n n 和 m m m。 第二行至 m 1 m1 m1 行,每一行有两个整数 a a a 和 b b b,表示有一条…...

Spring中Bean的四种实例化方法
Bean的四种实例化方法 Bean是Spring核心的概念,另外一个核心的概念是AOP。官网上,Bean的解释是: In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans…...
专利申请要求
专利申请并不要求发明已经实际制造出来,但需要具备完整且可行的技术方案。以下是详细的解释和申请流程: 一、专利申请的核心要求 技术方案而非实物 专利保护的是创新性的技术方案或设计理念,而非实物产品本身。只要你能清晰描述技术原理、结构…...
解锁 JavaScript 异步编程:Promise 链式操作、async/await 与 Promise.all 深度剖析
1.引言 在 JavaScript 的世界里,异步编程是一个核心且关键的概念。随着 Web 应用的复杂度不断提升,处理多个异步操作的需求也日益增长。传统的回调函数方式容易陷入 “回调地狱”,让代码的可读性和可维护性大打折扣。而 Promise 的出现为异步编程带来了新的曙光,后续又衍生…...

Centos虚拟机扩展磁盘空间
Centos虚拟机扩展磁盘空间 扩展前后效果1 虚拟机vmware关机后,编辑2 扩展2.1 查看2.2 新建分区2.3 格式化新建分区ext42.3.1 格式化2.3.2 创建2.3.3 修改2.3.4 查看 2.4 扩容2.4.1 扩容2.4.1 查看 扩展前后效果 df -h1 虚拟机vmware关机后,编辑 2 扩展 …...

记录一次部署PC端网址全过程
当我查看我之前写的文章时、顿时惊奇发出感慨:啥时候写的?是我写的么?疑惑重重… 所以说,好记性不如烂笔头。 记录一次部署PC端网址全过程 部署PC端网址分是三步:第一步:申请域名并映射到外网IP ࿰…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...