体验paddle2.0rc版本API-Model--实现Mnist数据集模型训练
生活随笔
收集整理的這篇文章主要介紹了
体验paddle2.0rc版本API-Model--实现Mnist数据集模型训练
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文鏈接:體驗paddle2.0rc版本API-Model–實現Mnist數據集模型訓練:https://blog.csdn.net/weixin_44604887/article/details/109566281
嘗試Mnist訓練
- 導入需要的包
- 導入Mnist數據集
- 組網
- 搭建網絡
- 查看模型參數
- 查看模型網絡(自動命名)
- 利用Model-API進行訓練
- 模型傳入
- Model-API參數配置
- fit--訓練
- 模型評估
- 加載保存的模型
- 創建相同的網絡模型--用于加載保存的模型參數
- 查看當前運算所在環境是否在GPU
- 加載模型參數
- 方法一
- 方法二
- Model-API參數配置
- 保存模型的評估
- 總結
主要內容:
(主體代碼源于官方文檔,僅對部分知識點進行擴展和說明)
導入需要的包
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’ 返回驗證集
- 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–優化器的參數–學習率大小等
- 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
總結
以下是API分類圖(源于官方文檔)
總結
以上是生活随笔為你收集整理的体验paddle2.0rc版本API-Model--实现Mnist数据集模型训练的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度好文:2018 年 NLP 应用和商
- 下一篇: 论文浅尝 | 利用Lattice LST