ガイド
高级API
Paddlepaddle では、モデル トレーニングにとという 2 つの異なる方法が提供されています基础API
。2 つのモデルのトレーニング方法には、それぞれ長所と短所があります。さまざまな使用シナリオに応じて、異なる方法を選択できます。
- 高度な API: シンプルなコード、高速なモデル構築、低い柔軟性、変更が不便
- 基本 API: 比較的複雑で柔軟性が高く、ニーズに応じて自由に変更できます。
モデルトレーニング
高レベル API を使用したモデルのトレーニングは 5 つのステップに分けることができます
- データのロードと前処理
ここでは を使用しています 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()