当前位置: 首页 > news >正文

用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=1N(yiy^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(YY^)T(YY^)
其中 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=1Nc=1Cyi,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} wjE=i=1N(yiy^i)xi,j
参数更新:
w j ← w j − η ∂ E ∂ w j w_j \leftarrow w_j - \eta \frac{\partial E}{\partial w_j} wjwjηwjE

矩阵形式(卷积层梯度):

设第 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[l1]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()

四、可视化展示

  1. 特征图可视化:使用 torchvision.utils.make_grid 显示卷积层输出。
  2. 预测结果对比:绘制真实标签与预测标签的混淆矩阵。
  3. 训练过程监控:绘制损失和准确率曲线(示例见代码)。

五、应用场景与优缺点

应用场景优缺点
图像分类(ResNet)✅ 自动特征提取;❌ 对旋转/缩放敏感
目标检测(YOLO)✅ 高效定位;❌ 小目标检测困难
医学影像分割(U-Net)✅ 像素级精度;❌ 需要大量标注数据

六、改进方法

  1. 梯度消失问题:使用残差连接(ResNet)。
  2. 感受野限制:引入空洞卷积(Dilated Convolution)。
  3. 计算效率:采用深度可分离卷积(MobileNet)。

数学推导补充(矩阵形式)

设卷积层输入为 X ∈ R H × W × C \mathbf{X} \in \mathbb{R}^{H\times W\times C} XRH×W×C,卷积核 W ∈ R k × k × C × D \mathbf{W} \in \mathbb{R}^{k\times k\times C\times D} WRk×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=1Cu=k/2k/2v=k/2k/2Wu,v,c,dXi+u,j+v,c
反向传播时,梯度计算需展开为矩阵乘法形式。


如需更详细的代码扩展或特定改进方法的推导,请进一步说明需求。

CNN与MLP的深度对比分析


一、核心结构差异
维度CNNMLP
连接方式局部连接 + 权值共享全连接
参数规模参数少(卷积核复用)参数爆炸(每层全连接)
输入结构保留空间维度(H×W×C)必须展平为向量(H×W×C → D)
特征提取自动学习局部到全局的层次特征依赖人工特征工程或隐式全局特征

二、数学本质对比
  1. 卷积运算 vs 矩阵乘法

    • CNN:通过卷积核滑动计算局部特征(稀疏交互
      Z = W ∗ X + b \mathbf{Z} = \mathbf{W} \ast \mathbf{X} + \mathbf{b} Z=WX+b
    • MLP:通过全连接权重矩阵计算全局特征(密集交互
      Z = W T X + b \mathbf{Z} = \mathbf{W}^T \mathbf{X} + \mathbf{b} Z=WTX+b
  2. 反向传播差异

    • 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)


五、本质优势解析
  1. 平移不变性 (Translation Invariance)

    • CNN通过卷积核共享,自动识别目标在不同位置的特征
    • MLP需在不同位置重复学习相同模式,效率低下
  2. 层次特征学习

    • 低级特征 → 边缘/纹理(浅层卷积)
    • 高级特征 → 物体部件/整体(深层卷积)
    • MLP缺乏显式的层次特征提取机制
  3. 参数效率

    • 示例:输入尺寸224×224的RGB图像
      • CNN第一层(3×3卷积,32通道):3×3×3×32 = 864参数
      • MLP第一层(全连接,512节点):224×224×3×512 ≈ 77M参数

六、适用场景选择指南
场景推荐模型原因
图像/视频处理CNN空间特征保留,参数高效
结构化表格数据MLP无空间关联,全连接更直接
时序数据(LSTM替代)MLP/RNNCNN需设计1D卷积,可能不如RNN自然
小样本学习MLPCNN需要大量数据防止过拟合

七、改进方向对比
问题CNN解决方案MLP解决方案
过拟合Dropout, 数据增强L2正则化, 早停
梯度消失残差连接(ResNet)激活函数改进(ReLU)
计算效率深度可分离卷积(MobileNet)网络剪枝, 量化
全局依赖建模自注意力机制(Vision Transformer)增加隐藏层宽度

八、数学视角的差异本质

设输入为 X ∈ R H × W × C \mathbf{X} \in \mathbb{R}^{H\times W\times C} XRH×W×C,两种网络的函数表达能力差异:

  1. 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={ff(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))

  2. 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={ff(X)=W2Tσ(W1Tvec(X))}
    丢失空间结构信息,需从数据中重新学习位置相关性


九、实战建议
  1. 图像任务首选CNN:即使简单任务(如MNIST),CNN在准确率和鲁棒性上显著优于MLP
  2. 混合架构趋势:现代模型常结合两者优势(如CNN提取特征 + MLP分类头)
  3. 计算资源考量:MLP在小型结构化数据上训练更快,CNN需要GPU加速

通过理解这些本质区别,可以更明智地根据任务特性选择模型架构。

卷积核的数学实现与梯度推导详解


一、卷积核的数学形式

卷积核的本质是局部特征提取器,其数学实现可分为单通道和多通道两种情况。


1. 单通道卷积(2D卷积)

输入:单通道特征图 X ∈ R H × W X \in \mathbb{R}^{H \times W} XRH×W
卷积核 K ∈ R k × k K \in \mathbb{R}^{k \times k} KRk×k(假设 k k k 为奇数)
输出:特征图 Z ∈ R ( H − k + 1 ) × ( W − k + 1 ) Z \in \mathbb{R}^{(H-k+1) \times (W-k+1)} ZR(Hk+1)×(Wk+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=0k1v=0k1Ku,vXi+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}} XRH×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}} KRk×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}} ZR(Hk+1)×(Wk+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=0k1v=0k1d=1CinKu,v,d,cXi+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,vL


1. 前向传播公式回顾

Z = X ∗ K + b Z = X \ast K + b Z=XK+b
其中 ∗ \ast 表示有效卷积(无padding,stride=1)。


2. 反向传播梯度计算

假设已知上层传递的梯度 ∂ L ∂ Z \frac{\partial L}{\partial Z} ZL,根据链式法则:
∂ 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,vL=i=0Hkj=0WkZi,jLKu,vZi,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,vZi,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,vL=i=0Hkj=0WkZi,jLXi+u,j+v

矩阵形式
∂ L ∂ K = X ⋆ ∂ L ∂ Z \frac{\partial L}{\partial K} = X \star \frac{\partial L}{\partial Z} KL=XZL
其中 ⋆ \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,cL=i=0Hkj=0WkZi,j,cLXi+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,vL=i,jZi,jLXi+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,qL=u,vZpu,qvLKu,v

*注:输入梯度计算需要处理边界条件(padding区域补零)


六、工程实现优化
  1. im2col优化:将卷积操作转换为矩阵乘法

    • 将输入局部块展开为列向量
    • 卷积核展开为行向量
    • 计算 Z = K f l a t ⋅ X i m 2 c o l Z = K_{flat} \cdot X_{im2col} Z=KflatXim2col
  2. CUDA加速:利用GPU并行计算每个输出位置的卷积结果

  3. Winograd算法:减少乘法次数,提升小卷积核效率


七、常见问题解答

Q1:为什么梯度计算使用互相关而不是严格卷积?

  • 数学推导中梯度 ∂ L ∂ K \frac{\partial L}{\partial K} KL 的计算本质是输入与输出梯度的互相关
  • 卷积核旋转180度后等价于互相关操作

Q2:如何处理带padding的卷积梯度?

  • 前向传播时若使用padding,反向传播需在输入梯度计算时裁剪对应区域

Q3:多GPU训练时梯度如何同步?

  • 每个GPU计算局部梯度,通过All-Reduce操作汇总梯度

通过深入理解卷积核的数学实现与梯度计算原理,可以更好地进行模型调试、定制化卷积操作设计以及性能优化。

池化层(Pooling Layer)是卷积神经网络中用于特征降维的核心组件,其数学形式与梯度计算方式如下:

一、Pool层的定义与数学形式

池化层通过对特征图进行下采样操作,保留主要特征并减少数据维度。常见类型包括:

  1. 最大池化(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)RmaxXis+u,js+v
    其中 R \mathcal{R} R 是池化窗口(如2x2区域), s s s 为步长。

  2. 平均池化(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=R1(u,v)RXis+u,js+v
    其中 ∣ R ∣ |\mathcal{R}| R 是窗口内元素数量。

二、梯度计算方式

池化层的反向传播需根据前向传播的记录信息进行梯度分配:

  1. 最大池化梯度
    梯度仅传递到前向传播中最大值所在位置,其他位置梯度为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,qL={Zi,jL,0, Xp,q 是前向传播中的最大值其他情况
    需通过上采样(up操作)恢复梯度矩阵。

  2. 平均池化梯度
    梯度均匀分配到前向传播对应的池化窗口内所有位置:
    ∂ 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,qL=R1(i,j)WZi,jL
    其中 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是构建卷积神经网络的核心组件,其参数含义如下:

核心参数解析

  1. in_channels

    • 输入数据的通道数
    • 例如:灰度图为1,RGB图像为3
    • 决定卷积核的深度(每个卷积核需匹配输入通道数)
  2. out_channels

    • 输出特征图的通道数(即卷积核数量)
    • 每个卷积核生成一个独立的特征图
    • 典型设置:逐层递增(如16→32→64)
  3. 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+2pk+1
      k k k为核尺寸, p p p为填充, s s s为步长)
  4. stride

    • 卷积核滑动步长(默认1)
    • 步长越大,输出特征图尺寸越小
    • 典型应用:步长2用于下采样
  5. padding

    • 输入边缘填充像素数(默认0)
    • 保持输入输出尺寸一致时需设置padding=(k-1)/2
    • 支持非对称填充需用nn.ZeroPad2d预处理
  6. dilation

    • 卷积核元素间距(默认1)
    • 增大感受野不增加参数(空洞卷积)
    • 示例:dilation=2时3×3核等效5×5感受野
  7. groups

    • 分组卷积设置(默认1)
    • groups=in_channels时实现深度可分离卷积
    • 减少参数量的重要技巧
  8. 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
  9. 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真实能跑的代码案例以及模型,数据,预测结果的可视化展示, 模型应用场景和优缺点&#xf…...

6.【线性代数】—— 列空间和零空间

六 列空间和零空间 1. 列空间 C(A)2. 零空间 N(A)2.1 定义2.2 为什么零空间是一个子空间?2.3 Axb的解空间,是一个子空间吗? 1. 列空间 C(A) [ c o l 11 c o l 21 c o l 31 c o l 12 c o l 22 c o l 32 c o l 13 c o l 23 c o l 33 ] ⏟ A [ a…...

Spring SmartLifecycle:精准控制Bean的生命周期

一、核心作用 SmartLifecycle 是 Spring 框架中用于 精确控制组件生命周期阶段 的高级接口,主要解决三类问题: 有序启停:控制多个组件启动/关闭顺序阶段化处理:将初始化/销毁操作划分为不同阶段上下文感知:获取应用上…...

【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析②】

ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase02 作者:车端域控测试工程师 更新日期:2025年02月15日 关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-002测试用例 用例ID测试场景验证要点参考条款预期…...

gitee SSH 公钥设置教程

Gitee 提供了基于 SSH 协议的 Git 服务,在使用 SSH 协议访问仓库仓库之前,需要先配置好账户 SSH 公钥。 1、生成秘钥 Windows 用户建议使用 Windows PowerShell 或者 Git Bash,在 命令提示符 下无 cat 和 ls 命令。 ssh-keygen -t ed25519 -C "Gitee SSH Key"中间…...

Wireshark 输出 数据包列表本身的值

在 Wireshark 中,如果你想输出数据包列表本身的值(例如,将数据包的摘要信息、时间戳、源地址、目的地址等导出为文本格式),可以使用 导出为纯文本文件 的功能。以下是详细步骤: 步骤 1:打开 Wir…...

electron 学习

文章目录 1.注意项1.1 安装前最好设置一下代理 官网 tutorial https://www.electronjs.org/docs/latest/tutorial/tutorial-prerequisites 1.注意项 1.1 安装前最好设置一下代理 npm config set registry https://registry.npmmirror.com/...

Asp.Net Core MVC 中级开发教程

Asp.Net Core MVC 中级开发教程 一、Asp.Net Core Mvc 区域使用 ASP.NET Core MVC的Areas使用整理 - 天马3798 - 博客园 二、Asp.Net Core 路径处理 Asp.Net Core Web相对路径、绝对路径整理 Asp.Net Core获取当前上下文对象 三、Asp.Net Core 服务使用和封装 四、Asp.Net …...

DeepSeek与ChatGPT的全面对比

在人工智能(AI)领域,生成式预训练模型(GPT)已成为推动技术革新的核心力量。OpenAI的ChatGPT自发布以来,凭借其卓越的自然语言处理能力,迅速占据市场主导地位。然而,近期中国AI初创公…...

什么是网络安全?网络安全防范技术包括哪些?

伴随着互联网的发展,它已经成为我们生活中不可或缺的存在,无论是个人还是企业,都离不开互联网。正因为互联网得到了重视,网络安全问题也随之加剧,给我们的信息安全造成严重威胁,而想要有效规避这些风险&…...

使用Java爬虫获取1688按图搜索商品(拍立淘API接口)

在电商领域,按图搜索商品(拍立淘)是一种非常实用的功能,尤其适合用户通过图片快速查找相似商品。1688开放平台提供了按图搜索商品的API接口,允许开发者通过图片获取相关的商品信息。本文将详细介绍如何使用Java爬虫技术…...

物联网技术赋能预测性维护的深度剖析与前景展望

一、引言 1.1 研究背景与意义 随着信息技术的飞速发展,物联网技术已逐渐渗透到各个行业领域,成为推动产业变革和创新的重要力量。物联网通过将各种设备、物品与互联网连接,实现数据的采集、传输和交互,为各行业带来了前所未有的智能化和自动化水平提升。在工业领域,设备…...

前端工程化的具体实现细节

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

Dav_笔记14:优化程序提示 HINTs -4

指定全局表提示 指定表的提示通常是指发生提示的DELETE,SELECT或UPDATE查询块中的表,而不是指语句引用的任何视图中的表。 如果要为显示在视图中的表指定提示,Oracle建议使用全局提示,而不是在视图中嵌入提示。 您可以使用包含具…...

解锁享元模式:内存优化与性能提升的关键密码

系列文章目录 待后续补充~~~ 文章目录 一、享元模式初相识二、享元模式的核心概念2.1 内部状态与外部状态2.2 享元角色剖析 三、Java 代码中的享元模式3.1 简单示例代码实现3.2 代码解析与关键步骤 四、实际应用场景探秘4.1 文本编辑器中的享元模式4.2 游戏开发中的享元模式4.3…...

负载均衡 方式

DNS 软件负载均衡 Nginx 也是 软件负载均衡 各种策略 1、轮询(默认) 2、weight(权重) 3、IP Hash (会话粘滞) 4、fair 5、UrlHash...

CAS单点登录(第7版)18.日志和审计

如有疑问,请看视频:CAS单点登录(第7版) 日志和审计 Logging 概述 Logging CAS 提供了一个日志记录工具,用于记录重要信息事件,如身份验证成功和失败;可以对其进行自定义以生成用于故障排除的其他信息。…...

Linux多版本管理工具介绍

一、update-alternatives工具 1. 简介 update-alternatives是Linux系统自带的一个用于管理多个版本命令的工具。它允许用户在不同的软件版本之间进行切换,而不需要手动修改环境变量或者链接文件。 2. 基本使用 查看已安装的alternatives 使用命令update-alterna…...

DeepSeek笔记(二):DeepSeek局域网访问

如果有多台电脑,可以通过远程访问,实现在局域网环境下多台电脑共享使用DeepSeek模型。在本笔记中,首先介绍设置局域网多台电脑访问DeepSeek-R1模型。 一、启动Ollama局域网访问 1.配置环境变量 此处本人的操作系统是Windows11,…...

摄像头畸变矫正

简单介绍 所谓畸变其实就是由摄像头引起的图片失真, 一般在广角摄像头表现明显, 原本平整的桌面通过镜头看像个球面, 直观的解释直线被拍成了曲线, 这让我想起来了一个表情包. 去畸变的办法 首先我们需要一个标准棋盘(印有特定的标定图案), 如图: 把它摊平放在桌子上, 然后用…...

EasyRTC:智能硬件适配,实现多端音视频互动新突破

一、智能硬件全面支持,轻松跨越平台障碍 EasyRTC 采用前沿的智能硬件适配技术,无缝对接 Windows、macOS、Linux、Android、iOS 等主流操作系统,并全面拥抱 WebRTC 标准。这一特性确保了“一次开发,多端运行”的便捷性&#xff0c…...

机器视觉--图像的运算(乘法)

一、引言 在图像处理领域,Halcon 是一款功能强大且广泛应用的机器视觉软件库。它提供了丰富的算子和工具,能够满足各种复杂的图像处理需求。图像的乘法运算作为其中一种基础操作,虽然不像一些边缘检测、形态学处理等操作那样被频繁提及&…...

蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)

Day 5:哈希表应用(两数之和、重复元素判断) 一、哈希表(Hash Table)基础 1. 什么是哈希表? 哈希表(Hash Table) 是一种键值对(key-value)存储的数据结构&…...

Kafka分区管理大师指南:扩容、均衡、迁移与限流全解析

#作者:孙德新 文章目录 分区分配操作(kafka-reassign-partitions.sh)1.1 分区扩容、数据均衡、迁移(kafka-reassign-partitions.sh)1.2、修改topic分区partition的副本数(扩缩容副本)1.3、Partition Reassign场景限流1.4、节点内副本移动到不…...

vue 接口传formdata

在Vue中,如果你需要向服务器发送FormData对象,通常是为了上传文件或者需要发送表单数据。FormData是一个非常有用的工具,因为它可以直接使用表单元素的值以及文件内容,并以一种浏览器兼容的方式来发送这些数据。下面是如何在Vue中…...

图像处理篇---基本OpenMV图像处理

文章目录 前言1. 灰度化(Grayscale)2. 二值化(Thresholding)3. 掩膜(Mask)4. 腐蚀(Erosion)5. 膨胀(Dilation)6. 缩放(Scaling)7. 旋转…...

DeepSeek预测25考研分数线

25考研分数马上要出了。 目前,多所大学已经陆续给出了分数查分时间,综合往年情况来看,每年的查分时间一般集中在2月底。 等待出成绩的日子,学子们的心情是万分焦急,小编用最近爆火的“活人感”十足的DeepSeek帮大家预…...

数据融合的经典模型:早期融合、中期融合与后期融合的对比

数据融合是处理多源数据时非常重要的技术,尤其是在多模态学习、传感器网络和智能系统中。它的目标是将来自不同来源、不同模态的数据进行有效结合,从而获得更准确、更全面的信息。在数据融合的过程中,不同的融合策略能够在性能、效率和应用场…...

Linux环境Docker使用代理推拉镜像

闲扯几句 不知不觉已经2月中了,1个半月忙得没写博客,这篇其实很早就想写了(可追溯到Docker刚刚无法拉镜像的时候),由于工作和生活上的事比较多又在备考软考架构,拖了好久…… 简单记录下怎么做的&#xf…...

LabVIEW用CANopen的设备属性配置与心跳消息和PDO读取

本示例展示了如何通过SDO(服务数据对象)配置设备属性,以及如何读取从设备周期性发送的心跳消息和PDO(进程数据对象)消息。通过该示例,可以有效地进行设备配置并实现数据监控,适用于CANopen网络中…...

DeepSeek01-本地部署大模型

一、ollama简介: 什么是 Ollama? Ollama 是一个用于本地部署和管理大模型的工具。它提供了一个简单的命令行界面, 使得用户可以轻松地下载、运行和管理各种大模型。Ollama 支持多种模型格式, 并且可以与现有的深度学习框架&#x…...

python学opencv|读取图像(七十五)人脸识别:Fisherfaces算法和LBPH算法

【1】引言 前序学习进程中,已经掌握了使用Eigenfaces算法进行的人脸识别。相关文章链接为: python学opencv|读取图像(七十四)人脸识别:EigenFaces算法-CSDN博客 在此基础上,学习剩余两种人脸识别算法&am…...

UMLS数据下载及访问

UMLS数据申请 这个直接在官网上申请即可,记得把地址填全,基本都会拿到lisence。 UMLS数据访问 UMLS的数据访问分为网页访问,API访问以及数据下载后的本地访问,网页访问,API访问按照官网的指示即可,这里主…...

UE_C++ —— Container TArray

目录 一,TArray 二,Creating and Filling an Array 三,Iteration 四,Sorting 五,Queries 六,Removal 七,Operators 八,Heap 九,Slack 十,Raw Memor…...

第435场周赛:奇偶频次间的最大差值 Ⅰ、K 次修改后的最大曼哈顿距离、使数组包含目标值倍数的最少增量、奇偶频次间的最大差值 Ⅱ

Q1、奇偶频次间的最大差值 Ⅰ 1、题目描述 给你一个由小写英文字母组成的字符串 s 。请你找出字符串中两个字符的出现频次之间的 最大 差值,这两个字符需要满足: 一个字符在字符串中出现 偶数次 。另一个字符在字符串中出现 奇数次 。 返回 最大 差值…...

模拟解决哈希表冲突

目录 解决哈希表冲突原理: 模拟解决哈希表冲突代码: 负载因子: 动态扩容: 总结: HashMap和HashSet的总结: 解决哈希表冲突原理: 黑色代表一个数组,当 出现哈希冲突时&#xff0…...

UIView 与 CALayer 的联系和区别

今天说一下UIView 与 CALayer 一、UIView 和 CALayer 的关系 在 iOS 开发中,UIView 是用户界面的基础,它负责处理用户交互和绘制内容,而 CALayer 是 UIView 内部用于显示内容的核心图层(Layer)。每个 UIView 内部都有…...

Android 10.0 移除wifi功能及相关菜单

介绍 客户的机器没有wifi功能,所以需要删除wifi相关的菜单,主要有设置-网络和互联网-WLAN,长按桌面设置弹出的WALN快捷方式,长按桌面-微件-设置-WLAN。 修改 Android10 上直接将config_show_wifi_settings改为false,这样wifi菜单的入口就隐…...

电力与能源杂志电力与能源杂志社电力与能源编辑部2024年第6期目录

研究与探索 含电动汽车虚拟电厂的优化调度策略综述 黄灿;曹晓满;邬楠; 643-645663 含换电站的虚拟电厂优化调度策略综述 张杰;曹晓满;邬楠;杨小龙; 646-649667 考虑虚拟负荷研判的V2G储能充电桩设计研究 徐颖;张伟阳;陈豪; 650-654 基于状态估计的电能质量监测…...

简站主题:简洁、实用、SEO友好、安全性高和后期易于维护的wordpress主题

简站主题以其简洁的设计风格、实用的功能、优化的SEO性能和高安全性而受到广泛好评。 简洁:简站主题采用扁平化设计风格,界面简洁明了,提供多种布局和颜色方案,适合各种类型的网站,如个人博客和企业网站。 实用&…...

Redis(高阶篇)03章——缓存双写一致性之更新策略探讨

一、反馈回来的面试题 一图你只要用缓存,就可能会涉及到redis缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性的问题双写一致性,你先动缓存redis还是数据库mysql哪一个&#x…...

【Git】说说Git中开发测试的使用Git分支Git标签的使用场景

一、环境介绍 dev环境:开发环境,外部用户无法访问,开发人员使用,版本变动很大。test环境:测试环境,外部用户无法访问,专门给测试人员使用的,版本相对稳定。pre环境:灰度环…...

Spring Boot中使用Server-Sent Events (SSE) 实现实时数据推送教程

一、简介 Server-Sent Events (SSE) 是HTML5引入的一种轻量级的服务器向浏览器客户端单向推送实时数据的技术。在Spring Boot框架中,我们可以很容易地集成并利用SSE来实现实时通信。 二、依赖添加 在Spring Boot项目中,无需额外引入特定的依赖&#x…...

【Golang学习之旅】Go 语言微服务架构实践(gRPC、Kafka、Docker、K8s)

文章目录 1. 前言:为什么选择Go语言构建微服务架构1.1 微服务架构的兴趣与挑战1.2 为什么选择Go语言构建微服务架构 2. Go语言简介2.1 Go 语言的特点与应用2.2 Go 语言的生态系统 3. 微服务架构中的 gRPC 实践3.1 什么是 gRPC?3.2 gRPC 在 Go 语言中的实…...

数据结构:栈(Stack)及其实现

栈(Stack)是计算机科学中常用的一种数据结构,它遵循先进后出(Last In, First Out,LIFO)的原则。也就是说,栈中的元素只能从栈顶进行访问,最后放入栈中的元素最先被取出。栈在很多应用…...

DeepSeek在linux下的安装部署与应用测试

结合上一篇文章,本篇文章主要讲述在Redhat linux环境下如何部署和使用DeepSeek大模型,主要包括ollama的安装配置、大模型的加载和应用测试。关于Open WebUI在docker的安装部署,Open WebUI官网也提供了完整的docker部署说明,大家可…...

Next.js【详解】获取数据(访问接口)

Next.js 中分为 服务端组件 和 客户端组件&#xff0c;内置的获取数据各不相同 服务端组件 方式1 – 使用 fetch export default async function Page() {const data await fetch(https://api.vercel.app/blog)const posts await data.json()return (<ul>{posts.map((…...

pnpm, eslint, vue-router4, element-plus, pinia

利用 pnpm 创建 vue3 项目 pnpm 包管理器 - 创建项目 Eslint 配置代码风格(Eslint用于规范纠错&#xff0c;prettier用于美观&#xff09; 在 设置 中配置保存时自动修复 提交前做代码检查 husky是一个 git hooks工具&#xff08;git的钩子工具&#xff0c;可以在特定实际执行特…...

将jar安装到Maven本地仓库中

将jar安装到Maven本地仓库中 1. 使用 mvn install:install-file 命令模版示例 2.项目中添加依赖 将一个 .jar 文件安装到 Maven 本地仓库中是一个常见的操作&#xff0c;尤其是在你想要在本地测试一个尚未发布到中央仓库的库时。以下是如何将 .jar 文件安装到 Maven 本地仓库的…...

Spring 和 Spring MVC 的关系是什么?

Spring和Spring MVC的关系就像是“大家庭和家里的小书房”一样。 Spring是一个大家庭&#xff0c;提供了各种各样的功能和服务&#xff0c;比如管理Bean的生命周期、事务管理、安全性等&#xff0c;它是企业级应用开发的全方位解决方案。这个大家庭里有很多房间&#xff0c;每个…...