pytorch加载自己的图像数据集实例

下面是 "PyTorch加载自己的图像数据集实例" 的完整攻略:

准备工作

  1. 数据集准备:准备自己的图像数据集,并将其组织为相应的目录结构。例如,我们假设有一份猫狗分类的数据集,其中包含两个类别:狗和猫。则我们可以将其组织为如下目录结构:
dataset
├── train
│   ├── cat
│   │   ├── cat.1.png
│   │   ├── cat.2.png
│   │   ├── ……
│   ├── dog
│   │   ├── dog.1.png
│   │   ├── dog.2.png
│   │   ├── ……
├── val
│   ├── cat
│   │   ├── cat.10.png
│   │   ├── cat.11.png
│   │   ├── ……
│   ├── dog
│   │   ├── dog.10.png
│   │   ├── dog.11.png
│   │   ├── ……

其中,train 目录下是训练集,val 目录下是验证集。每个子目录表示一个类别。每个类别中包含若干张图片,文件名以类别名开头,并编号。

  1. 安装所需依赖包:PyTorch、torchvision

代码实现

import torch
import torchvision
from torchvision.transforms import transforms
from torch.utils.data import Dataset, DataLoader

# 定义数据路径和变换
train_path = '/path/to/train'
val_path = '/path/to/val'
transform = transforms.Compose(
            [
                transforms.Resize(256),
                transforms.CenterCrop(224),
                transforms.ToTensor(),
                transforms.Normalize(
                    mean=[0.485, 0.456, 0.406],
                    std=[0.229, 0.224, 0.225]
                )
            ])

# 自定义数据集类
class MyDataset(Dataset):
    def __init__(self, path, transform):
        self.path = path
        self.transform = transform
        self.classes = os.listdir(self.path)

    def __len__(self):
        num = 0
        for c in self.classes:
            num += len(os.listdir(os.path.join(self.path, c)))
        return num

    def __getitem__(self, index):
        for i, c in enumerate(self.classes):
            images = os.listdir(os.path.join(self.path, c))
            if index < len(images):
                img_path = os.path.join(self.path, c, images[index])
                img = Image.open(img_path).convert('RGB')
                img = self.transform(img)
                label = i
                return img, label
            else:
                index -= len(images)

# 创建数据集和数据加载器
train_dataset = MyDataset(train_path, transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=0)

val_dataset = MyDataset(val_path, transform)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=0)

# 使用数据集和数据加载器进行训练和验证
for epoch in range(num_epochs):
    # 训练
    for images, labels in train_loader:
        # 训练操作
        pass

    # 验证
    with torch.no_grad():
        for images, labels in val_loader:
            # 计算模型预测结果,并进行验证操作
            pass

以上代码实现了一个简单的PyTorch数据加载器。其中,我们使用了torchvision.transforms模块定义了图像变换,包括将图像缩放到256x256,并中心裁剪为224x224大小,将图像转换为Tensor类型,并进行归一化操作。

然后,我们定义了一个自定义数据集类MyDataset,该类继承torch.utils.data.Dataset类。其中,__init__方法初始化数据路径和变换,__len__方法返回数据集样本数,__getitem__方法根据索引返回图像和标签。

最后,我们创建了两个数据集实例train_datasetval_dataset,并使用torch.utils.data.DataLoader创建了相应的数据加载器train_loaderval_loader。这样,我们就可以使用数据加载器对模型进行训练和验证。

另外,这里提供两条示例:

示例1:使用自定义数据集训练分类模型

import torch
import torchvision
from torchvision.transforms import transforms
from torch.utils.data import Dataset, DataLoader

# 定义数据路径和变换
train_path = '/path/to/train'
val_path = '/path/to/val'
transform = transforms.Compose(
            [
                transforms.Resize(256),
                transforms.CenterCrop(224),
                transforms.ToTensor(),
                transforms.Normalize(
                    mean=[0.485, 0.456, 0.406],
                    std=[0.229, 0.224, 0.225]
                )
            ])

# 自定义数据集类
class MyDataset(Dataset):
    def __init__(self, path, transform):
        self.path = path
        self.transform = transform
        self.classes = os.listdir(self.path)

    def __len__(self):
        num = 0
        for c in self.classes:
            num += len(os.listdir(os.path.join(self.path, c)))
        return num

    def __getitem__(self, index):
        for i, c in enumerate(self.classes):
            images = os.listdir(os.path.join(self.path, c))
            if index < len(images):
                img_path = os.path.join(self.path, c, images[index])
                img = Image.open(img_path).convert('RGB')
                img = self.transform(img)
                label = i
                return img, label
            else:
                index -= len(images)

# 创建数据集和数据加载器
train_dataset = MyDataset(train_path, transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=0)

val_dataset = MyDataset(val_path, transform)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=0)

# 定义模型和优化器
model = torchvision.models.resnet18(pretrained=True)
num_ftrs = model.fc.in_features
model.fc = torch.nn.Linear(num_ftrs, 2)  # 二分类问题
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)

# 训练模型
num_epochs = 10
for epoch in range(num_epochs):
    for images, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

    # 计算验证集上的准确率
    with torch.no_grad():
        correct = 0
        total = 0
        for images, labels in val_loader:
            outputs = model(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()

        acc = 100.0 * correct / total
        print(f'Epoch [{epoch+1}/{num_epochs}], Accuracy: {acc:.2f}%')

上述示例使用了自定义数据集train_datasetval_dataset,分别表示训练集和验证集。其中,我们使用了一个预训练的ResNet18模型,并替换了其最后一层全连接层以适应二分类问题。然后,我们定义了交叉熵损失和随机梯度下降优化器,使用数据加载器进行训练,并在每个epoch结束后在验证集上计算了模型的准确率。

示例2:使用自定义数据集微调分类模型

import torch
import torchvision
from torchvision.transforms import transforms
from torch.utils.data import Dataset, DataLoader

# 定义数据路径和变换
train_path = '/path/to/train'
val_path = '/path/to/val'
transform = transforms.Compose(
            [
                transforms.Resize(256),
                transforms.CenterCrop(224),
                transforms.ToTensor(),
                transforms.Normalize(
                    mean=[0.485, 0.456, 0.406],
                    std=[0.229, 0.224, 0.225]
                )
            ])

# 自定义数据集类
class MyDataset(Dataset):
    def __init__(self, path, transform):
        self.path = path
        self.transform = transform
        self.classes = os.listdir(self.path)

    def __len__(self):
        num = 0
        for c in self.classes:
            num += len(os.listdir(os.path.join(self.path, c)))
        return num

    def __getitem__(self, index):
        for i, c in enumerate(self.classes):
            images = os.listdir(os.path.join(self.path, c))
            if index < len(images):
                img_path = os.path.join(self.path, c, images[index])
                img = Image.open(img_path).convert('RGB')
                img = self.transform(img)
                label = i
                return img, label
            else:
                index -= len(images)

# 加载预训练模型,并替换其最后一层
model = torchvision.models.resnet18(pretrained=True)
num_ftrs = model.fc.in_features
model.fc = torch.nn.Linear(num_ftrs, 2)  # 二分类问题

# 冻结前面若干层参数
for i, param in enumerate(model.parameters()):
    if i < 40:
        param.requires_grad = False

# 创建数据集和数据加载器
train_dataset = MyDataset(train_path, transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=0)

val_dataset = MyDataset(val_path, transform)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=0)

# 定义优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)

# 微调模型
num_epochs = 10
for epoch in range(num_epochs):
    for images, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

    # 计算验证集上的准确率
    with torch.no_grad():
        correct = 0
        total = 0
        for images, labels in val_loader:
            outputs = model(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()

        acc = 100.0 * correct / total
        print(f'Epoch [{epoch+1}/{num_epochs}], Accuracy: {acc:.2f}%')

上述示例同样使用了自定义数据集train_datasetval_dataset,分别表示训练集和验证集。不同的是,我们使用了一个预训练的ResNet18模型,并将其最后一层替换为适用于二分类问题的全连接层。然后,我们冻结前面若干层的参数,只训练后面的几层,以加速模型收敛。最后,我们使用数据加载器进行微调,并在每个epoch结束后在验证集上计算了模型的准确率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch加载自己的图像数据集实例 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • 总结Java调用Python程序方法

    总结 Java 调用 Python 程序方法 在进行软件开发时,我们经常需要使用多种编程语言来实现不同的功能。在这种情况下,我们可能需要在 Java 中调用 Python 程序来实现某些功能。本攻略将介绍如何在 Java 中调用 Python 程序,包括使用 Runtime 和 ProcessBuilder 两种方法,并提供两个示例说明。 使用 Runtim…

    python 2023年5月14日
    00
  • Python占用的内存优化教程

    Python是一种高级编程语言,但在处理大型数据集时,它可能会占用大量内存。本文将详细讲解如何优化Python占用的内存,并提供两个示例说明。 使用生成器 生成器是一种特殊的迭代器,可以在迭代过程中动态生成数据,而不是一次性生成所有数据。这可以大大减少Python占用的内存。可以使用以下代码示例说明: def my_generator(): for i in…

    python 2023年5月14日
    00
  • 关于python导入模块import与常见的模块详解

    以下是关于Python导入模块import与常见的模块详解的完整攻略,包括两个示例: 关于Python导入模块import与常见的模块详解 导入模块 在Python中,可以使用import语句导入模块。可以使用以下语法导入模块: import module_name 在这个示例中,我们使用import语句导入名为module_name的模块。 示例1:导入m…

    python 2023年5月14日
    00
  • 使用Python写CUDA程序的方法

    以下是关于“使用Python写CUDA程序的方法”的完整攻略。 背景 CUDA是一种并行计算平台和编程模型,可以用GPU的并行算能力加速计算。Python是一种流行的编程语言,也可以用于编写CUDA程序。本攻略介绍如何Python编写CUDA程序。 步骤 步骤一:安装CUDA和PyCUDA 在使用Python编写CUDA程序之前,需要安装CUDA和PyCUD…

    python 2023年5月14日
    00
  • 解决numpy数组互换两行及赋值的问题

    下面是关于“解决Numpy数组互换两行及赋值的问题”的完整攻略,包含了两个示例。 互换两行 在Numpy中,可以使用切片操作来互换数组的两行。下面是一个示例,演示如何互换数组的第1行和第2行。 import numpy as np # 创建一个二维数组 a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 互换第…

    python 2023年5月14日
    00
  • Python 利用Entrez库筛选下载PubMed文献摘要的示例

    1. Entrez库简介 Entrez是NCBI提供的一个检索系统,可以用于检索PubMed、GenBank、Protein、Nucleotide等数据库中的生物信息学数据。Entrez库是Python中用于访问Entrez系统的库,可以用于检索PubMed文献、下载文献全文、下载序列等。 2. 示例说明 2.1 筛选PubMed文献摘要 以下是一个示例代码…

    python 2023年5月14日
    00
  • PyTorch基本数据类型(一)

    PyTorch基本数据类型(一) PyTorch是一个基于Python的科学计算库,它主要用于深度学习和神经网络。在PyTorch中,有许多基本数据类型,本文将详细讲解这些数据类型,并提供两个示例说明。 1. Tensor Tensor是PyTorch中最基本的数据类型,它是一个多维数组,可以用于表示向量、矩阵、张量等。可以使用以下代码示例说明: impor…

    python 2023年5月14日
    00
  • numpy linalg模块的具体使用方法

    以下是关于“numpy.linalg模块的具体使用方法”的完整攻略。 numpy.linalg模块简介 numpy.linalg模块是Numpy中的线性代数块,提供了许多线性代数相关的函数这些函数可以用于求解线性方程组、矩阵求逆、特征值和征向量等。 numpy.linalg模块的常用函数 下面是numpy.linalg模块中常用的函数: det:计算矩阵的行…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部