目标
适配新的数据
数据集
数据集
不同数据集下如何进行微调
数据量大,数据相似度高
数据量大,数据相似度低
数据量少,但数据相似度非常高
如果数据集数量过少,我们进来只训练最后一层,如果数据集数量中等,冻结预训练网络的前几层的权重也是一种常见做法
说明
截断预先训练好的网络的最后一层(softmax层),并用与我们自己的问题相关的新的softmax层替换它
训练样本集有一定的要求,因此我们需要对数据进行增强,在原数据集的基础上随机旋转、平移、缩放、产生噪音,从而更好地聚焦于数字特征的提取,而不是数据集本身
步骤如下:
1. 下载ResNet50不包含全连接层的模型参数到本地(https://download.pytorch.org/models/resnet50-0676ba61.pth);
2. 定义好ResNet50的网络结构;
3. 将预训练的模型参数加载到我们所定义的网络结构中;
4. 更改全连接层结构,便于对我们的分类任务进行处
5. 或者根据需要解冻最后几个block,然后以很低的学习率开始训练。
模型离线下载并保存到位置 ~/.cache/torch/hub/checkpoints/
model.named_parameters() 是PyTorch中nn.Module类的方法之一,常用于获取模型的所有参数及其对应的名称
训练的Resnet部署
路线:xx.pth -> xx.onnx -> xx.trt
基本构成
Dataset
数据集
modules
定义网络的层和参数 前向传播的过程
torch.nn提供了多种损失函数
损失函数
PyTorch内置的损失函数作
高阶API: torch.nn.* 使用类来进行包装
低层API: torch.nn.Functional 实现函数的运算功能
优化器
optim.SGD:随机梯度下降优化器
optim.Adam:Adam优化器。
定义损失函数和优化器
训练模型
训练和推理过程
前向传播、计算损失、反向传播以及参数更新
网络结构
循环神经网络(Recurrent Neural Network,RNN) 递归神经网络(Recursive Neural Network
定义网络结构
modules (layers)
01.通过继承torch.nn.Module类并定义自己的网络结构来实现。
nn.Module nn.Module 通常包含一个名为forward的方法。这个方法定义了模块的前向传播行为
nn.ModuleList()需要定义一个forward函数
02.torch.nn.Sequential() OrderedDict nn.Sequential还能add_module
nn.Sequential容器来顺序地堆叠层。这适用于层与层之间没有复杂的交互的情况。
基本层 layers
卷积层 Convolution Layers 语法: 输入和输出以及功能 nn.Conv2d() 转置卷积—nn.ConvTranspose
池化层 Pooling Layer nn.MaxPool2d nn.AvgPool2d nn.MaxUnpool2d
激活函数层 Activate Layer nn.Sigmoid nn.tanh nn.ReLU nn.PReLU
全连接层 -线性层 Linear Layer
循环层 nn.RNN nn.LSTM() nn.GRU()
attention 层
Transformer层:一种基于自注意力机制的神经网络结构, nn.Transformer nn.TransformerEncoderLayer
CNN模型结构:
卷积层(Convolutional Layer)
池化层(Pooling Layer)
全连接层(Fully - Connected Layer
Transformer
自注意力机制(Self - Attention):这是Transformer的核心组件
输入n个向量,每个向量得到一组(q,k,v),通过Attention(Q, K,V)将不同向量的(q,k,v)进行相互联系,
最后就得到了n个输出
多头注意力(Multi - Head Attention)
每个向量得到的(q,k,v)分为多份(多头)
是多个并行的Self-Attention层,每个“头”都独立地学习不同的注意力权重 Multi-Head Attention能够同时关注来自输入序列的不同子空间的信息
位置编码(Positional Encoding)
参数概念
in_channels:输入通道数
out_channels:输出通道数,等价于卷积核个数
kernel_size:卷积核尺寸
stride:步长
padding:填充个数(一般用来保持输入输出尺寸一致)
dilation:空洞卷积大小
groups:分组卷积设置
bias:偏置
dilation:池化间隔大小 return_indices:记录池化像素索引
in_features:输入结点数
out_features:输出结点数
补充概念
softmax
softmax 指数让得分大的分类最终的概率更大,得分小的分类最终的概率更小,而得分为负数的分类,几乎可以忽略
softmax函数能够将未规范化的预测变换为非负数并且总和为1,同时让模型保持 可导的性质
基本
torch.sum(input, *, dim=None, keepdim=False, out=None)
Tensor.sum(dim=None, keepdim=False, dtype=None) → Tensor 沿着指定维度求和
keepdim=True 保持在原始张量的轴数
实现softmax由三个步骤组成:
对每个项求幂(使用exp);
对每一行求和(小批量中每个样本是一行),得到每个样本的规范化常数;
将每一行除以其规范化常数,确保结果的和为1
def custom_softmax(X):
X_exp = torch.exp(X)
partition = X_exp.sum(1, keepdim=True)
return X_exp / partition
import torch
import torch.nn as nn
if __name__ =="__main__":
input_logits = torch.tensor([1.0,2.0,3.0])
softmax = nn.Softmax(dim=0)
prob = softmax(input_logits)
print("orin data ",input_logits,"\r\n","prob info",prob)
print(input_logits.shape,prob.shape,prob.sum(0))
交叉熵
交叉熵损失函数是衡量模型预测的概率分布与真实标签的概率分布之间差异的一种常用方法
y_hat = torch.tensor([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])
y = torch.tensor([0, 2])
y_hat[[0, 1], y]
def custom_cross_entropy(y_hat, y):
return - torch.log(y_hat[range(len(y_hat)), y])
cross_entropy(y_hat, y)
entroy=nn.CrossEntropyLoss()
参考
https://github.com/Highwe2hell/resnet-50
https://download.pytorch.org/models/resnet50-0676ba61.pth
https://zh-v2.d2l.ai/chapter_linear-networks/softmax-regression-scratch.html
https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py
https://pytorch.org/docs/stable/nn.html
pytorch自定义网络层 pytorch 自定义层 https://blog.51cto.com/u_16099316/6958533
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)