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库进行模型训练过程的可视化。
程序的主要步骤如下:
-
导入必要的库和模块,包括PaddlePaddle、PaddleVision、VisualDL等。
-
定义一个自定义的模型类
MyModel
,继承自paddle.nn.Layer
。这个模型包括了卷积层、池化层、全连接层等,用于提取图像特征并进行分类。 -
进行数据预处理。使用
Compose
函数将数据的像素值进行归一化。 -
加载训练和测试数据集。使用
MNIST
数据集类从PaddleVision中加载手写数字数据集,并使用DataLoader
创建数据加载器,指定批量大小和是否打乱数据。 -
创建VisualDL日志写入器
LogWriter
,用于记录训练过程中的损失值。 -
定义模型训练函数
train
,其中使用模型前向传播计算预测结果,计算损失值,进行反向传播更新模型参数,并将训练过程中的损失值记录到VisualDL中。 -
创建模型实例
model
和优化器optimizer
。 -
使用
fluid.dygraph.guard()
进入动态图模式,并使用循环进行多个epoch的训练。每个epoch调用train
函数进行模型训练。 -
训练结束后关闭VisualDL日志写入器。文章来源:https://www.toymoban.com/news/detail-461815.html
总结来说,该程序的作用是实现手写数字识别模型的训练过程,并通过VisualDL可视化工具记录训练过程中的损失值,以便更直观地观察和分析模型的训练效果。文章来源地址https://www.toymoban.com/news/detail-461815.html
到了这里,关于飞浆 | PaddlePaddle框架入门之数字识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!