从完成一个简单的『手写数字识别任务』开始,可快速了解深度学习模型开发的大致流程,并初步掌握飞桨框架API的使用方法。
如果已经安装好飞桨那么可以跳过此步骤。飞桨支持很多种安装方式,这里介绍其中一种简单的安装命令。
注:目前飞桨支持Python3.6~3.9版本,pip3要求20.2.2或更高版本,请提前安装对应版本的Python和pip工具。
安装完成后,需要在Python解释器中使用import导入飞桨,即可开始实践深度学习任务。
若操作成功,会输出飞桨的版本号。
图1:MNIST数据集样例
开始之前,需要使用下面的命令安装Python的matplotlib库和numpy库,matplotlib库用于可视化图片,numpy库用于处理数据。
以上代码使用MNIST数据集训练并测试了LeNet模型,并最终成功推理出了一张手写数字图片的标签,该图片推理结果是7(predlabel:7),真实标签也是7(truelabel:7)。
简单地说,深度学习任务一般分为以下几个核心步骤:
接下来逐个步骤介绍,帮助你快速掌握使用飞桨框架实践深度学习任务的方法。
更多参考:
飞桨的模型组网有多种方式,既可以直接使用飞桨内置的模型,也可以自定义组网。
模型训练需完成如下步骤:
#封装模型,便于进行后续的训练、评估和推理model=paddle.Model(lenet)#模型训练的配置准备,准备损失函数,优化器和评价指标model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),paddle.nn.CrossEntropyLoss(),paddle.metric.Accuracy(),)#开始训练model.fit(train_dataset,epochs=5,batch_size=64,verbose=1)Thelossvalueprintedinthelogisthecurrentstep,andthemetricistheaveragevalueofprevioussteps.Epoch1/5step938/938[==============================]-loss:0.0011-acc:0.9865-14ms/stepEpoch2/5step938/938[==============================]-loss:0.0045-acc:0.9885-14ms/stepEpoch3/5step938/938[==============================]-loss:0.0519-acc:0.9896-14ms/stepEpoch4/5step938/938[==============================]-loss:4.1989e-05-acc:0.9912-14ms/stepEpoch5/5step938/938[==============================]-loss:0.0671-acc:0.9918-15ms/step从训练过程的打印日志中,可观察到损失函数值loss逐渐变小,精度acc逐渐上升的趋势,反映出不错的训练效果。
#进行模型评估model.evaluate(test_dataset,batch_size=64,verbose=1)Evalbegin...step157/157[==============================]-loss:5.7177e-04-acc:0.9859-6ms/stepEvalsamples:10000{'loss':[0.00057177414],'acc':0.9859}从结果可以看到,初步训练得到的模型精度在98%附近,在逐渐熟悉深度学习模型开发和训练技巧后,可以通过调整其中的训练参数来进一步提升模型的精度。
模型训练完成后,通常需要将训练好的模型参数和优化器等信息,持久化保存到参数文件中,便于后续执行推理验证。
#保存模型,文件夹会自动创建model.save("./output/mnist")以上代码执行后会在output目录下保存两个文件,mnist.pdopt为优化器的参数,mnist.pdparams为模型的参数。
如下示例中,针对前面创建的model网络加载保存的参数文件output/mnist,并选择测试集中的一张图片test_dataset[0]作为输入,执行推理并打印结果,可以看到推理的结果与可视化图片一致。
#加载模型model.load("output/mnist")#从测试集中取出一张图片img,label=test_dataset[0]#将图片shape从1*28*28变为1*1*28*28,增加一个batch维度,以匹配模型输入格式要求img_batch=np.expand_dims(img.astype("float32"),axis=0)#执行推理并打印结果,此处predict_batch返回的是一个list,取出其中数据获得预测结果out=model.predict_batch(img_batch)[0]pred_label=out.argmax()print("truelabel:{},predlabel:{}".format(label[0],pred_label))#可视化图片frommatplotlibimportpyplotaspltplt.imshow(img[0])truelabel:7,predlabel:7
至此通过飞桨几个简单的API完成了一个深度学习任务,总结整个流程和用到的关键API如下图所示。
图2:模型开发流程
如果想要完成更复杂的深度学习任务,开发更强大的模型,飞桨提供了功能丰富的API帮助开发者完成任务,比如对数据集应用数据增强、使用更大的CNN模型、调优性能等。飞桨官网提供了丰富的教程与案例可供参考,欢迎一起探索深度学习的世界。