如何向静态图中的 fluid.data 部分feed数据,得到相应的结果
Created by: wolfishboy
x1 = fluid.data(name="x_1", shape=[None, 3, 4], dtype="float32") x2 = fluid.data(name="x_2", shape=[None, 3, 4], dtype="float32") x3 = fluid.data(name="x_3", shape=[None, 3, 4], dtype="float32") x4 = fluid.data(name="x_4", shape=[None, 3, 4], dtype="float32")
output1 = fluid.layers.elementwise_add(x1, x2) output2 = fluid.layers.elementwise_div(x2, x3) output3 = fluid.layers.elementwise_add(x3, x4)
place = fluid.CPUPlace() exe = fluid.Executor(place) exe.run(fluid.default_startup_program()) input1 = np.random.random(size=(3, 3, 4)).astype("float32") input2 = np.random.random(size=(3, 3, 4)).astype("float32") input3 = np.random.random(size=(3, 3, 4)).astype("float32") input4 = np.random.random(size=(3, 3, 4)).astype("float32")
""" Err Results""" feedData = {"x_1": input1, "x_2": input2} fetch_list = [x1.name, x2.name, output1.name] x1, x2, res1 = exe.run(feed=feedData, fetch_list=fetch_list) print("x1: ", x1) print("x2: ", x2) print("res1: ", res1)
""" True Results""" feedData = {"x_1": input1, "x_2": input2, "x_3": input3, "x_4": input4} fetch_list = [x1.name, x2.name, x3.name, x4.name, output1.name] x1, x2, x3, x4, res1 = exe.run(feed=feedData, fetch_list=fetch_list) print("x1: ", x1) print("x2: ", x2) print("res1: ", res1)
想要达成的目标: 第一步:只feed x1、x2数据到静态图,run后得到output1的结果。 第二步:只feed x2、x3,run后得到output2的结果。 第三步:只feed x3、x4,run后得到output3的结果。 因为需要对output1进行一些操作后,作为新的输入(这里只是一个简单的例子,因为在实际中是要对output1做一些很复杂的操作,当然简单的可以在图中进行,但是复杂的操作写起来太麻烦了。)
实际情况: 运行后在第一步就会报错“Error: Tensor holds no memory. Call Tensor::mutable_data first.” 意思是定义的x3和x4也必须feed数据进去。但是一次性把x1、x2、x3、x4全部feed就成功。
但是相同的功能,在tensorflow中是可以执行的代码如下: def tf_test(): x1 = tf.placeholder(tf.float32, [None, 3, 4], "x1") x2 = tf.placeholder(tf.float32, [None, 3, 4], "x2") x3 = tf.placeholder(tf.float32, [None, 3, 4], "x3") x4 = tf.placeholder(tf.float32, [None, 3, 4], "x4") outputs1 = tf.add(x1, x2) outputs2 = tf.divide(x2, x3) outputs3 = tf.multiply(x3, x4) input_1 = np.random.random(size=(3, 3, 4)).astype("float32") input_2 = np.random.random(size=(3, 3, 4)).astype("float32") input_3 = np.random.random(size=(3, 3, 4)).astype("float32") input_4 = np.random.random(size=(3, 3, 4)).astype("float32") with tf.Session() as sess: feedDict = { x1: input_1, x2: input_2, } ox1, ox2, o1 = sess.run([x1, x2, outputs1], feedDict) print("x1", ox1) print("x2", ox2) print("o1", o1) print()
简而言之,就是在定义静态图时,feed部分数据,相应的只会进行局部运算(是否计算取决于是否有数据feed),得到局部的计算结果,而不是需要全部都要feed才会有结果。
注:我是刚开始接触paddlepaddle,不太熟悉,望回复,谢谢。