yuanbao.tencent.com
从入门到精通卷积神经网络(CNN),着重介绍的目标函数,损失函数,梯度下降 标量和矩阵形式的数学推导,pytorch真实能跑的代码案例以及模型,数据,预测结果的可视化展示, 模型应用场景和优缺点,及如何改进解决及改进方法数据推导。
一、目标函数与损失函数数学推导
1. 均方误差(MSE)
标量形式:
E(w)=12∑i=1N(yi−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)=12(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^=WX+b\mathbf{\hat{Y}} = \mathbf{WX} + \mathbf{b}Y^=WX+b,适用于回归任务。
2. 交叉熵损失
分类任务公式:
L=−1N∑i=1N∑c=1Cyi,clog(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)
其中 CCC 为类别数,y^i,c\hat{y}_{i,c}y^i,c 为 softmax 输出概率。
二、梯度下降的数学推导
标量形式(以 MSE 为例):
∂E∂wj=∑i=1N(yi−y^i)⋅xi,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
参数更新:
wj←wj−η∂E∂wj w_j \leftarrow w_j - \eta \frac{\partial E}{\partial w_j} wj←wj−η∂wj∂E
矩阵形式(卷积层梯度):
设第 lll 层卷积核为 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

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



