Pytorch训练总结

这篇博客介绍了PyTorch中数据加载的注意事项,包括图片格式的一致性和数据预处理。同时,讲解了模型的初始化、微调以及模型结构的构建,特别是模型参数初始化和前向传播过程。此外,还详细阐述了训练过程,包括损失计算、反向传播、优化器设置以及模型保存。最后,讨论了模型预测时的模型加载、关闭梯度监控等关键步骤。
部署运行你感兴趣的模型镜像

Pytorch中有许多需要注意的地方,这里总结一下

1、数据加载

1、要保证输出图片的格式是一致的

train_data=CustomDataset(file_list,transform=transforms.Compose([
                                               transforms.Resize(512),# 要保证数据输入大小一致
                                               transforms.RandomCrop(224),
                                               transforms.ToTensor()]))
data_loader = DataLoader(train_data, batch_size=2,shuffle=True)
print(len(data_loader))
print(data_loader)
for data,lable in data_loader: # 循环输出
    print(data, lable)

2、对于每个图片的处理

class CustomDataset(Dataset):#需要继承data.Dataset
    def __init__(self,file_list_dir,transform= None):
        # TODO
        # 1. Initialize file path or list of file names.
        # self.image_dir = '/root/data/history/angle'
        self.image_file_lists = file_list_dir
        self.len = len(self.image_file_lists)
        self.transform = transform
        

        
    def __getitem__(self, index):
        # TODO
        # 1. Read one data from file (e.g. using numpy.fromfile, PIL.Image.open).
        # 2. Preprocess the data (e.g. torchvision.Transform).
        # 3. Return a data pair (e.g. image and label).
        #这里需要注意的是,第一步:read one data,是一个data
        index = index % self.len
        image_file = self.image_file_lists[index] 
        # print(image_file)
        image ,label = process_img(image_file) # 主要是读图片和label
        image = self.transform(image) # 这里就用到了前面的统一处理transform 
        return image,label
         
    def __len__(self):
        # You should change 0 to the total size of your dataset.
        return len(self.image_file_lists)

2、关于模型Model

1、模型参数初始化
这个就是初步的参数设置,一般来说是通用的

   def _initialize_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
                m.weight.data.normal_(0, math.sqrt(2. / n))
                if m.bias is not None:
                    m.bias.data.zero_()
            elif isinstance(m, nn.BatchNorm2d):
                m.weight.data.fill_(1)
                m.bias.data.zero_()
            elif isinstance(m, nn.Linear):
                n = m.weight.size(1)
                m.weight.data.normal_(0, 0.01)
                m.bias.data.zero_()

2、fineturn与训练模型
主要是输出分类不同,需要调整最后一个全连接层

def mobilenet_v2(pretrained=True):
    model = MobileNetV2(input_size=320,width_mult=1)
    state_dict = torch.load("mobilenetv2_1.0_f2a8633.pth")
    model.load_state_dict(state_dict,strict=False)
    model.classifier = nn.Linear(1280,4) # 4替换原来的1000

3、模型features的处理

   self.features = [conv_bn(3, input_channel, 2)] # 先定义为数组list
  #....
  # building last several layers
    self.features.append(conv_1x1_bn(input_channel, self.last_channel))
  # make it nn.Sequential
    self.features = nn.Sequential(*self.features) # 数组解包再组成为Sequential

4、推理forward
这个就是处理计算逻辑的,后面实例化的时候,括号里面的处理方法

   def forward(self, x):
        x = self.features(x) #[8, 1280, 7, 7]
        x = x.mean(3).mean(2) #avgpooling # [8, 1280]
        x = self.classifier(x) #[8, 4]
        return x

3关于训练train

1、定义好全局变量

writer = SummaryWriter('./logs/')  # 写日志专用
# 定义训练数据
train_data_loader = DataLoader(train_data, batch_size=BATCH_SIZE, shuffle=True)
val_data_loader = DataLoader(
    val_data, batch_size=BATCH_TEST_SIZE, shuffle=True)

use_gpu = torch.cuda.is_available()  # 是否启用GPU

model = mobilnet_v2.mobilenet_v2(True) # 定义model

# Optimizer and criterion 定义优化器和loss
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
# optimizer = torch.optim.Adam(model.parameters(),lr=0.001)

# 定义是否使用多卡训练,这个是最简便的,还有高效的distributed,但是比较麻烦点 
if torch.cuda.device_count() > 1: 
    print("Let's use", torch.cuda.device_count(), "GPUs!")
    # dim = 0 [30, xxx] -> [10, ...], [10, ...], [10, ...] on 3 GPUs
    model = nn.DataParallel(model) # 多卡训练
if use_gpu:
    modle = model.cuda()  # 将模型转到GPU上

2、开始训练
训练时需要注意主要的数据转GPU上、梯度清零、推理后反向传播、优化器修改参数、准确率计算、日志记录、模型存储等

for epoch in range(num_epochs):
    print('Epoch {}/{}'.format(epoch, num_epochs - 1))
    print('-' * 10)
    model.train()  # 这里是训练是的model,dropout、batch_normliazition
    train_loss = 0.0
    correct = 0.
    for batch_idx, data in enumerate(train_data_loader):
        try:
            imgs, angle = data
            if use_gpu:
                imgs, angle = imgs.cuda(), angle.cuda()  # 将数据转到GPU上

            optimizer.zero_grad()  # 清空梯度
            output = model(imgs)  # 预测结果

            pred = output.data.max(1)[1]
            # 预测准确个数,先取data,然后转到cpu上,然后相加
            correct += pred.eq(angle.data).cpu().sum()  

            loss = criterion(output, angle)
            loss.backward() # 反向传播
            optimizer.step() # 优化器优化参数
            if (batch_idx+1) % 100 == 0:
                print(f'this is {str(batch_idx+1)}batch, and loss is {loss.item()}')
            total_step += 1  # 总步数加一
            if (batch_idx+1) % 1000 == 0:
                acc = correct/((batch_idx+1)*BATCH_SIZE)
                print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}, Acc: {:.4f}'
                    .format(epoch+1, num_epochs, batch_idx+1, len(train_data_loader), loss.item(), acc))
                writer.add_scalar('Loss/test', loss, total_step)  # 开始记录准确率等
                writer.add_scalar('ACC', acc, total_step)
        except Exception as e:
            print(e)

    torch.save(model.state_dict(), f'./save_mode_dir/{str(epoch)}.pth')  # 存储模型 ,当然最好是model.model.state_dict(),这样便于后面的单卡推理
    test_acc(model, epoch, criterion, val_data_loader)  # 进行准确率测试

4、关于预测图片val

1、关于预测也要注意一下模型的载入、预测、关闭梯度监控等

# for data,angle in data_loader:
#     print(data, angle)

model = mobilnet_v2.mobilenet_v2(True)
#下面model由于是多卡训练的,每个keys都多了model.model,而不是model.所以要多卡方式加载
model = torch.nn.parallel.DataParallel(model, device_ids = [0]) 

# checkpoint = torch.load('./save_mode_dir/9.pth') 
 #modelpath是你要加载训练好的模型文件地址
# model.load_state_dict(checkpoint['state_dict'])
# output = model(x)
use_gpu = torch.cuda.is_available()  # 是否启用GPU

model.load_state_dict(torch.load('./save_mode_dir/9.pth'))
model.eval()  # 模型的推理模式,主要解决dropout、batch normalization等问题
correct = 0.
with torch.no_grad(): # 这个是为了不跟踪梯度,因为预测不需要,节省空间
    for batch_idx, data in enumerate(val_data_loader):
        imgs, angle = data
        if use_gpu:
            imgs, angle = imgs.cuda(), angle.cuda()  # 将数据转到GPU上
        output = model(imgs)  # 预测结果
        # get the index of the max log-probability
        pred = output.data.max(1)[1]
        correct += pred.eq(angle.data).cpu().sum()
# loss function already averages over batch size
acc = correct / len(val_data_loader.dataset)
print('\nAccuracy: {}/{} ({:.0f}%)\n'.format(
     correct, len(val_data_loader.dataset), 100. * acc))

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>我们正在讨论PyTorch训练YOLO训练的区别与联系。首先需要明确: - PyTorch是一个深度学习框架,提供了构建、训练部署神经网络的基础设施。 - YOLO(You Only Look Once)是一种目标检测算法,通常使用深度学习框架(如PyTorch)来实现。 因此,两者的关系是:YOLO训练是使用PyTorch(或其他框架)进行的一种特定任务(目标检测)的训练过程。 下面从多个维度分析区别与联系: ### 1. **概念层级** - **PyTorch训练**:泛指使用PyTorch框架进行的任何深度学习模型的训练,包括图像分类、目标检测、语义分割等。 - **YOLO训练**:特指使用YOLO系列算法(如YOLOv3, YOLOv5, YOLOv8等)进行目标检测模型的训练。它是在PyTorch(或其他框架)上实现的具体应用。 ### 2. **实现流程** #### PyTorch训练通用流程: ```mermaid graph LR A[数据加载] --> B[模型定义] B --> C[损失函数优化器] C --> D[训练循环] D --> E[验证测试] ``` #### YOLO训练流程(基于PyTorch): ```mermaid graph LR A[准备COCO格式数据集] --> B[定义YOLO网络结构] B --> C[定义YOLO损失函数] C --> D[训练参数配置] D --> E[训练验证] E --> F[模型导出] ``` 其中,YOLO训练在数据加载、模型结构、损失函数等方面有特定要求: - **数据格式**:YOLO通常使用COCO或VOC格式,标注为边界框(中心点坐标、宽高)类别[^4]。 - **模型结构**:YOLO网络包含特定的骨干网络(如DarkNet)检测头,实现多尺度预测。 - **损失函数**:YOLO损失包括边界框坐标损失、置信度损失分类损失[^2]。 ### 3. **关键差异点** | 维度 | PyTorch通用训练 | YOLO训练(基于PyTorch) | |--------------|----------------------------------|----------------------------------| | **任务类型** | 任意(分类、检测、分割等) | 仅目标检测 | | **模型结构** | 用户自定义或标准网络(如ResNet) | 固定结构(如YOLOv5的CSPDarkNet)| | **损失函数** | 通用损失(如交叉熵、MSE) | 复合损失(坐标损失+置信度+分类) | | **数据要求** | 任意格式(需适配DataLoader) | 必须为边界框标注格式[^4] | | **训练技巧** | 基础优化器/调度器 | 特定技巧(如Mosaic增强、CIoU损失)| ### 4. **联系与依赖** - **框架依赖**:YOLO训练依赖于PyTorch(或TensorFlow)提供的自动微分、GPU加速分布式训练功能。 - **代码实现**:现代YOLO实现(如Ultralytics的YOLOv5/YOLOv8)直接使用PyTorch构建模型: ```python import torch from models.yolo import Model model = Model("yolov5s.yaml") # PyTorch模块 optimizer = torch.optim.SGD(model.parameters(), lr=0.01) ``` - **扩展性**:通过PyTorch的灵活接口,YOLO可轻松加入新特性(如注意力机制)。 ### 5. **性能优化差异** - **PyTorch通用优化**: - 混合精度训练(AMP) - 分布式数据并行(DDP) - **YOLO特定优化**: - 自适应锚框计算(AutoAnchor) - 多尺度训练(每10轮切换输入尺寸) - 非极大值抑制(NMS)后处理加速 ### 6. **实践建议** 1. **初学者路径**: - 先掌握PyTorch基础(张量操作、自动求导、模块定义) - 再学习YOLO的特定实现(如使用`ultralytics`库[^3]) 2. **自定义改进**: - 修改YOLO网络:通过PyTorch替换骨干网络(如改用ResNet) - 扩展数据集:利用`torchvision.datasets`加载自定义数据 3. **部署差异**: - PyTorch通用模型可导出为TorchScript - YOLO模型需额外处理输出层(如将检测结果转换为JSON) > **总结**:YOLO训练PyTorch训练的一个子集,其特殊性体现在数据格式、模型结构损失函数上,但底层依赖PyTorch的核心功能[^2][^3]。 ```mermaid graph TB A[深度学习框架] --> B(PyTorch) B --> C1[通用训练流程] B --> C2[YOLO训练实现] C1 --> D1[自定义模型] C1 --> D2[通用损失函数] C2 --> E1[YOLO网络结构] C2 --> E2[复合损失函数] ``` §§相关问题§§ 1. YOLO训练中如何利用PyTorch的混合精度训练加速? 2. 如何将YOLO模型转换为PyTorch可部署的格式(如TorchScript)? 3. 在自定义数据集上训练YOLO时,需要如何调整PyTorch的数据加载流程? 4. YOLO的损失函数在PyTorch中是如何具体实现的?</think>### PyTorch训练与YOLO训练的区别与联系 #### 1. **概念层级关系** - **PyTorch训练**:指使用PyTorch框架进行的**通用深度学习训练流程**,适用于各类任务(分类、检测、分割等)。 - **YOLO训练**:特指使用YOLO系列算法(如YOLOv3/v5/v8)进行的**目标检测任务训练**,是PyTorch训练的一种具体应用场景[^1][^3]。 ```mermaid graph LR A[PyTorch训练] -->|基础框架| B[YOLO训练] A -->|支持| C[其他任务训练] B -->|实现| D[目标检测] ``` #### 2. **核心区别** | 维度 | PyTorch通用训练 | YOLO训练(基于PyTorch) | |--------------|----------------------------------|----------------------------------| | **任务目标** | 任意任务(分类/分割/生成等) | 仅目标检测 | | **模型结构** | 用户自定义或标准网络(如ResNet) | 固定YOLO架构(DarkNet骨干等)[^2]| | **损失函数** | 任务相关(交叉熵/MSE等) | 复合损失(坐标+置信度+分类)[^2] | | **数据要求** | 通用图像数据集(ImageNet等) | 需边界框标注(COCO/VOC格式)[^4] | | **输出格式** | 多样(类别概率/分割掩码等) | 固定(边界框坐标+类别+置信度) | #### 3. **技术联系** 1. **框架依赖** YOLO训练完全依赖PyTorch的核心功能: ```python # YOLO模型定义(PyTorch实现) class YOLO(nn.Module): def __init__(self): super().__init__() self.backbone = DarkNet53() # 骨干网络 self.neck = PANet() # 特征融合 self.head = DetectionHead() # 检测头 ``` 2. **共享训练组件** - **数据加载**:均使用`torch.utils.data.DataLoader` ```python # YOLO数据加载(需特殊预处理) dataset = YOLODataset("data/coco.yaml", augment=True) loader = DataLoader(dataset, batch_size=16, collate_fn=collate_fn) ``` - **优化器**:通用优化器(如Adam/SGD) `optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.937)` 3. **特定扩展** YOLO在PyTorch基础上引入专属技术: - **数据增强**:Mosaic增强(4图拼接)[^3] - **损失计算**:CIoU损失(改进边界框回归) - **后处理**:非极大值抑制(NMS)过滤冗余框 #### 4. **训练流程对比** ##### PyTorch通用流程 ```mermaid graph TB A[数据标准化] --> B[定义模型] B --> C[选择损失函数] C --> D[配置优化器] D --> E[训练循环] E --> F[模型验证] ``` ##### YOLO训练流程 ```mermaid graph TB A[加载COCO格式数据] --> B[初始化YOLO架构] B --> C[配置超参数 img_size=640] C --> D[启用Mosaic增强] D --> E[计算复合损失] E --> F[多尺度训练] F --> G[NMS后处理] ``` #### 5. **性能优化差异** | 技术 | PyTorch通用场景 | YOLO特定优化 | |--------------|--------------------------|----------------------------| | **混合精度** | 可选(AMP) | 强烈推荐(提速2-3倍)[^3] | | **分布式训练**| DDP多GPU | 支持DDP+梯度累积[^2] | | **量化部署** | 动态量化 | TensorRT加速INT8推理 | > **关键结论**: > YOLO训练PyTorch在目标检测领域的**专业化应用**,继承了PyTorch的灵活性扩展性,同时通过定制化组件(如DarkNet骨干、CIoU损失)实现高效检测[^2][^3]。 --- ### 典型工作流代码对比 #### PyTorch通用训练片段 ```python # 通用图像分类训练 for epoch in range(epochs): for images, labels in train_loader: outputs = model(images) loss = F.cross_entropy(outputs, labels) loss.backward() optimizer.step() ``` #### YOLO训练片段 ```python # YOLOv5训练核心(PyTorch实现) for imgs, targets, _ in train_loader: pred = model(imgs) # 输出3个尺度的检测结果 loss, loss_items = compute_loss(pred, targets) # 复合损失计算 loss.backward() optimizer.step() # 多尺度训练 if epoch > 10: imgs = resize(imgs, size=random.randint(320, 608)) ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值