def compute_performance(prediction, target, data):  # 计算模型性能
    # 下面的try和except实际上在做这样一件事:当训练+测试模型的时候,数据肯定是经过dataloader的,所以直接赋值就可以了
    # 但是如果将训练好的模型保存下来,然后测试,那么数据就没有经过dataloader,是dataloader型的,需要转换成dataset型。
    try:
        dataset = data.dataset  # 数据为dataloader型,通过它下面的属性.dataset类变成dataset型数据
    except:
        dataset = data  # 数据为dataset型,直接赋值

    # 下面就是对预测和目标数据进行逆归一化,recover_data()函数在上一小节的数据处理中
    #  flow_norm为归一化的基,flow_norm[0]为最大值,flow_norm[1]为最小值
    # prediction.numpy()和target.numpy()是需要逆归一化的数据,转换成numpy型是因为 recover_data()函数中的数据都是numpy型,保持一致
    prediction = LoadData.recover_data(dataset.flow_norm[0],
                                       dataset.flow_norm[1],
                                       prediction.numpy())
    target = LoadData.recover_data(dataset.flow_norm[0], dataset.flow_norm[1],
                                   target.numpy())

    # 对三种评价指标写了一个类,这个类封装在另一个文件中,在后面
    mae, mape, rmse = Evaluation.total(
        target.reshape(-1), prediction.reshape(-1))  # 变成常向量才能计算这三种指标

    performance = [mae, mape, rmse]
    recovered_data = [prediction, target]

    return performance, recovered_data  # 返回评价结果,以及恢复好的数据(为可视化准备的)
def compute_performance(prediction, target, data):
    try:
        dataset = data.dataset  # dataloader
    except:
        dataset = data  # dataset

    prediction = LoadData.recover_data(dataset.flow_norm[0],
                                       dataset.flow_norm[1],
                                       prediction.numpy())
    target = LoadData.recover_data(dataset.flow_norm[0], dataset.flow_norm[1],
                                   target.numpy())

    mae, mape, rmse = Evaluation.total(target.reshape(-1),
                                       prediction.reshape(-1))

    performance = [mae, mape, rmse]
    recovered_data = [prediction, target]

    return performance, recovered_data