原文链接:体验paddle2.0rc版本API-Model–实现Mnist数据集模型训练:https://blog.csdn.net/weixin_44604887/article/details/109566281

尝试Mnist训练

  • 导入需要的包
  • 导入Mnist数据集
  • 组网
    • 搭建网络
    • 查看模型参数
    • 查看模型网络(自动命名)
  • 利用Model-API进行训练
    • 模型传入
    • Model-API参数配置
    • fit--训练
    • 模型评估
  • 加载保存的模型
    • 创建相同的网络模型--用于加载保存的模型参数
    • 查看当前运算所在环境是否在GPU
    • 加载模型参数
      • 方法一
      • 方法二
    • Model-API参数配置
    • 保存模型的评估
  • 总结
                         QQ:3020889729                                                                                 小蔡

主要内容:

  1. 利用paddle.vision.datasets加载paddle自带的图像数据集
  2. 利用paddle.nn.Sequntial进行顺序层网络组网–快捷组网
  3. 利用paddle.Model进行paddle自带的模型高级API进行一系列简便的训练,模型保存以及评估等
  4. 利用paddle.Model的load方法,对使用Model下saveAPI保存的模型进行加载

(主体代码源于官方文档,仅对部分知识点进行扩展和说明)

导入需要的包

import paddle
import paddle.nn as nn    # 导入网络模块:包含所需要的模块
from paddle import optimizer # 导入优化器模块
from paddle import Model     # 导入模型高级API,可传入设计好的网络模型,进行一系列的fit训练等操作
from paddle import metric    # 导入度量模块:模型准确率计算等
from paddle.vision import datasets  # 导入数据集接口

print(paddle.version) # 打印paddle版本号

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

导入Mnist数据集

datasets.MNIST的参数为mode

  • mode=‘train’ 为默认值,返回训练集
  • mode=‘test’ 返回验证集
train_datasets = datasets.MNIST(mode='train')  # 加载训练数据
test_datasets = datasets.MNIST(mode='test')
  • 1
  • 2

组网

搭建网络

利用线性层进行组网

mnist = nn.Sequential(nn.Flatten(),     # 平铺层,将多维数据展开为一维数据--将[N, ...] 转化为 [N, x]nn.Linear(784, 512),  # 线性层(全连接层), 将input_size=N*784 -> N*512nn.ReLU(),   # 激活曾(配置激活函数,添加非线性因子), 将上一层Linear的输出通过Relu激活层nn.Dropout(0.2),  # 丢弃层(dropout防过拟合), 使用Dropout层进行随机drop(计算输出时,随机将某些值替换为0)nn.Linear(512, 10)  # 将经过dropout层的输出size=512 -> 10 -> 得到输出类别
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

查看模型参数


# 查看模型参数--以及命名(字典形式)
for name, value in mnist.named_parameters():  print(name, '->', value)
  • 1
  • 2
  • 3
  • 4

查看模型网络(自动命名)

# 查看模型中的子层--即顺序层中的子层 --包括命名(字典形式)
for name, value in mnist.named_children():   print(name, '->', value.full_name())

# 一定程度上等价于以下代码
#for name, value in mnist.named_sublayers():
# print(name, ‘->’, value.full_name())

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

顺序层下的网络展示

利用Model-API进行训练

模型传入


# 利用paddle训练API进行快捷训练
model = paddle.Model(mnist)   # 将创建的网络送入模型API
  • 1
  • 2
  • 3

Model-API参数配置

# 模型API使用前所需传入参数--在训练前需要使用prepare进行训练配置
# 1-> optim(优化方法)
# 2-> loss(损失/目标函数)
# 3-> metric(评价/度量指标)
model.prepare(optimizer.Adam(parameters=mnist.parameters()),  # Adam优化方法nn.CrossEntropyLoss(),    # CE损失metric.Accuracy()   # 准确率
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

fit–训练

fit参数:

  • 明确常用fit参数 – 前四个
  • train_data:训练数据–必须要有的
  • eval_data: 验证数据–如果没有就不验证
  • batch_size: 批大小–尽量设,默认为1
  • verbose: 训练进度展示模式–0:无;1,每一个轮次展示进度条模式;2:将轮次作为迭代展示对象;
  • eval_freq:评估频率–指间隔多少个eval进行一次评估–默认为1
  • log_freq:同样的,日志输出频率–默认为10
  • save_dir:模型保存路径–默认为None,不保存
  • save_freq: 保存频率–同其他频率
  • drop_last:最后一批数据如果不足batch_size,那么就舍去,不使用为训练数据
  • shuffle: 是否打乱数据
  • num_workers:工作线程–多线程加载数据
  • save内容简单说明: pdparams–模型的参数–weight等 pdopt–优化器的参数–学习率大小等
model.fit(train_datasets,   # 训练数据集epochs=10,   # 轮次batch_size=24,  # 批大小: 一次训练用多少个数据verbose=1, # 进度展示--0为不展示save_dir='./work/mnist'  # 模型保存路径:包含pdparams与pdopt文件
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

模型评估

# 模型评估
# 参数:
# eval_data:验证集
# batch_size:批大小--默认为1
# log_freq:日志频率
# verbose:进度条模型--0为不展示
# num_workers:多线程
model.evaluate(test_datasets, verbose=1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

加载保存的模型

创建相同的网络模型–用于加载保存的模型参数

# 创建一摸一样的模型
new_model = nn.Sequential(nn.Flatten(),     # 将[N, ...] 转化为 [N, x]nn.Linear(784, 512),  # 将input_size=N*784 -> N*512nn.ReLU(),   # 将上一层Linear的输出通过Relu激活层nn.Dropout(0.2),  # 使用Dropout层进行随机drop(计算输出时,随机将某些值替换为0)nn.Linear(512, 10)  # 将经过dropout层的输出size=512 -> 10
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

查看当前运算所在环境是否在GPU

paddle.is_compiled_with_cuda()  # 判断当前允许环境--在gpu上返回True
  • 1

加载模型参数

方法一

# 按照paddle.Model.load-API 来加载参数
new_Model = Model(new_model)
new_Model.load('./work/mnist/final')   # 将保存的参数加载到当前的模型中

for value in new_Model.parameters(): # 在ModelAPI下查看模型参数
print(value)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

方法二

new_model.load_dict(paddle.load('./work/mnist/final.pdparams'))  # 利用原始paddle通用模型加载API加载模型参数后,再传入ModelAPI
new_Model = Model(new_model)
  • 1
  • 2

Model-API参数配置

new_Model.prepare(
# 利用set_state_dict加载优化器对应的参数--比如学习率等    optimizer.Adam(parameters=new_model.parameters()).set_state_dict(paddle.load('./work/mnist/final.pdopt')), nn.CrossEntropyLoss(),metric.Accuracy()
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

保存模型的评估

new_Model.evaluate(test_datasets, verbose=1)
  • 1

总结

  1. paddle2.0rc在整体上变化很大,首先是全面支持动态图,方便某火炬的小伙伴转到paddle进行学习
  2. 组网API更加亲近,将相关组网操作都放到了一起–比如Flatten平铺操作与激活函数作为网络层,方便组网时方法的查讯
  3. 高级API–Model的使用,方便了一般的训练过程,简化初始模型训练选型的成本(为后期模型选择后优化精度等节约了时间)
  4. 这次升级,最最最主要的还是API分类更明显,可用性和可读性有了更好的提升,这次简直杠杠的!!!

以下是API分类图(源于官方文档)

体验paddle2.0rc版本API-Model--实现Mnist数据集模型训练相关推荐

  1. 在MNIST数据集上训练一个手写数字识别模型

    使用Pytorch在MNIST数据集上训练一个手写数字识别模型, 代码和参数文件 可下载 1.1 数据下载 import torchvision as tvtraining_sets = tv.dat ...

  2. 【Pytorch分布式训练】在MNIST数据集上训练一个简单CNN网络,将其改成分布式训练

    文章目录 普通单卡训练-GPU 普通单卡训练-CPU 分布式训练-GPU 分布式训练-CPU 租GPU服务器相关 以下代码示例基于:在MNIST数据集上训练一个简单CNN网络,将其改成分布式训练. 普 ...

  3. DL之DNN:自定义2层神经网络TwoLayerNet模型(封装为层级结构)利用MNIST数据集进行训练、预测

    DL之DNN:自定义2层神经网络TwoLayerNet模型(封装为层级结构)利用MNIST数据集进行训练.预测 导读           计算图在神经网络算法中的作用.计算图的节点是由局部计算构成的. ...

  4. DL之DNN:自定义2层神经网络TwoLayerNet模型(封装为层级结构)利用MNIST数据集进行训练、GC对比

    DL之DNN:自定义2层神经网络TwoLayerNet模型(封装为层级结构)利用MNIST数据集进行训练.GC对比 导读           神经网络算法封装为层级结构的作用.在神经网络算法中,通过将 ...

  5. DL之DNN:自定义2层神经网络TwoLayerNet模型(计算梯度两种方法)利用MNIST数据集进行训练、预测

    DL之DNN:自定义2层神经网络TwoLayerNet模型(计算梯度两种方法)利用MNIST数据集进行训练.预测 导读 利用python的numpy计算库,进行自定义搭建2层神经网络TwoLayerN ...

  6. DL之DCGNN:基于TF利用DCGAN实现在MNIST数据集上训练生成新样本

    DL之DCGNN:基于TF利用DCGAN实现在MNIST数据集上训练生成新样本 目录 输出结果 设计思路 实现部分代码 说明:所有图片文件丢失 输出结果 更新-- 设计思路 更新-- 实现部分代码 更 ...

  7. R语言使用keras包实现卷积自动编码器模型(Convolutional Autoencoder)、加载keras自带的mnist数据集、训练中动态生成每个epoch后模型训练的loss曲线

    R语言使用keras包实现卷积自动编码器模型(Convolutional Autoencoder).加载keras自带的mnist数据集.训练中动态生成每个epoch后模型训练的loss曲线 目录

  8. 训练MNIST数据集模型

    1. 数据集准备 详细信息见: Caffe: LMDB 及其数据转换 mnist是一个手写数字库,由DL大牛Yan LeCun进行维护.mnist最初用于支票上的手写数字识别, 现在成了DL的入门练习 ...

  9. 【caffe】mnist数据集lenet训练与测试

    在上一篇中,费了九牛二虎之力总算是把Caffe编译通过了,现在我们可以借助mnist数据集,测试下Caffe的训练和检测效果. 准备工作:在自己的工作目录下,新建一个文件夹,命名为mnist_test ...

最新文章

  1. sudoers配置文件
  2. python 多进程multiprocessing进程池pool tensorflow-yolov3 报错 MemoryError
  3. SAP SuccessFactor学习中心的通知机制
  4. Activity的task相关
  5. C++ STL容器vector篇(五) vector容器常用初始化操作总结(一维/二维)
  6. 私有github java调用_使用Java API从GitHub获取所有提交
  7. 浅水声信道模型的建立(1)----只考虑海面海底一次散射,多亮点研究
  8. wpf ui框架_替代Silverlight:微软面向Web开发者推出Blazor新框架
  9. 初级工程师该如何去学习,如何去研发开关电源?
  10. 真诚的CISSP备考经验
  11. win7计算机病毒制作教程,win7 64位旗舰版系统删除电脑病毒文件夹方法
  12. Visual Studio 2022把C#代码打印出来的技巧 有屋设计拆单管理一体化软件 全屋定制拆单 橱柜衣柜整装 木门归方程序
  13. 基于SSH商场管理系统
  14. nginx负载均衡 tomcat报异常: parseHost The host [*] is not valid
  15. 【智能优化算法-白鲸算法】基于白鲸优化算法求解多目标优化问题附matlab代码
  16. 原创西门子SMART 200 modbus rtu通讯宇电温控器例程
  17. php上传文件到指定文件夹
  18. php 数组课件,php学习 数组课件第1/2页
  19. 谷歌地球倾斜模型3Dtiles格式cesium格式一键导入查看
  20. Protocol handler initialization failed

热门文章

  1. gdb调试时,Program received signal SIGPIPE, Broken pipe.
  2. C语言缓冲文件系统和非缓冲文件系统
  3. 涨疯了,历史总是如此相似
  4. C 语言中,x += 5 == 4 是什么意思?
  5. 你应该知道为什么需要内核
  6. STM32F7xx —— 96位唯一ID
  7. javascript option 菜单图标_苹果电脑上神奇的Option键 巧用option键提升效率
  8. 贪吃蛇python小白_面向 python 小白的贪吃蛇游戏
  9. oracle 锁表如何解决_Java高并发解决什么方式
  10. LeetCode 2091. 从数组中移除最大值和最小值(一次遍历)