Paddle Program.Clone预测的结果为何不一致?

g52tjvyc  于 2022-10-20  发布在  其他
关注(0)|答案(6)|浏览(175)

代码如下:
(代码文件
test3.zip

`fromfutureimport print_function
import paddle.fluid as fluid
import numpy

def model(x):
f1 = fluid.layers.fc(input=x, size=20, act="tanh")
x_predict = fluid.layers.fc(input=f1, size=1)
return x_predict

train_program = fluid.Program()
with fluid.program_guard(train_program):
x = fluid.layers.data(name='x', shape=[6], dtype='float32')
y = fluid.layers.data(name='y', shape=[1], dtype='float32')
x_predict = model(x)
kl = fluid.layers.fill_constant(shape=[1],value=0.2,dtype="float32")
y_predict = x_predict + kl
cost = fluid.layers.square_error_cost(input=y_predict, label=y)
avg_loss = fluid.layers.mean(cost)
sgd_optimizer = fluid.optimizer.AdamOptimizer(0.0001)
sgd_optimizer.minimize(avg_loss)

test_program1 = train_program.clone(for_test=True)

place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())

x_data_train = numpy.array([[-0.329, 0.320, -0.049, -0.398, 0.048, 0.428],
[-0.520, 0.320, -0.049, -0.224, 0.048, 0.428],
[0.244, -0.451, 0.0492, -0.224, 0.048, 0.428],
[-0.520, 0.320, -0.0492, -0.224, 0.048, 0.428],
[0.244, -0.451, -0.049, -0.224, 0.048, 0.428],
[0.244, -0.451, -0.049, -0.224, 0.048, 0.428],
[0.244, -0.451, -0.049, -0.224, 0.048, 0.428],
[0.244, -0.451, -0.049, -0.224, 0.048, 0.428],
[-0.520, 0.320, -0.049, -0.224, 0.048, 0.428]], dtype="float32")
y_data_train = numpy.array([0.103, 0.026, 0.422, 0.026, 0.422, 0.422, 0.422, 0.422, 0.026], dtype="float32")

for i in range(20):
avg_loss_value, = exe.run(train_program,
feed={"x":x_data_train[:6], "y":y_data_train[:6]},
fetch_list=[avg_loss])
print("Epoc %d, Cost %f" % (i, avg_loss_value[0]))
print ("real data:",y_data_train[7:])

def test0():
y_test, = exe.run(train_program,
feed={"x":x_data_train[7:], "y":y_data_train[7:]},
fetch_list=[y_predict])
print("original program test:",y_test)
def test1():
y_test, = exe.run(test_program1,
feed={"x":x_data_train[7:], "y":y_data_train[7:]},
fetch_list=[y_predict])
print("clone program1 test:",y_test)

test0()
test1()`
运行结果:
Epoc 0, Cost 0.096136
Epoc 1, Cost 0.095503
Epoc 2, Cost 0.094874
Epoc 3, Cost 0.094248
Epoc 4, Cost 0.093626
Epoc 5, Cost 0.093008
Epoc 6, Cost 0.092394
Epoc 7, Cost 0.091783
Epoc 8, Cost 0.091176
Epoc 9, Cost 0.090574
Epoc 10, Cost 0.089975
Epoc 11, Cost 0.089380
Epoc 12, Cost 0.088790
Epoc 13, Cost 0.088203
Epoc 14, Cost 0.087621
Epoc 15, Cost 0.087043
Epoc 16, Cost 0.086469
Epoc 17, Cost 0.085899
Epoc 18, Cost 0.085334
Epoc 19, Cost 0.084773
real data: [0.422 0.026]

original program test: [[0.5491056 ]
[0.34420392]]
clone program1 test: [[0.547488 ]
[0.3434821]]
为什么clone program的结果和original program的结果会有些差距呢?

m4pnthwp

m4pnthwp1#

参考这个文档:https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/Program_cn.html#program . 当for_test=True时, 会裁剪网络 不会进行优化。

bt1cpqcv

bt1cpqcv2#

那用clone program的是正确的预测结果吗?

mlmc2os5

mlmc2os53#

看起来没什么问题 可以根据文档 先clone 再optimize测试下

htzpubme

htzpubme4#

谢谢您的解答,文档我看了。我的疑问主要在于模型预测上。对同一个模型,用不同的program做预测,得到不同的结果,哪个是对的我不懂?我想知道哪个program预测的结果是对的?

vptzau2j

vptzau2j5#

看代码原始program添加了优化器进行了优化操作。请确认是否第一个结果是训练得到的指标

gpnt7bae

gpnt7bae6#

是的,第一个结果是训练(的program)得到的指标(y值)。原始program是训练program,它是添加了优化器的。
从原始program中clone一个测试program。在测试时,用这两个program(一个是原始的,一个是clone的)来做预测,这两个program的fetchlist是同一个变量,即y_predict,然而,它们得到不同的预测的y值。
原始program中有优化器,您的意思是因为优化器的缘故而预测值发生偏差吗?
但是我的理解是,在y_test, = exe.run(train_program, feed={"x":x_data_train[7:], "y":y_data_train[7:]}, fetch_list=[y_predict])这个语句中,虽然是做了一次优化,但是在这个优化过程中首先要经过前向计算,获得y_predict,然后再算误差再进行优化,而我在这条语句中fetch_list=[y_predict],即我在前向计算完之后就取出y_predict值,因此这个值和反向传播过程没有关系吧,所以我认为优化过程不会影响用train_program来获取y_predict值,然而实际得到的(和clone program相比,没有优化过程的)却是不一样的。所以,不理解。求教~~~

相关问题