IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 深度学习框架(PaddlePaddle)使用教程 -> 正文阅读

[人工智能]深度学习框架(PaddlePaddle)使用教程

机巧围棋使用飞桨(PaddlePaddle) 框架构建并训练阿尔法狗落子策略中的深度神经网络——策略网络和价值网络。

本文讲解飞桨框架的基本使用方法:第1部分介绍神经网络的构建;第2部分讲解神经网络训练过程;第3部分介绍模型权重的保存和加载。

1. 神经网络构建

使用飞桨框架构建神经网络的流程如下:

  1. 导入paddle库;
  2. 定义继承自paddle.nn.Layer的类,在__init__()方法中初始化神经网络的子层(或参数);
  3. 重写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. 神经网络训练

使用飞桨框架训练神经网络的流程如下:

  1. 实例化模型对象model
  2. 使用model.eval(),将模型更改为eval模式;
  3. 定义优化器opt,指定优化参数;
  4. 在循环中输入数据,执行模型前向计算流程,得到前向输出结果;
  5. 计算前向输出结果和数据的标签的损失loss
  6. 使用loss.backward()进行后向传播,计算loss关于模型参数的梯度;
  7. 使用opt.step()更新一次模型参数;
  8. 使用opt.clear_grad()清除模型参数梯度;
  9. 回到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)

4. 结束语

飞桨(PaddlePaddle)是中国首个自主研发、功能完备、 开源开放的产业级深度学习平台。其不仅提供了简单易用的深度学习模型构建及训练API,同时还集深度学习核心训练和推理框架、基础模型库、端到端开发套件和丰富的工具组件于一体。

机巧围棋使用飞桨框架构建并训练阿尔法狗落子策略中的价值网络和策略网络。本文详细讲解了飞桨框架最核心最基础的使用方法,相信读者在阅读完本文后,可以清晰地了解到机巧围棋中阿尔法狗的神经网络模型训练机制。

最后,期待您能够给本文点个赞,同时去GitHub上给机巧围棋项目点个Star呀~

机巧围棋项目链接:https://github.com/QPT-Family/QPT-CleverGo

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-11-23 12:20:39  更:2021-11-23 12:23:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 4:30:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码