paddlepaddle模型训练和预测之高级API
Posted 修炼之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了paddlepaddle模型训练和预测之高级API相关的知识,希望对你有一定的参考价值。
导读
paddlepaddle对于模型的训练提供了两种不同的方式,分别是高级API
和基础API
,两种模型的训练方式各有优劣,对于不同的使用场景我们可以选择不同的方式
- 高级API:代码简洁,构建模型速度快,灵活度低,不方便更改
- 基础API:相对来说稍微复杂些,灵活度高,可以根据自己的需求随意修改
模型训练
使用高级API进行模型训练可以分为五个步骤
- 数据加载和预处理
这里我们使用的是 FashionMNIST
,因为FashionMNIST
已经内置到paddlepaddle
中了,所以我们可以直接使用paddle.vision.datasets.FashionMNIST
来加载数据集,如果你使用的是自己数据集可以对paddle.io.Dataset
进行封装即可,这里我们使用transforms
对输入图片做了预处理
- 模型构建
我们构建模型使用的是Sequential
,构建了一个LeNet网络,通过paddle.Model
对构建好的模型进行封装
- 模型参数设置
设置模型训练时参数,以及损失函数和梯度下降的优化算法,通过model.prepare
来设置模型参数
- 模型训练
通过model.fit
来训练模型
- 模型评估
通过model.evaluate
来评估模型在测试集上的指标
import paddle
from paddle import nn
from paddle.vision import transforms
#设置模型使用的硬件设备
paddle.device.set_device("gpu:0")
#数据的预处理,将输入的图片数据的均值归一化为0,方差为1
transform = transforms.Normalize(mean=[127.5],std=[127.5],data_format="CHW")
#加载训练集和测试集
train_data = paddle.vision.datasets.FashionMNIST(mode="train",transform=transform)
test_data = paddle.vision.datasets.FashionMNIST(mode="test",transform=transform)
#设置数据集类别的数量
num_classes = 10
#设置模型训练的epoch
epoch = 10
#设置batch_size
batch_size = 64
#模型的构建
lenet = nn.Sequential(
nn.Conv2D(1,6,3,stride=1,padding=1),#输入:1x28x28,输出:6x28x28
nn.ReLU(),
nn.MaxPool2D(2,2),#输出:6x14x14
nn.Conv2D(6,16,5,stride=1,padding=0),#输出:16x10x10
nn.ReLU(),
nn.MaxPool2D(2,2),#输出:16x5x5
nn.Flatten(),
nn.Linear(400,120),
nn.Linear(120,84),
nn.Linear(84,num_classes)
)
#模型封装
model = paddle.Model(lenet)
#设置模型训练时使用的优化器/损失函数/评价指标
optim = paddle.optimizer.Adam(learning_rate=0.001,parameters=model.parameters())
loss_fn = paddle.nn.CrossEntropyLoss()
acc = paddle.metric.Accuracy()
#模型的配置
model.prepare(optimizer=optim,loss=loss_fn,metrics=acc)
#模型训练
model.fit(train_data,epochs=epoch,batch_size=batch_size,verbose=1,save_dir="output")
#模型评估
eval_res = model.evaluate(test_data,verbose=1)
print(eval_res)
模型训练输出结果
Epoch 1/10
step 938/938 [==============================] - loss: 0.4084 - acc: 0.8158 - 20ms/step
Epoch 2/10
step 938/938 [==============================] - loss: 0.3929 - acc: 0.8706 - 14ms/step
Epoch 3/10
step 938/938 [==============================] - loss: 0.3072 - acc: 0.8807 - 14ms/step
Epoch 4/10
step 938/938 [==============================] - loss: 0.4311 - acc: 0.8878 - 14ms/step
Epoch 5/10
step 938/938 [==============================] - loss: 0.1816 - acc: 0.8927 - 14ms/step
Epoch 6/10
step 938/938 [==============================] - loss: 0.0690 - acc: 0.8972 - 16ms/step
Epoch 7/10
step 938/938 [==============================] - loss: 0.4872 - acc: 0.8994 - 16ms/step
Epoch 8/10
step 938/938 [==============================] - loss: 0.2345 - acc: 0.9022 - 15ms/step
Epoch 9/10
step 938/938 [==============================] - loss: 0.2607 - acc: 0.9051 - 16ms/step
Epoch 10/10
step 938/938 [==============================] - loss: 0.3903 - acc: 0.9088 - 15ms/step
Eval begin...
step 10000/10000 [==============================] - loss: 0.4506 - acc: 0.8796 - 4ms/step
Eval samples: 10000
'loss': [0.45056665], 'acc': 0.8796
模型加载和预测
from matplotlib import pyplot as plt
#加载模型
model.load("output/9")
#加载模型配置
model.prepare()
#模型预测
test_result = model.predict(test_data)
output = test_result[0]
#显示预测的结果
plt.figure(figsize=(8,8))
#设置行和列的数量
row_num = 4
col_num = 4
for i in range(16):
img,true_label = test_data[i]
pred_label = output[i].argmax()
plt.subplot(row_num,col_num,i+1)
img = img[0]
plt.imshow(img)
plt.title("ture:\\n predict:".format(true_label[0],pred_label))
#隐藏x轴和y轴
plt.xticks([])
plt.yticks([])
plt.show()
以上是关于paddlepaddle模型训练和预测之高级API的主要内容,如果未能解决你的问题,请参考以下文章