AI_基于pytorch对预训练模型ResNet50进行fine-tuning

目标

适配新的数据---非结构数据结构化方式之一

数据集

  数据集---数据量和数据相似度  
不同数据集下如何进行微调
    数据量大,数据相似度高
    数据量大,数据相似度低
    数据量少,但数据相似度非常高
如果数据集数量过少,我们进来只训练最后一层,如果数据集数量中等,冻结预训练网络的前几层的权重也是一种常见做法	

说明

 截断预先训练好的网络的最后一层(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[range(len(y_hat)), y] 提取了每个样本对应的真实类别概率
### y_hat和y分别作为预测的概率分布和标签
#### 数据样本y_hat,其中包含2个样本在3个类别的预测概率
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)
##已有的说明	 torch.nn.CrossEntropyLoss类
# pytorch version
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#loss-functions
 pytorch自定义网络层 pytorch 自定义层 https://blog.51cto.com/u_16099316/6958533
posted @   辰令  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
点击右上角即可分享
微信分享提示