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_第1张图片

你可能感兴趣的