首先是配置文件的学习:
在终端查看配置文件的命令:
python .\tools\misc\print_config.py
.\configs\mobilenet_v2\mobilenet-v2_8xb32_in1k.py
"""注意第一个路径是调用打印cfg文件的python文件,
第二个路径是该模型的cfg文件,目录是mmpretrain包的路径。"""
部分如图:
在工作台查看配置文件:
from mmengine import Config
file_name = "C:\\Users\\Sym\\mmpretrain\\configs\\mobilenet_v2\\mobilenet-v2_8xb32_in1k.py"
cfg = Config.fromfile(filename=file_name)
"""主要是用了mmengine中的Config方法,但是打印出来的结果不是很好看。不推荐这个方法。"""
如图:
以下是配置文件的内容学习部分:
首先要了解下神经网络的常规的三个部分:
骨干部分(Backbone):
骨干部分是神经网络的核心部分,通常由多个层或模块组成。它负责从输入数据中提取特征,并通过一系列的卷积、池化和非线性变换等操作将输入数据转换为高级别的特征表示。骨干部分通常使用卷积神经网络(CNN)结构,例如ResNet、VGG、MobileNet等,这些网络结构在计算机视觉任务中非常流行。骨干部分的目标是将原始输入数据转化为更有意义和抽象的特征表示,以便后续的任务处理。
颈部部分(Neck):
颈部部分位于骨干部分和头部部分之间,起到特征转换和融合的作用。颈部部分的设计是为了进一步改进骨干网络提取的特征表示。它可以包括池化操作、降维操作、特征融合或特征增强等技术。通过颈部部分的处理,可以对特征进行维度的调整、通道的融合或增强、空间分辨率的变化等,以提升特征的表达能力和适应性。颈部部分的设计要根据具体任务的需求和特征的特性进行选择,以提高模型的性能和泛化能力。
头部部分(Head):
头部部分是神经网络的最后一部分,它负责执行具体的任务,如分类、检测或分割等。头部部分通常包含一个或多个全连接层、分类器或回归器,用于根据特征进行最终的预测或输出。具体任务的要求会决定头部部分的设计,例如对于图像分类任务,头部部分可能包含一个全连接层和一个softmax分类器,用于预测图像的类别概率。头部部分的设计根据任务的输出需求进行,可以根据具体情况进行调整和定制。
# model settings
model = dict(
type='ImageClassifier', # 模型的类型
backbone=dict( # 骨干特征提取网络
type='ResNet',
depth=18,
num_stages=4, # 重点理解这个。
# 此部分理解为多尺度特征提取,
# 主干网络将输出4个阶段的特征图,作为后续头部网络的输入
out_indices=(3,), # 只使用第3个阶段的特征图
# frozen_stages=-1, # 冻结主干网的层数
style='pytorch'),
neck=dict(type='GlobalAveragePooling'),
# 指定颈网络的类型为全局平均池化层,用于将主干网络输出的特征图进行池化操作。
head=dict(
type='LinearClsHead', # 线性分类头,更多的分类头可以去查看官方API。
num_classes=2, # 分类的类别数。
in_channels=512, # 输入通道数。
loss=dict(type='CrossEntropyLoss', loss_weight=1.0), # 损失函数设置
topk=1, # 评估指标Top-K
),
init_cfg=dict(type="Pretrained", checkpoint="resnet18_8xb32_in1k_20210831-fbbb1da6.pth")
)
对于评价指标top-k的解释:
在机器学习中,Top-k准确率是一种衡量模型性能的指标,用于评估模型在分类任务中的表现。Top-k准确率衡量模型对于预测结果中前k个最可能的类别的准确性。
具体而言,给定一个样本,模型会产生一个预测结果的概率分布,通常使用softmax函数将输出转化为概率值。Top-k准确率是指在模型给出的预测概率中,检查真实标签是否包含在预测概率排名前k的类别中,并计算其准确率。
例如,假设k=5,对于一个样本,模型给出了它属于类别A的概率为0.7,类别B的概率为0.3,类别C的概率为0.2,类别D的概率为0.1,类别E的概率为0.05,以及其他类别的概率。如果样本的真实标签是A或者B,那么在Top-5准确率计算中,模型的预测是正确的,因为真实标签A在前5个最高概率的类别中。
Top-k准确率考虑了模型在预测结果中的多样性和不确定性。较高的Top-k准确率表示模型能够更好地识别出真实标签所在的候选类别。通常情况下,Top-1准确率表示预测结果的准确性,而Top-5准确率表示模型在给出的预测结果中包含真实标签的概率。这两个指标常用于评估图像分类等任务。
需要注意的是,Top-k准确率的选择和设定要基于具体的问题和应用场景,不同的任务可能需要不同的k值来评估模型的性能。
数据集的部分:
# dataset settings
dataset_type = 'CustomDataset' # 自定义数据集
# 数据预处理
data_preprocessor = dict(
num_classes=2, # 类别数
# RGB format normalization parameters
mean=[123.675, 116.28, 103.53], # 输入图像归一化的 RGB 通道均值
std=[58.395, 57.12, 57.375], # 输入图像归一化的 RGB 通道标准差
# convert image from BGR to RGB
to_rgb=True,
)
# 对于训练集的数据预处理,读取,翻转,裁剪等
train_pipeline = [
dict(type='LoadImageFromFile'), # 读取图像
dict(type='RandomResizedCrop', scale=224), # 随机放缩裁剪
dict(type='RandomFlip', prob=0.5, direction='horizontal'),
dict(type='PackInputs'),
]
# 这个配置定义了测试数据的预处理流程,它包括从文件中加载图像、缩放短边尺寸至256像素、中心裁剪和准备图像和标签等操作。
# 这些操作用于在测试过程中对输入数据进行一致的处理。
test_pipeline = [
dict(type='LoadImageFromFile'),
dict(type='ResizeEdge', scale=256, edge='short'),
dict(type='CenterCrop', crop_size=224),
dict(type='PackInputs'),
]
# 这个配置定义了训练集的数据加载器。
# 它指定了每个GPU的批处理大小、线程数以及数据集的相关信息,包括数据集类型、数据根目录、注释文件、数据前缀和预处理流程等。
# 此外,还指定了采样器和是否保持进程等选项。
train_dataloader = dict(
batch_size=16, # 每张 GPU 的 batchsize
num_workers=1,
dataset=dict(
type=dataset_type,
data_root='./cats_dogs_dataset/training_set',
pipeline=train_pipeline),
sampler=dict(type='DefaultSampler', shuffle=True),
)
# 这个配置定义了验证集的数据加载器。
# 它的配置与训练数据加载器类似,包括批处理大小、线程数、数据集相关信息和评估器等。
val_dataloader = dict(
batch_size=16,
num_workers=1,
dataset=dict(
type=dataset_type,
data_root='./cats_dogs_dataset/val_set',
pipeline=test_pipeline),
sampler=dict(type='DefaultSampler', shuffle=False),
)
val_evaluator = dict(type='Accuracy', topk=1)
test_dataloader = dict(
batch_size=16,
num_workers=1,
dataset=dict(
type=dataset_type,
data_root='./cats_dogs_dataset/test_set',
pipeline=test_pipeline),
sampler=dict(type='DefaultSampler', shuffle=False),
)
# # If you want standard test, please manually configure the test dataset
# test_dataloader = val_dataloader
test_evaluator = val_evaluator
训练策略:
# 优化器配置
optim_wrapper = dict(
optimizer=dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001))
# learning policy
param_scheduler = dict(
type='MultiStepLR', by_epoch=True, milestones=[30, 60, 90], gamma=0.1)
# train, val, test setting
train_cfg = dict(by_epoch=True, max_epochs=5, val_interval=1)
val_cfg = dict()
test_cfg = dict()
调用模型进行训练与测试:
训练模型
CUDA_VISIBLE_DEVICES=2 mim train mmpretrain configs/resnet50_8xb32_in1k.py --work-dir=./work_dirs/resnet50
测试模型
CUDA_VISIBLE_DEVICES=2 mim test mmpretrain configs/resnet50_8xb32_in1k.py --checkpoint work_dirs/resnet50/epoch_5.pth --work-dir=./work_dirs/resnet50