1-2动态图

2023-11-16

动态图

在这种模式下,每次执行一个运算,可以立即得到结果(而不是事先定义好网络结构,然后再执行)。在动态图模式下,你可以更加方便的组织代码,更容易的调试程序,本示例教程将向你介绍飞桨的动态图的使用。

一、环境配置

import paddle
import paddle.nn.functional as F
import numpy as np

print(paddle.__version__)

2.2.1

二、基本用法

在动态图模式下,你可以直接运行一个飞桨提供的API,它会立刻返回结果到python。不再需要首先创建一个计算图,然后再给定数据去运行。

a = paddle.randn([4, 2])
b = paddle.arange(1, 3, dtype='float32')

print(a)
print(b)

c = a + b
print(c)

d = paddle.matmul(a, b)
print(d)

Tensor(shape=[4, 2], dtype=float32, place=CUDAPlace(0), stop_gradient=True,
       [[-1.23295915,  0.43236846],
        [-0.09865052,  0.95576662],
        [-0.06097634,  2.17814565],
        [ 0.08014798, -0.56198031]])
Tensor(shape=[2], dtype=float32, place=CUDAPlace(0), stop_gradient=True,
       [1., 2.])
Tensor(shape=[4, 2], dtype=float32, place=CUDAPlace(0), stop_gradient=True,
       [[-0.23295915,  2.43236852],
        [ 0.90134948,  2.95576668],
        [ 0.93902367,  4.17814541],
        [ 1.08014798,  1.43801975]])
Tensor(shape=[4], dtype=float32, place=CUDAPlace(0), stop_gradient=True,
       [-0.36822224,  1.81288266,  4.29531479, -1.04381263])

三、使用python的控制流

动态图模式下,你可以使用python的条件判断和循环,这类控制语句来执行神经网络的计算。(不再需要cond, loop这类OP)

a = paddle.to_tensor(np.array([1, 2, 3]))
b = paddle.to_tensor(np.array([4, 5, 6]))

for i in range(10):
    r = paddle.rand([1,])
    if r > 0.5:
        c = paddle.pow(a, i) + b
        print("{} +> {}".format(i, c.numpy()))
    else:
        c = paddle.pow(a, i) - b
        print("{} -> {}".format(i, c.numpy()))

0 -> [-3 -4 -5]
1 +> [5 7 9]
2 +> [ 5  9 15]
3 -> [-3  3 21]
4 +> [ 5 21 87]
5 +> [  5  37 249]
6 -> [ -3  59 723]
7 -> [  -3  123 2181]
8 -> [  -3  251 6555]
9 +> [    5   517 19689]

四、构建更加灵活的网络:控制流

  • 使用动态图可以用来创建更加灵活的网络,比如根据控制流选择不同的分支网络,和方便的构建权重共享的网络。接下来来看一个具体的例子,在这个例子中,第二个线性变换只有0.5的可能性会运行。

  • 在sequence to sequence with attention的机器翻译的示例中,你会看到更实际的使用动态图构建RNN类的网络带来的灵活性。

class MyModel(paddle.nn.Layer):
    def __init__(self, input_size, hidden_size):
        super(MyModel, self).__init__()
        self.linear1 = paddle.nn.Linear(input_size, hidden_size)
        self.linear2 = paddle.nn.Linear(hidden_size, hidden_size)
        self.linear3 = paddle.nn.Linear(hidden_size, 1)

    def forward(self, inputs):
        x = self.linear1(inputs)
        x = F.relu(x)

        if paddle.rand([1,]) > 0.5: 
            x = self.linear2(x)
            x = F.relu(x)

        x = self.linear3(x)
        
        return x     

total_data, batch_size, input_size, hidden_size = 1000, 64, 128, 256

x_data = np.random.randn(total_data, input_size).astype(np.float32)
y_data = np.random.randn(total_data, 1).astype(np.float32)

model = MyModel(input_size, hidden_size)

loss_fn = paddle.nn.MSELoss(reduction='mean')
optimizer = paddle.optimizer.SGD(learning_rate=0.01, 
                                 parameters=model.parameters())

for t in range(200 * (total_data // batch_size)):
    idx = np.random.choice(total_data, batch_size, replace=False)
    x = paddle.to_tensor(x_data[idx,:])
    y = paddle.to_tensor(y_data[idx,:])
    y_pred = model(x)

    loss = loss_fn(y_pred, y)
    if t % 200 == 0:
        print(t, loss.numpy())

    loss.backward()
    optimizer.step()
    optimizer.clear_grad()

0 [1.5085251]
200 [0.76789844]
400 [0.52853113]
600 [0.27155834]
800 [0.21036112]
1000 [0.04863136]
1200 [0.0624725]
1400 [0.02772576]
1600 [0.02455759]
1800 [0.00250034]
2000 [0.00698137]
2200 [0.008535]
2400 [0.00082006]
2600 [0.00335711]
2800 [0.00096334]

五、构建更加灵活的网络:共享权重

  • 使用动态图还可以更加方便的创建共享权重的网络,下面的示例展示了一个共享了权重的简单的AutoEncoder。

  • 你也可以参考图像搜索的示例看到共享参数权重的更实际的使用。

inputs = paddle.rand((256, 64))

linear = paddle.nn.Linear(64, 8, bias_attr=False)
loss_fn = paddle.nn.MSELoss()
optimizer = paddle.optimizer.Adam(0.01, parameters=linear.parameters())

for i in range(10):
    hidden = linear(inputs)
    # weight from input to hidden is shared with the linear mapping from hidden to output
    outputs = paddle.matmul(hidden, linear.weight, transpose_y=True) 
    loss = loss_fn(outputs, inputs)
    loss.backward()
    print("step: {}, loss: {}".format(i, loss.numpy()))
    optimizer.step()
    optimizer.clear_grad()

step: 0, loss: [0.32769835]
step: 1, loss: [0.30599958]
step: 2, loss: [0.28045067]
step: 3, loss: [0.25096473]
step: 4, loss: [0.218723]
step: 5, loss: [0.1859532]
step: 6, loss: [0.1555582]
step: 7, loss: [0.13047957]
step: 8, loss: [0.11281298]
step: 9, loss: [0.10287865]

The End

可以看到使用动态图带来了更灵活易用的方式来组网和训练。你也可以在【使用注意力机制的LSTM的机器翻译】和【图片检索】两个示例中看到更完整的动态图的实际应用的灵活和便利。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1-2动态图 的相关文章

  • 在 Python 中解析 TCL 列表

    我需要在双括号上拆分以空格分隔的 TCL 列表 例如 OUTPUT 172 25 50 10 01 01 Ethernet 172 25 50 10 01 02 Ethernet Traffic Item 1 172 25 50 10 01
  • 如何计算 pandas datetime 对象的均值和方差?

    如何计算 YYYY MM DD 形式的 python 日期时间对象的汇总统计数据 均值和标准差 我想对具有不同 ID 的不同日期时间对象组执行此操作 数据如下 import datetime as dt df pd DataFrame Da
  • Pandas set_levels,如何避免标签排序?

    我使用时遇到问题set levels多索引 from io import StringIO txt Name Height Age Metres A 1 25 B 95 1 df pd read csv StringIO txt heade
  • Python - 比较同一字典中的值

    我有一本字典 d Trump MAGA FollowTheMoney Clinton dems Clinton Stein FollowTheMoney Atlanta 我想删除字符串列表中的重复字符串 该字符串是键的值 对于这个例子 期望
  • matplotlib 图中点的标签

    所以这是一个关于已发布的解决方案的问题 我试图在我拥有的 matplotlib 散点图中的点上放置一些数据标签 我试图在这里模仿解决方案 是否有与 MATLAB 的 datacursormode 等效的 matplotlib https s
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • 如何从Python中的函数返回多个值? [复制]

    这个问题在这里已经有答案了 如何从Python中的函数返回多个变量 您可以用逗号分隔要返回的值 def get name you code return first name last name 逗号表示它是一个元组 因此您可以用括号将值括
  • python multiprocessing 设置生成进程等待

    是否可以生成一些进程并将生成进程设置为等待生成的进程完成 下面是我用过的一个例子 import multiprocessing import time import sys def daemon p multiprocessing curr
  • 为什么 web2py 在启动时崩溃?

    我正在尝试让 web2py 在 Ubuntu 机器上运行 所有文档似乎都表明要在 nix 系统上运行它 您需要下载源代码并执行以下操作 蟒蛇 web2py py 我抓住了source http www web2py com examples
  • 从 Powershell 脚本安装 Python

    当以管理员身份从 PowerShell 命令行运行以下命令时 可以在 Windows 11 上成功安装 Python c temp python 3 11 4 amd64 exe quiet InstallAllUsers 0 Instal
  • 为什么一旦我离开内置的运行服务器,Django 就无法找到我的管理媒体文件?

    当我使用内置的简单服务器时 一切正常 管理界面很漂亮 python manage py runserver 但是 当我尝试使用 wsgi 服务器为我的应用程序提供服务时django core handlers wsgi WSGIHandle
  • 使用 Python Oauthlib 通过服务帐户验证 Google API

    我不想使用适用于 Python 的 Google API 客户端库 但仍想使用 Python 访问 Google APIOauthlib https github com idan oauthlib 创建服务帐户后谷歌开发者控制台 http
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • 嵌套作用域和 Lambda

    def funct x 4 action lambda n x n return action x funct print x 2 prints 16 我不太明白为什么2会自动分配给n n是返回的匿名函数的参数funct 完全等价的定义fu
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • 在 Google App Engine 中,如何避免创建具有相同属性的重复实体?

    我正在尝试添加一个事务 以避免创建具有相同属性的两个实体 在我的应用程序中 每次看到新的 Google 用户登录时 我都会创建一个新的播放器 当新的 Google 用户在几毫秒内进行多个 json 调用时 我当前的实现偶尔会创建重复的播放器
  • 如果 PyPy 快 6.3 倍,为什么我不应该使用 PyPy 而不是 CPython?

    我已经听到很多关于PyPy http en wikipedia org wiki PyPy项目 他们声称它比现有技术快 6 3 倍CPython http en wikipedia org wiki CPython口译员开启他们的网站 ht
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是
  • 如何在Python脚本中从youtube-dl中提取文件大小?

    我是 python 编程新手 我想在下载之前提取视频 音频大小 任何 YouTube 视频 gt gt gt from youtube dl import YoutubeDL gt gt gt url https www youtube c

随机推荐

  • CentOS:Device eth0 does not seem to be present 问题解决方法

    使用Vmware克隆linux虚拟机后 常常是网络连接不上 表现为ifconfig无法看到网卡 即使改了 etc sysconfig network scripts 下的相应网卡文件onboot yes也不行 重启网络时 etc init
  • AABB和OBB包围盒简介

    一 AABB立方体边界框检测 用球体去近似地代表物体运算量很小 但在游戏中的大多数物体是方的或者长条形的 应该用方盒来代表物体 另一种常见的检测模型是立方体边界框 如图10 31展示了一个AABB检测盒和它里面的物体 坐标轴平行 Axial
  • Nginx反向代理负载均衡配置详解

    一 Nginx特性 Nginx使用可扩展的事件驱动 不是传统的过程驱动架构 在传统的Web服务器体系结构中 每个客户端连接作为一个单独的进程或线程处理 随着网站的流行度增加 并发连接数量的增加 Web服务器减慢 延迟了对用户的响应 从技术角
  • 【SpringBoot】简介及传统的 Spring 框架:对比和分析

    哈喽 哈喽 大家好 我是你们的老朋友 保护小周 今天给大家带来的是 SpringBoot 的简介 SpringBoot 项目的创建 相较于 Spring 框架的优点 1 快速的集成框架 2 内置运行容器 快速的部署项目 3 摒弃繁琐的 xm
  • 活动报名|X-Decoder&SEEM:从开放词库的图像理解到像素分割,如何用一个模型做N个任务理解M个模态...

    2023年04月27日 星期四 11 00 12 00 由智源社区主办的 智源LIVE 第39期线上活动 X Decoder SEEM 从开放词库的图像理解到像素分割 如何用一个模型做N个任务理解M个模态本期活动将在线举办 阅读原文 报名即
  • 科技感十足的網站頁面

    http www bootstrapmb com item 9102 preview
  • 信号盒子连接服务器,【当贝市场】简单4步解决电视盒子没信号问题

    原标题 当贝市场 简单4步解决电视盒子没信号问题 看电视是家庭娱乐方式 很多家庭都喜欢用电视机顶盒来看电视直播 很多用户也会遇到一个问题就是机顶盒没信号怎么看电视直播呢 大家都知道机顶盒看直播 都是在有网有信号的状态下才能完美呈现呢 机顶盒
  • element Plus Select选择器实现查询搜索 下拉选择

    这Select选择器用于哪里 怎么用 Select 选择器可以用于许多不同的场景 包括但不限于以下几个方面 表单 Select 选择器常用于表单中的下拉选择字段 例如选择国家 城市 性别 职位等 用户可以从预定义的选项中选择一个值 以便提交
  • gd32f103 串口数据处理说明

    1 数据接收或发送完毕 发出复位信号 GetBitState USART 接收数据 ch U8 USART DataReceive USART1 类似 C51 直接向寄存器写数据自动发送 UART1 SendChar ch 2 操作逻辑 发
  • 一个机器人位于一个 m x n 网格的左上角,机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路?

    一个机器人位于一个 m x n 网格的左上角 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 问总共有多少条不同的路 var machinePath1 function m n var arr new Array m n i
  • Deformable DETR源码解读

    文章目录 一 网络创新点 二 流程详解 part 1 deformable detr模块 part 2 deformable transformer模块 part3 Encoder模块 part 4 MSDeformAttn part5 D
  • Linux系统调试之gdbserver远程调试程序

    本篇讲解如何使用gdbserver对目标开发板上的程序进行远程调试 安装 GDBSERVER 首先在开发板上安装 gdbserver apt install gdbserver gdbserver 用法 gdbserver用法描述 Usag
  • redis概述-1

    视频链接 尚硅谷 Redis 6 入门到精通 超详细 教程 哔哩哔哩 bilibili 早期架构 随着web2 0 手机端和pc端的请求增加 应用服务器会有cpu及内存压力 数据服务器有IO压力 针对应用服务器 采用分布式 负载均衡的方式进
  • ILRuntime Unity热更新

    在新的项目中 使用到了ILRuntime的热更新方式 不同于XLua等 这种方式的热更新是由纯C 实现的 所以就不需要客户端懂Lua的代码 更详细的介绍可以看官方的文档 官方的介绍及文档为 http ourpalm github io IL
  • vcpkg安装和使用--学习入门

    前言 vcpkg是一个C 的包管理器 包管理器是专门管理一些代码库的 比如一些大佬们开源的一些NB的框架 我们可以用vcpkg将他们放到自己的项目中 然后就可以直接用了 我用的win10 vs2019 1 安装 1 先git clone下载
  • openwrt中计划任务的设置

    寝室的供网规则为周一到周五零点断网 六点开网 双休日通宵供网 故设置一套计划任务提高路由器使用效率 crontab命令常见于Unix和类Unix的操作系统之中 用于设置周期性被执行的指令 操作符号 在一个区域里填写多个数值的方法 逗号 分开
  • AcWing基础课题集汇总

    本篇博文是笔者归纳汇总的AcWing基础课题集 方便读者后期复盘巩固 PS 本篇文章只给出完整的算法实现 并没有讲解具体的算法思路 如果想看算法思路 可以阅读笔者往期写过的文章 或许会有 也可以移步AcWing官网看详情 本篇文章的特点 每
  • Qt应用开发(基础篇)——时间类 QDateTime、QDate、QTime

    一 前言 时间类QDateTime QDate QTime QTimeZone保存了Qt的时间 日期 时区信息 常用的时间类部件都会用到这些数据结构 常用概念有年 月 日 时 分 秒 毫秒和时区 时间和时区就关系到时间戳和UTC的概念 UT
  • Debian(Linux)系统Samba安装和配置

    samba安装 root用户下直接使用以下命令 apt get install samba 若是普通用户下使用以下命令 sudo apt get install samba samba配置 samba的配置文件在 etc samba 路径下
  • 1-2动态图

    文章目录 动态图 一 环境配置 二 基本用法 三 使用python的控制流 四 构建更加灵活的网络 控制流 五 构建更加灵活的网络 共享权重 The End 动态图 在这种模式下 每次执行一个运算 可以立即得到结果 而不是事先定义好网络结构