PaddlePaddle核心使用教程
收藏
本文讲解飞桨框架的基本使用方法:第1部分介绍神经网络的构建;第2部分讲解神经网络训练过程;第3部分介绍模型权重的保存和加载。
1. 神经网络构建
使用飞桨框架构建神经网络的流程如下:
- 导入paddle库;
- 定义继承自paddle.nn.Layer的类,在__init__()方法中初始化神经网络的子层(或参数);
- 重写forward()方法,在该方法中实现神经网络计算流程。
在__init__()方法中初始化神经网络子层的本质是初始化神经网络的参数,不同的子层实质上是不同的部分参数初始化及前向计算流程的封装。下面两种网络构建方式是等同的:
import paddle # 构建方法一:使用飞桨框架内置封装好的子层 class LinearNet1(paddle.nn.Layer): def __init__(self): super(LinearNet1, self).__init__() # 使用飞桨框架封装好的Linear层 self.linear = paddle.nn.Linear(in_features=3, out_features=2) def forward(self, x): return self.linear(x) # 构建方法二:自定义神经网络参数 class LinearNet2(paddle.nn.Layer): def __init__(self): super(LinearNet2, self).__init__() # 自定义神经网络参数 w = self.create_parameter(shape=[3, 2]) b = self.create_parameter(shape=[2], is_bias=True) self.add_parameter('w', w) self.add_parameter('b', b) def forward(self, x): x = paddle.matmul(x, self.w) x = x + self.b return x if __name__ == "__main__": model1 = LinearNet1() model2 = LinearNet2() print('LinearNet1模型结构信息:') paddle.summary(model1, input_size=(None, 3)) print('LinearNet2模型结构信息:') paddle.summary(model2, input_size=(None, 3))
输出两种模型结构信息如下:
LinearNet1模型结构信息: --------------------------------------------------------------------------- Layer (type) Input Shape Output Shape Param # =========================================================================== Linear-1 [[1, 3]] [1, 2] 8 =========================================================================== Total params: 8 Trainable params: 8 Non-trainable params: 0 --------------------------------------------------------------------------- Input size (MB): 0.00 Forward/backward pass size (MB): 0.00 Params size (MB): 0.00 Estimated Total Size (MB): 0.00 --------------------------------------------------------------------------- LinearNet2模型结构信息: --------------------------------------------------------------------------- Layer (type) Input Shape Output Shape Param # =========================================================================== LinearNet2-1 [[1, 3]] [1, 2] 8 =========================================================================== Total params: 8 Trainable params: 8 Non-trainable params: 0 --------------------------------------------------------------------------- Input size (MB): 0.00 Forward/backward pass size (MB): 0.00 Params size (MB): 0.00 Estimated Total Size (MB): 0.00 ---------------------------------------------------------------------------
2. 神经网络训练
使用飞桨框架训练神经网络的流程如下:
- 实例化模型对象model;
- 使用model.eval(),将模型更改为eval模式;
- 定义优化器opt,指定优化参数;
- 在循环中输入数据,执行模型前向计算流程,得到前向输出结果;
- 计算前向输出结果和数据的标签的损失loss;
- 使用loss.backward()进行后向传播,计算loss关于模型参数的梯度;
- 使用opt.step()更新一次模型参数;
- 使用opt.clear_grad()清除模型参数梯度;
- 回到4,继续优化模型参数。
示例代码如下:
def train(epochs: int = 5): """ 训练过程示例 :param epochs: 对数据集的遍历次数 :return: """ # 实例化模型对象 model = LinearNet1() # 更改为eval模式 model.eval() # 定义优化器 opt = paddle.optimizer.SGD(learning_rate=1e-2, parameters=model.parameters()) for epoch in range(epochs): # 生成随机的输入和标签 fake_inputs = paddle.randn(shape=(10, 3), dtype='float32') fake_labels = paddle.randn(shape=(10, 2), dtype='float32') # 前向计算 output = model(fake_inputs) # 计算损失 loss = paddle.nn.functional.mse_loss(output, fake_labels) print(f'Epoch:{epoch}, Loss:{loss.numpy()}') # 后向传播 loss.backward() # 参数更新 opt.step() # 清除梯度 opt.clear_grad()
打印输出如下:
Epoch:0, Loss:[1.5520184] Epoch:1, Loss:[1.6992496] Epoch:2, Loss:[1.9622276] Epoch:3, Loss:[2.1343968] Epoch:4, Loss:[1.221286]
3. 模型权重的保存和加载
飞桨框架提供了非常简单易用的API实现在模型训练和应用时保存或加载模型参数。具体如下:
保存模型参数:
- paddle.save(model.state_dict(), 'save_path/model.pdparams')
加载模型参数:
- state_dict = paddle.load('save_path/model.pdparams')
- model.set_state_dict(state_dict)
0
收藏
请登录后评论
还有Sequential的方式也可以看一下哈
使用PaddlePaddle框架的核心无非就是搭建网络,训练网络和保存加载参数,新技能Got!
请问怎么加载自己的数据集呀