关于静态图的debug求助...
收藏
我使用 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]) # 报错
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
收藏
请登录后评论
如果只是想静态图运行操作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.jit.to_static
测试代码高亮
然后你的这种用法一般是开发的时候debug的时候用的,不推荐使用哈,常规用法可以参考2楼和3楼的回复,然后关于动转静更多的用法,可以看这里的文档:https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/04_dygraph_to_static/index_cn.html
是要输入一个样例paddle才会开始构建静态计算图吗?就像你上述代码中的 y, _ = t(x)