• PyTorch构建训练集


    假设数据目录结构是data_dir/images包含图像文件,data_dir/labels包含对应的标签文件,并且图像和标签的文件名是匹配的。

    1. import torch
    2. from torch.utils.data import Dataset, DataLoader
    3. from torchvision import transforms
    4. from PIL import Image
    5. import os
    6. # 定义一个名为CustomDataset的类,继承自torch.utils.data.Dataset,用于自定义数据集
    7. class CustomDataset(Dataset):
    8. def __init__(self, data_dir, transform=None):
    9. # 存储数据集的目录路径
    10. self.data_dir = data_dir
    11. # 存储图像和标签的预处理/变换操作
    12. self.transform = transform
    13. # 获取数据目录下"images"文件夹中的所有图像文件名,并存储在self.images列表中
    14. self.images = os.listdir(os.path.join(data_dir, "images"))
    15. # 获取数据目录下"labels"文件夹中的所有标签文件名,并存储在self.labels列表中
    16. self.labels = os.listdir(os.path.join(data_dir, "labels"))
    17. # 注意:这里假设图像和标签的文件名是一一对应的
    18. # 定义__len__方法,返回数据集的大小
    19. def __len__(self):
    20. # 返回self.images列表的长度,即图像的数量
    21. return len(self.images)
    22. # 定义__getitem__方法,根据索引idx返回一个数据样本(图像+对应的标签)
    23. def __getitem__(self, idx):
    24. # 根据索引idx从self.images和self.labels列表中获取图像和标签的文件名,并拼接成完整的文件路径
    25. image_path = os.path.join(self.data_dir, "images", self.images[idx])
    26. label_path = os.path.join(self.data_dir, "labels", self.labels[idx])
    27. # 使用PIL库加载图像文件,并将其转换为RGB格式(三通道彩色图像)
    28. image = Image.open(image_path).convert('RGB')
    29. # 使用PIL库加载标签文件,并将其转换为L格式(单通道灰度图像),这里假设标签是灰度图
    30. label = Image.open(label_path).convert('L')
    31. # 如果定义了预处理/变换操作,则对图像和标签应用这些操作
    32. # 注意:在实际应用中,图像和标签可能需要不同的预处理/变换操作
    33. if self.transform:
    34. image = self.transform(image)
    35. label = self.transform(label)
    36. # 返回变换后的图像和标签作为一个数据样本
    37. return image, label

    接下来,我们使用CustomDataset类来创建训练集和数据加载器(DataLoader):

    1. # 定义变换
    2. transform = transforms.Compose([
    3. transforms.Resize((64, 64)), # 调整图像大小到64x64
    4. transforms.ToTensor(), # 将PIL图像转换为tensor
    5. # 添加其他必要的变换...
    6. ])
    7. # 创建训练集实例
    8. train_dataset = CustomDataset(data_dir="path_to_your_data", transform=transform)
    9. # 创建数据加载器
    10. train_loader = DataLoader(dataset=train_dataset, batch_size=32, shuffle=True)

    使用训练集来训练模型:

    1. # 定义你的模型
    2. model = ...
    3. # 定义损失函数和优化器
    4. criterion = ...
    5. optimizer = ...
    6. # 训练模型
    7. num_epochs = 10 # 设置训练的epoch数量
    8. for epoch in range(num_epochs):
    9. for images, labels in train_loader:
    10. # 将数据发送到设备(CPU或GPU)上
    11. images, labels = images.to(device), labels.to(device)
    12. # 前向传播
    13. outputs = model(images)
    14. # 计算损失
    15. loss = criterion(outputs, labels)
    16. # 反向传播和优化
    17. optimizer.zero_grad() # 清空之前的梯度
    18. loss.backward() # 反向传播,计算当前梯度
    19. optimizer.step() # 更新权重
    20. # 打印统计信息
    21. print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

  • 相关阅读:
    欢度中秋节!从零开始实现一个月饼检测器
    conda配置pytroch
    在Linux上以all in one模式安装kubernetes & kubesphere
    【JavaWeb】练习三
    卷积计算公式 神经网络,卷积神经网络应用举例
    单个独立按键依次输入控制数据
    算法书学习笔记
    windbg调试系列教程:sos扩展的介绍和使用
    金融数智转型如何利用图谱迈出关键一步?创邻携手普适大咖为您解答
    < lambda表达式与包装器>——《C++高阶》
  • 原文地址:https://blog.csdn.net/YHKKun/article/details/136306697