首页 Paddle框架 帖子详情
关于静态图的debug求助... 已解决
收藏
快速回复
Paddle框架 问答深度学习 1396 5
关于静态图的debug求助... 已解决
收藏
快速回复
Paddle框架 问答深度学习 1396 5
我使用 paddle.jit.ProgramTranslator().get_program 这个 API 将动态图转成静态图后,函数返回得到静态图的 main_program, startup_program, inputs, outputs,那么如何使用Executor来执行该Program?
一直用动态图,完全不懂静态图的小白在线求助。以下是示范代码,请问要怎么修改才能work?
import paddle
import paddle.nn as nn
from paddle.static import InputSpec


class T(nn.Layer):
    def __init__(self):
        super(T, self).__init__()
        self.lstm = nn.LSTM(64, 32)

    def forward(self, x):
        return self.lstm(x)


t = T()
x = paddle.ones([2, 32, 64])
input_example = InputSpec([None, 32, 64], name="inputs")
dy2st = paddle.jit.ProgramTranslator()
main_program, startup_program, inputs, outputs = dy2st.get_program(t.forward, x)

exe = paddle.static.Executor()
compiled_prog = paddle.static.CompiledProgram(main_program)

exe.run(compiled_prog)  # 报错
res = exe.run(compiled_prog, feed={'inputs': x}, fetch_list=[outputs[0].name])  # 报错
z
zhhsplendid
已解决
2# 回复于2021-05
如果只是想静态图运行操作program的话,不需要用get_program那么麻烦。paddle的动态图api在静态图模式下是组网api,所以可以通过paddle.enable_static() 打开静态图模式后,进行静态图相关组网操作。一个例子代码如下: ``` import paddle import paddle.nn as nn from paddle.static import InputSpec   paddle.enable_static()   class T(nn.Layer):     def __init__(self):         super(T, self).__init__()         self.lstm = nn.LSTM(64, 32)       def forward(self, x):         return self.lstm(x)   t = T()   x = paddle.ones([2, 32, 64]) # 如果想要可变的x输入,则使用paddle.static.data   #组网 y, _ = t(x)       startup_prog = paddle.static.default_startup_program() main_prog = paddle.static.default_main_program() exe = paddle.static.Executor() exe.run(startup_prog) output = exe.run(main_prog, feed={}, fetch_list=[y]) print(output) ```
展开
0
收藏
回复
全部评论(5)
时间顺序
z
zhhsplendid
#2 回复于2021-05

如果只是想静态图运行操作program的话,不需要用get_program那么麻烦。paddle的动态图api在静态图模式下是组网api,所以可以通过paddle.enable_static() 打开静态图模式后,进行静态图相关组网操作。一个例子代码如下:

```

import paddle

import paddle.nn as nn

from paddle.static import InputSpec

 


paddle.enable_static()

 


class T(nn.Layer):

    def __init__(self):

        super(T, self).__init__()

        self.lstm = nn.LSTM(64, 32)

 


    def forward(self, x):

        return self.lstm(x)

 


t = T()

 


x = paddle.ones([2, 32, 64]) # 如果想要可变的x输入,则使用paddle.static.data

 


#组网

y, _ = t(x)

 

 

 

startup_prog = paddle.static.default_startup_program()

main_prog = paddle.static.default_main_program()

exe = paddle.static.Executor()

exe.run(startup_prog)

output = exe.run(main_prog, feed={}, fetch_list=[y])

print(output)

```

0
回复
TC.Long
#3 回复于2021-05

接楼上,如果要动转静模式运行,也可以简单添加@paddle.jit.to_static

import paddle
import paddle.nn as nn
from paddle.static import InputSpec


class T(nn.Layer):
    def __init__(self):
        super(T, self).__init__()
        self.lstm = nn.LSTM(64, 32)

    @paddle.jit.to_static
    def forward(self, x):
        return self.lstm(x)

t = T()

x = paddle.ones([2, 32, 64])
y, _ = t(x)
print(y)
0
回复
j
jzhang533
#4 回复于2021-05
import paddle
linear = paddle.nn.Linear(32, 64)

测试代码高亮

0
回复
TC.Long
#5 回复于2021-05

然后你的这种用法一般是开发的时候debug的时候用的,不推荐使用哈,常规用法可以参考2楼和3楼的回复,然后关于动转静更多的用法,可以看这里的文档:https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/04_dygraph_to_static/index_cn.html

0
回复
CarryOnGoing
#6 回复于2021-05
如果只是想静态图运行操作program的话,不需要用get_program那么麻烦。paddle的动态图api在静态图模式下是组网api,所以可以通过paddle.enable_static() 打开静态图模式后,进行静态图相关组网操作。一个例子代码如下: ``` import paddle import paddle.nn as nn from paddle.static import InputSpec   paddle.enable_static()   class T(nn.Layer):     def __init__(self):         super(T, self).__init__()         self.lstm = nn.LSTM(64, 32)       def forward(self, x):         return self.lstm(x)   t = T()   x = paddle.ones([2, 32, 64]) # 如果想要可变的x输入,则使用paddle.static.data   #组网 y, _ = t(x)       startup_prog = paddle.static.default_startup_program() main_prog = paddle.static.default_main_program() exe = paddle.static.Executor() exe.run(startup_prog) output = exe.run(main_prog, feed={}, fetch_list=[y]) print(output) ```
展开

是要输入一个样例paddle才会开始构建静态计算图吗?就像你上述代码中的 y, _ = t(x)

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户