infer输出的layer output顺序不符合预期
Created by: prm10
做检索排序任务,需要衡量两个doc与query的相关性,并计算pairwise loss,模型相关部分如下:
sim_1 = paddle.layer.cos_sim(a=query_vector, b=title_1_vector, name='cosine_1')
sim_2 = paddle.layer.cos_sim(a=query_vector, b=title_2_vector, name='cosine_2')
cost = paddle.layer.rank_cost(
left=sim_1,
right=sim_2,
label=label_data,
)
模型能够完成训练,并在每轮训练中输出event结果。 保存模型后,在第2阶段载入模型,进行infer,相关代码如下:
infer = paddle.inference.Inference(output_layer=[cost, sim_1, sim_2], parameters=parameters)
for item in train_reader():
item = list(item)
infer_data = [item[0:4]]
# infer_data=[[[2, 3], [1, 2, 3], [1, 2, 3], 0]]
output = infer.infer(
input=infer_data, feeding=feeding, field=["value"],
# flatten_result=False,
)
cost = output[0][0]
s1 = output[1][0]
s2 = output[2][0]
label = item[3]
result = ((s1 - s2) > 0) == label
print '%.4f\t%.4f\t%.4f\t%d\t%d' % (cost, s1, s2, label, result)
输出的部分预测结果如下:
-0.4013 -0.0975 0.5527 0 1
-0.0975 -0.1557 0.6645 1 0
-0.1552 -0.4013 0.5777 1 0
-0.1557 -0.1552 0.6929 0 1
-0.4013 -0.2339 0.6129 0 1
-0.1557 -0.2339 0.7330 0 1
-0.2383 -0.4128 0.6097 1 0
rank_cost函数的定义在document中定义如下(经典的cross entropy pairwise loss):
C_{i,j} & = -\\tilde{P_{ij}} * o_{i,j} + log(1 + e^{o_{i,j}})
得到的rank_cost输出结果不符合预期:
- 预测错误时(result=0),loss不应该为负数;
- 在其他case中,预测正确了(result=1),loss为正数时,也与上述公式的计算结果不同。