项目实践:使用PaddlePaddle构建图像分类器
学习目标
本课程将引导学员完成一个从数据准备到模型训练、评估和保存的完整深度学习项目。通过本课程,实验将能够使用PaddlePaddle框架构建一个图像分类器,了解深度学习项目开发的全流程。
相关知识点
- 构建图像分类器全流程实践
学习内容
1 构建图像分类器全流程实践
1.1 数据准备与预处理
在深度学习项目中,数据准备是至关重要的第一步。良好的数据准备可以显著提高模型的性能。本节将介绍如何使用PaddlePaddle进行数据加载、预处理和增强。
1.1.1 数据加载
首先,我们需要加载数据集。PaddlePaddle提供了多种数据加载工具,包括paddle.io.Dataset和paddle.io.DataLoader。Dataset用于定义数据集的读取方式,而DataLoader则用于批量加载数据。
%pip install paddlepaddle
!wget https://model-community-picture.obs.cn-north-4.myhuaweicloud.com/ascend-zone/notebook_datasets/844ba5342c7911f0ac82fa163edcddae/cifar-10-python.tar.gz
import paddle
from paddle.vision import datasets, transforms
import numpy as np
# 定义数据预处理
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 加载数据集
train_dataset = datasets.Cifar10(
mode='train',
transform=transform,
data_file='./cifar-10-python.tar.gz' # 指定下载好的文件路径
)
test_dataset = datasets.Cifar10(
mode='test',
transform=transform,
data_file='./cifar-10-python.tar.gz' # 指定下载好的文件路径
)
# 创建DataLoader
train_loader = paddle.io.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = paddle.io.DataLoader(test_dataset, batch_size=64, shuffle=False)
1.1.2 数据预处理
数据预处理包括图像的缩放、裁剪、归一化等操作。这些操作可以提高模型的泛化能力。在上述代码中,我们使用了transforms.Compose来组合多个预处理步骤。
1.1.3 数据增强
数据增强是通过生成额外的训练数据来提高模型性能的一种技术。PaddlePaddle提供了多种数据增强方法,如随机裁剪、水平翻转等。
# 定义数据增强
train_transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomCrop(32, padding=4),
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 重新加载数据集
train_dataset = train_dataset = datasets.Cifar10(
mode='train',
transform=train_transform,
data_file='./cifar-10-python.tar.gz' # 指定下载好的文件路径
)
train_loader = paddle.io.DataLoader(train_dataset, batch_size=64, shuffle=True)
# 创建训练、推理数据子集 (使用5%的数据,加快训练推理时间)
# 注意由于训练数据较小,不能保证最终训练效果,学员可自行调整
subset_ratio = 0.05 # 调整此比例改变数据量
num_train = len(train_dataset)
num_test = len(test_dataset)
indices1 = list(range(num_train))
indices2 = list(range(num_test))
np.random.shuffle(indices1) # 随机打乱
np.random.shuffle(indices2) # 随机打乱
split1 = int(np.floor(subset_ratio * num_train))
split2 = int(np.floor(subset_ratio * num_test))
train_subset = paddle.io.Subset(train_dataset, indices1[:split1])
test_subset = paddle.io.Subset(train_dataset, indices2[:split2])
train_loader = paddle.io.DataLoader(train_subset, batch_size=64, shuffle=True)
test_loader = paddle.io.DataLoader(test_subset, batch_size=64, shuffle=True)
1.2 模型构建与训练
在本节中,我们将介绍如何使用PaddlePaddle构建一个卷积神经网络(CNN)模型,并进行训练。
1.2.1 模型构建
PaddlePaddle提供了paddle.nn模块来构建神经网络。我们将构建一个简单的CNN模型,包括卷积层、池化层和全连接层。
import paddle.nn as nn
class SimpleCNN(nn.Layer):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2D(in_channels=3, out_channels=32, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv2D(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2D(kernel_size=2, stride=2, padding=0)
self.fc1 = nn.Linear(in_features=64 * 56 * 56, out_features=512)
self.fc2 = nn.Linear(in_features=512, out_features=10)
self.relu = nn.ReLU()
def forward(self, x):
x = self.relu(self.conv1(x))
x = self.pool(x)
x = self.relu(self.conv2(x))
x = self.pool(x)
x = x.view([-1, 64 * 56 * 56])
x = self.relu(self.fc1(x))
x = self.fc2(x)
return x
# 创建模型实例
model = SimpleCNN()
1.2.2 模型训练
训练模型包括定义损失函数、优化器和训练循环。我们将使用交叉熵损失函数和Adam优化器。
#以下代码运行时间较久,需要耐心等待打印训练信息处
import paddle.optimizer as optim
import paddle.nn.functional as F
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(parameters=model.parameters(), learning_rate=0.001)
# 训练循环
num_epochs = 1
for epoch in range(num_epochs):
model.train()
for i, (images, labels) in enumerate(train_loader):
# 前向传播
outputs = model(images)
loss = criterion(outputs, labels)
# 反向传播和优化
optimizer.clear_grad()
loss.backward()
optimizer.step()
print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}')
1.3 模型评估与保存
在本节中,我们将介绍如何评估模型的性能,并将训练模型保存到本地。
1.3.1 模型评估
评估模型的性能是确保模型在实际应用中有效的重要步骤。我们将使用测试集来评估模型的准确率。
# 评估模型
model.eval()
with paddle.no_grad():
correct = 0
total = 0
for i, (images, labels) in enumerate(test_loader):
outputs = model(images)
predicted = paddle.argmax(outputs.data, axis=1) # 使用argmax获取索引
total_i = labels.shape[0]
total += total_i
correct_i = (predicted == labels).sum().item()
correct += correct_i
print(f"Step [{i+1}/{len(test_loader)}], Accuracy {correct_i / total_i:.4f}")
print(f'Accuracy of the model on the test images: {100 * correct / total:.2f}%')
1.3.2 模型保存和加载
模型保存和加载是模型开发中的基础操作,我们可以采用paddle.save来保存模型参数,并采用paddle.load来加载模型参数,并通过model.set_state_dict来设置模型参数。
# 导出模型
paddle.save(model.state_dict(), 'simple_cnn.pdparams')
# 加载模型
model = SimpleCNN()
model.set_state_dict(paddle.load('simple_cnn.pdparams'))
model.eval()
通过本课程的学习,学员将能够从数据准备到模型训练、评估、保存和加载,完成一个完整的深度学习项目。希望学员能在实践中不断探索和提升自己的技能!
1354

被折叠的 条评论
为什么被折叠?



