机巧围棋使用飞桨(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__()
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()
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)
4. 结束语
飞桨(PaddlePaddle)是中国首个自主研发、功能完备、 开源开放的产业级深度学习平台。其不仅提供了简单易用的深度学习模型构建及训练API,同时还集深度学习核心训练和推理框架、基础模型库、端到端开发套件和丰富的工具组件于一体。
机巧围棋使用飞桨框架构建并训练阿尔法狗落子策略中的价值网络和策略网络。本文详细讲解了飞桨框架最核心最基础的使用方法,相信读者在阅读完本文后,可以清晰地了解到机巧围棋中阿尔法狗的神经网络模型训练机制。
最后,期待您能够给本文点个赞,同时去GitHub上给机巧围棋项目点个Star呀~
机巧围棋项目链接:https://github.com/QPT-Family/QPT-CleverGo
|