python机器学习pytorch自定义数据加载器

Python机器学习PyTorch自定义数据加载器

PyTorch是一个基于Python的科学计算库,它支持GPU加速的张量计算,提供了丰富的神经网络模块,可以帮助我们快速构建和训练深度学习模型。在PyTorch中,我们可以使用自定义数据加载器来加载自己的数据集,这样可以更好地适应不同的数据格式和数据预处理方式。本文将详细讲解如何使用PyTorch自定义数据加载器,包括数据集的准备、数据预处理、数据加载器的定义和使用等内容,并提供两个示例说明。

1. 数据集的准备

在使用PyTorch自定义数据加载器之前,我们需要准备好自己的数据集。数据集可以是图片、文本、音频等不同类型的数据,但需要满足以下要求:

  1. 数据集需要按照一定的目录结构组织,例如图片数据集需要按照类别分别存放在不同的文件夹中。

  2. 数据集需要提供一个标签文件,用于记录每个样本的类别信息。

以下是一个图片数据集的目录结构示例:

data/
├── train/
│   ├── cat/
│   │   ├── cat.1.jpg
│   │   ├── cat.2.jpg
│   │   ├── ...
│   ├── dog/
│   │   ├── dog.1.jpg
│   │   ├── dog.2.jpg
│   │   ├── ...
├── test/
│   ├── cat/
│   │   ├── cat.1.jpg
│   │   ├── cat.2.jpg
│   │   ├── ...
│   ├── dog/
│   │   ├── dog.1.jpg
│   │   ├── dog.2.jpg
│   │   ├── ...
├── labels.csv

在这个示例中,我们将训练集和测试集分别存放在train和test文件夹中,每个类别的图片分别存放在不同的文件夹中。我们还提供了一个标签文件labels.csv,用于记录每个样本的类别信息。

2. 数据预处理

在使用PyTorch自定义数据加载器之前,我们还需要对数据进行预处理。数据预处理可以包括以下几个步骤:

  1. 图片数据需要进行缩放、裁剪、旋转等操作,以适应不同的模型输入尺寸。

  2. 图片数据需要进行归一化处理,以便更好地训练模型。

  3. 文本数据需要进行分词、编码等操作,以便更好地训练模型。

以下是一个图片数据预处理的示例代码:

import torch
import torchvision.transforms as transforms

# 定义数据预处理
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 加载数据集
dataset = torchvision.datasets.ImageFolder(root='data/train', transform=transform)

在这个示例中,我们使用了PyTorch提供的transforms模块来定义数据预处理。我们首先将图片缩放到224x224的大小,然后进行随机水平翻转,最后将图片转换为张量并进行归一化处理。接着,我们使用ImageFolder类来加载数据集,指定数据集的根目录和数据预处理方式。

3. 数据加载器的定义和使用

在准备好数据集和数据预处理之后,我们可以开始定义数据加载器。数据加载器可以帮助我们批量地加载数据,以便更好地训练模型。以下是一个数据加载器的示例代码:

import torch
import torch.utils.data as data

# 定义数据加载器
dataloader = data.DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)

# 使用数据加载器
for images, labels in dataloader:
    # 训练模型
    pass

在这个示例中,我们使用了PyTorch提供的DataLoader类来定义数据加载器。我们指定了数据集、批量大小、是否打乱数据和工作线程数等参数。接着,我们使用数据加载器来批量地加载数据,并进行模型训练。

4. 示例说明

以下是两个使用PyTorch自定义数据加载器的示例说明:

4.1. 图片分类模型的训练

图片分类是一种常见的计算机视觉任务,它可以用于将图片分为不同的类别。以下是一个使用PyTorch自定义数据加载器训练图片分类模型的示例代码:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
import torchvision.datasets as datasets

# 定义数据预处理
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 加载数据集
train_dataset = datasets.ImageFolder(root='data/train', transform=transform)
test_dataset = datasets.ImageFolder(root='data/test', transform=transform)

# 定义数据加载器
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)

# 定义模型
model = nn.Sequential(
    nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Flatten(),
    nn.Linear(256 * 28 * 28, 1024),
    nn.ReLU(),
    nn.Linear(1024, 10)
)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

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

        if i % 100 == 0:
            print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch + 1, 10, i + 1, len(train_loader), loss.item()))

# 测试模型
correct = 0
total = 0
with torch.no_grad():
    for images, labels in test_loader:
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the model on the test images: {} %'.format(100 * correct / total))

在这个示例中,我们首先定义了数据预处理方式,然后使用ImageFolder类加载训练集和测试集。接着,我们使用DataLoader类定义数据加载器,并指定批量大小、是否打乱数据和工作线程数等参数。我们定义了一个卷积神经网络模型,并使用交叉熵损失函数和随机梯度下降优化器来训练模型。最后,我们使用训练好的模型对测试集进行预测,并输出预测准确率。

4.2. 自定义数据集的训练

除了使用PyTorch提供的数据集类之外,我们还可以自定义数据集类来加载自己的数据集。以下是一个使用PyTorch自定义数据集类训练模型的示例代码:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
import torch.utils.data as data

# 自定义数据集类
class CustomDataset(data.Dataset):
    def __init__(self, data_path, transform=None):
        self.data_path = data_path
        self.transform = transform
        self.data = []

        # 读取数据
        with open(data_path, 'r') as f:
            for line in f:
                image_path, label = line.strip().split(',')
                self.data.append((image_path, int(label)))

    def __getitem__(self, index):
        image_path, label = self.data[index]
        image = Image.open(image_path).convert('RGB')

        if self.transform is not None:
            image = self.transform(image)

        return image, label

    def __len__(self):
        return len(self.data)

# 定义数据预处理
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 加载数据集
train_dataset = CustomDataset('data/train.txt', transform=transform)
test_dataset = CustomDataset('data/test.txt', transform=transform)

# 定义数据加载器
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)

# 定义模型
model = nn.Sequential(
    nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Flatten(),
    nn.Linear(256 * 28 * 28, 1024),
    nn.ReLU(),
    nn.Linear(1024, 10)
)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

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

        if i % 100 == 0:
            print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch + 1, 10, i + 1, len(train_loader), loss.item()))

# 测试模型
correct = 0
total = 0
with torch.no_grad():
    for images, labels in test_loader:
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the model on the test images: {} %'.format(100 * correct / total))

在这个示例中,我们自定义了一个数据集类CustomDataset,用于加载自己的数据集。我们首先读取数据集文件train.txt和test.txt,然后使用PIL库加载图片,并进行数据预处理。接着,我们使用DataLoader类定义数据加载器,并指定批量大小、是否打乱数据和工作线程数等参数。我们定义了一个卷积神经网络模型,并使用交叉熵损失函数和随机梯度下降优化器来训练模型。最后,我们使用训练好的模型对测试集进行预测,并输出预测准确率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python机器学习pytorch自定义数据加载器 - Python技术站

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

相关文章

  • Pytorch:生成随机数Tensor的方法汇总

    在使用PyTorch做实验时经常会用到生成随机数Tensor的方法,比如: torch.rand() torch.randn() torch.normal() torch.linespace()   均匀分布 torch.rand(*sizes, out=None) → Tensor 返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数。张量的…

    PyTorch 2023年4月6日
    00
  • pytorch中.pth文件转成.bin的二进制文件

    model_dict = torch.load(save_path) fp = open(‘model_parameter.bin’, ‘wb’) weight_count = 0 num=1 for k, v in model_dict.items(): print(k,num) num=num+1 if ‘num_batches_tracked’ in …

    PyTorch 2023年4月7日
    00
  • Pytorch tutorial 之Transfer Learning

    引自官方:  Transfer Learning tutorial Ng在Deeplearning.ai中讲过迁移学习适用于任务A、B有相同输入、任务B比任务A有更少的数据、A任务的低级特征有助于任务B。对于迁移学习,经验规则是如果任务B的数据很小,那可能只需训练最后一层的权重。若有足够多的数据则可以重新训练网络中的所有层。如果重新训练网络中的所有参数,这个…

    2023年4月8日
    00
  • PyTorch入门学习(二):Autogard之自动求梯度

    autograd包是PyTorch中神经网络的核心部分,简单学习一下. autograd提供了所有张量操作的自动求微分功能. 它的灵活性体现在可以通过代码的运行来决定反向传播的过程, 这样就使得每一次的迭代都可以是不一样的. autograd.Variable是这个包中的核心类. 它封装了Tensor,并且支持了几乎所有Tensor的操作. 一旦你完成张量计…

    PyTorch 2023年4月8日
    00
  • Pytorch通过保存为ONNX模型转TensorRT5的实现

    PyTorch是一个流行的深度学习框架,而TensorRT是一个高性能的推理引擎。在实际应用中,我们可能需要将PyTorch模型转换为TensorRT模型以获得更好的推理性能。本文将详细讲解如何通过保存为ONNX模型转换PyTorch模型为TensorRT模型,并提供两个示例说明。 1. 保存为ONNX模型 在PyTorch中,我们可以使用torch.onn…

    PyTorch 2023年5月15日
    00
  • PyTorch实现多维度特征输入逻辑回归

    PyTorch实现多维度特征输入逻辑回归 在PyTorch中,逻辑回归是一种用于二分类问题的机器学习算法。在本文中,我们将介绍如何使用PyTorch实现多维度特征输入逻辑回归,并提供两个示例说明。 示例1:使用PyTorch实现二分类逻辑回归 以下是一个使用PyTorch实现二分类逻辑回归的示例代码: import torch import torch.nn…

    PyTorch 2023年5月16日
    00
  • Pytorch【直播】2019 年县域农业大脑AI挑战赛—初级准备(一)切图

    比赛地址:https://tianchi.aliyun.com/competition/entrance/231717/introduction 这次比赛给的图非常大5万x5万,在训练之前必须要进行数据的切割。通常切割后的大小为512×512,或者1024×1024. 按照512×512切完后的结果如下: 切图时需要注意的几点是: gdal的二进制安装包wh…

    2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部