PaddlePaddle深度学习实战:PaddlePaddle入门-从数据准备到模型保存

部署运行你感兴趣的模型镜像

项目实践:使用PaddlePaddle构建图像分类器

学习目标

本课程将引导学员完成一个从数据准备到模型训练、评估和保存的完整深度学习项目。通过本课程,实验将能够使用PaddlePaddle框架构建一个图像分类器,了解深度学习项目开发的全流程。

相关知识点

  • 构建图像分类器全流程实践

学习内容

1 构建图像分类器全流程实践

1.1 数据准备与预处理

在深度学习项目中,数据准备是至关重要的第一步。良好的数据准备可以显著提高模型的性能。本节将介绍如何使用PaddlePaddle进行数据加载、预处理和增强。

1.1.1 数据加载

首先,我们需要加载数据集。PaddlePaddle提供了多种数据加载工具,包括paddle.io.Datasetpaddle.io.DataLoaderDataset用于定义数据集的读取方式,而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()

通过本课程的学习,学员将能够从数据准备到模型训练、评估、保存和加载,完成一个完整的深度学习项目。希望学员能在实践中不断探索和提升自己的技能!

您可能感兴趣的与本文相关的镜像

PaddlePaddle-v3.3

PaddlePaddle-v3.3

PaddlePaddle

PaddlePaddle是由百度自主研发的深度学习平台,自 2016 年开源以来已广泛应用于工业界。作为一个全面的深度学习生态系统,它提供了核心框架、模型库、开发工具包等完整解决方案。目前已服务超过 2185 万开发者,67 万企业,产生了 110 万个模型

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值