我正在使用Firebase对我的模型进行预测。通过将事件处理程序传递给FirebaseModelInterpreter可获得结果。事件处理程序之一用于成功案例,另一个用于失败案例。我创建了一个内部类来充当事件处理程序,并且它还具有一个私有字段来存储预测结果。当我在事件处理程序方法中将结果打印到控制台时,没有问题,但是当我尝试在结果更改之外获取此结果时。我不明白为什么。这是我的代码:
// Listener for getting prediction
class OnSuccess implements OnSuccessListener<FirebaseModelOutputs>{
private int prediction;
@Override
public void onSuccess(FirebaseModelOutputs result){
float[][] output = result.getOutput(0);
float[] probabilities = output[0];
//find predicted label
int argmax = 0;
for (int i = 1; i < probabilities.length; i++){
if(probabilities[i] > probabilities[argmax])
argmax = i;
}
System.out.println("Argmax is:" + argmax);
this.prediction = argmax;
System.out.println("After setting value:" + getPrediction());
}
public int getPrediction(){
return prediction;
}
}
OnSuccessListener<FirebaseModelOutputs> onSuccessEventHandler = new OnSuccess();
modelInterpreter.run(inputs, inputOutputOptions)
.addOnSuccessListener(onSuccessEventHandler)
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
System.out.println("Error during prediction");
}
}
);
int prediction = ((OnSuccess) onSuccessEventHandler).getPrediction();
System.out.println("Before returning prediction is:"+prediction);
return prediction;
答案 0 :(得分:1)
您现在无法返回尚未加载的内容。换句话说,您不能简单地作为方法的结果返回prediction
整数,也不能简单地在onSuccess()
方法之外使用它,因为由于该方法的异步行为,它将始终具有初始值。这意味着,当您尝试返回该结果或在回调之外使用它时,预测尚未完成工作,这就是无法访问的原因。
此问题的快速解决方案是仅在prediction
方法内使用onSuccess()
整数,否则我建议您从此 {{3} } ,其中我解释了如何使用自定义回调来完成。您也可以查看此 post 以获得更好的理解。两种资源都用于Firebase实时数据库,但是在您的情况下适用相同的规则。