一、 数据预处理
数据预处理是深度学习建模预测流程中的第一步,它包括数据清洗、数据转换、特征选择等步骤。数据预处理的目标是将原始数据转换为神经网络可以接受的格式,并且尽可能地减少噪声和不相关的信息。
1.1 数据加载
torchvision.datasets.ImageFolder 是 PyTorch 中用于处理图像数据集的一个类,它主要用于加载将不同类别的图像分别放置在不同的子目录下的数据集结构。
root/class_1/image_1.jpg
root/class_1/image_2.jpg
...
root/class_2/image_1.jpg
root/class_2/image_2.jpg
...
ImageFolder 类会自动地将这种目录结构的图像数据加载并组织成 PyTorch 的 Dataset 对象。当创建了一个 ImageFolder 对象后,就可以通过索引的方式来获取每个图像的数据和对应的标签。
#导入 ImageFolder
from torchvision.datasets import ImageFolder
#创建 ImageFolder 对象,并指定数据集的路径
dataset = ImageFolder(filepath, transform=None)
#可以通过索引访问数据集中第一个样本的图像数据和标签
image, label = dataset[0]
1.2 数据划分与数据转换
torch.utils.data.random_split 用于随机分割一个数据集,生成训练集,验证集,测试集。
transforms 用于数据转换,即对图像进行预处理或增强。
# 随机分割数据集
train_size = int(0.8 * len(dataset))
test_size = len(dataset) - train_size
train_dataset, test_dataset = torch.utils.data.random_split(dataset, [train_size, test_size])
# 对训练集和测试集应用不同的转换
# 定义训练集的数据增强
train_transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize([0.17666], [0.2539]).float(),
transforms.Resize([600, 600]),
transforms.RandomVerticalFlip(p=0.5),
transforms.RandomAutocontrast(p=0.8),
transforms.Grayscale(num_output_channels=3),])
# 定义测试集的数据转换(这里无需增强)
test_transform = transforms.Compose([
transforms.ToTensor(),
transforms.Resize([600, 600]),
transforms.Grayscale(num_output_channels=3),])
train_dataset.dataset.transform = train_transform
test_dataset.dataset.transform = test_transform
1.3 数据访问
torch.utils.data import DataLoader 用于将数据集加载到批处理中。
#创建数据加载器,用于批量加载数据
train_dataloader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=8)
test_dataloader = DataLoader(test_dataset, batch_size=32, shuffle=True, num_workers=8)
二、模型训练
2.1 搭建模型
torch.nn 是 PyTorch 中用于构建神经网络的模块。它提供了一组类和函数,用于定义、训练和评估神经网络模型。torch.nn 模块的核心是 nn.Module 类,它是所有神经网络模型的基类。通过继承 nn.Module 类,并定义 forward 方法,您可以创建自己的神经网络模型,并定义模型的结构和操作。
2.1.1 使用 nn.Sequential
对于相对简单的网络,可以使用 torch.nn.Sequential 来快速定义一个连续的层序列。这种方法简洁明了,非常适合没有复杂分支或自定义操作的网络。 torch.nn.Sequential 的详细用法见链接torch.nn.Sequential 用法介绍