飞浆 | PaddlePaddle框架入门之数字识别

import paddle
import paddle.fluid as fluid
from paddle.vision.transforms import Compose, Normalize
from paddle.vision.datasets import MNIST
from visualdl import LogWriter

# 定义模型类
class MyModel(paddle.nn.Layer):
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv1 = paddle.nn.Conv2D(in_channels=1, out_channels=16, kernel_size=3, stride=1, padding=1)
        self.pool1 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)
        self.conv2 = paddle.nn.Conv2D(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1)
        self.pool2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)
        self.flatten = paddle.nn.Flatten()
        self.fc = paddle.nn.Linear(in_features=32*7*7, out_features=10)

    def forward(self, x):
        x = self.conv1(x)
        x = paddle.nn.functional.relu(x)
        x = self.pool1(x)
        x = self.conv2(x)
        x = paddle.nn.functional.relu(x)
        x = self.pool2(x)
        x = self.flatten(x)
        x = self.fc(x)
        return x

# 数据预处理
transform = Compose([Normalize(mean=[127.5], std=[127.5], data_format='CHW')])

# 数据加载
train_dataset = MNIST(mode='train', transform=transform)
train_loader = paddle.io.DataLoader(train_dataset, batch_size=32, shuffle=True)
test_dataset = MNIST(mode='test', transform=transform)
test_loader = paddle.io.DataLoader(test_dataset, batch_size=32, shuffle=False)

# 创建VisualDL日志写入器
log_writer = LogWriter('./visualdl_logs')

# 定义模型训练过程
def train(model, epoch):
    model.train()
    for batch_id, data in enumerate(train_loader()):
        images, labels = data
        labels = paddle.squeeze(labels)
        predicts = model(images)
        loss = paddle.nn.functional.cross_entropy(predicts, labels)
        avg_loss = paddle.mean(loss)

        if batch_id % 100 == 0:
            print("epoch: {}, batch_id: {}, loss is: {}".format(epoch, batch_id, avg_loss.numpy()))

        avg_loss.backward()
        optimizer.step()
        optimizer.clear_grad()

        # 记录训练日志到VisualDL
        log_writer.add_scalar(tag="train_loss", step=batch_id, value=avg_loss.numpy())

# 创建模型
model = MyModel()

# 定义优化器
optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())

# 训练模型并使用VisualDL进行可视化
with fluid.dygraph.guard():
    for epoch in range(10):
        train(model, epoch)

# 保存VisualDL日志
log_writer.close()

这个程序的作用是使用PaddlePaddle框架实现一个简单的手写数字识别模型,并利用VisualDL库进行模型训练过程的可视化。

程序的主要步骤如下:

  1. 导入必要的库和模块,包括PaddlePaddle、PaddleVision、VisualDL等。

  2. 定义一个自定义的模型类MyModel,继承自paddle.nn.Layer。这个模型包括了卷积层、池化层、全连接层等,用于提取图像特征并进行分类。

  3. 进行数据预处理。使用Compose函数将数据的像素值进行归一化。

  4. 加载训练和测试数据集。使用MNIST数据集类从PaddleVision中加载手写数字数据集,并使用DataLoader创建数据加载器,指定批量大小和是否打乱数据。

  5. 创建VisualDL日志写入器LogWriter,用于记录训练过程中的损失值。

  6. 定义模型训练函数train,其中使用模型前向传播计算预测结果,计算损失值,进行反向传播更新模型参数,并将训练过程中的损失值记录到VisualDL中。

  7. 创建模型实例model和优化器optimizer

  8. 使用fluid.dygraph.guard()进入动态图模式,并使用循环进行多个epoch的训练。每个epoch调用train函数进行模型训练。

  9. 训练结束后关闭VisualDL日志写入器。

总结来说,该程序的作用是实现手写数字识别模型的训练过程,并通过VisualDL可视化工具记录训练过程中的损失值,以便更直观地观察和分析模型的训练效果。

你可能感兴趣的:(学习笔记,数学建模,python,开发语言)