【问题标题】:Python: 'numpy.float64' object is not callablePython:“numpy.float64”对象不可调用
【发布时间】:2020-10-03 21:26:24
【问题描述】:

下面的代码在 last_mae = mae(val_scaled_price_client, cv_model) 处抛出错误 'numpy.float64' object is not callable。然而,具有相同参数的 mae 函数在循环外使用时工作得很好。

loss_history = [1000.00]

for i in range(10000):

  # train
  iterations = 10

  train_auto_encoder(train_latent_customers=train_latentvars,
                   train_product_customers=train_scaled_price_client,
                   auto_encoder=auto_model,
                   iters=iterations,                              
                   batch_size=128,
                   display_step=20)                                  

  cv_model = auto_model.predict([val_latentvars, val_scaled_price_client_corrupted])
  last_mae = mae(val_scaled_price_client, cv_model)          
  loss_history.append(last_mae)

  if loss_history[-1] < loss_history[-2]:
    iterations += 10

  else:
    break

我在前面的单元格中声明了一个函数 mae,如下所示

# define function to calculate MAE between true and reconstructed values
def mae(y_true, y_pred):

    # get non-zero positions
    cond = np.not_equal(y_true, 0)
    # get number of non-zero elements
    num_non_zero = np.sum(cond)
    # initialize zer matrix
    zero_matrix = np.zeros(shape=y_true.shape)
    # replace 
    predictions_corrected = np.where(cond, y_pred, zero_matrix)
    # get rmse
    mae = np.sum(np.abs(y_true - predictions_corrected)) / num_non_zero
    # return
    return(mae)

【问题讨论】:

  • 看来问题是由于类型转换错误。您将 loss_history 声明为浮点数是否有特定原因。
  • mae 是一个数字,您可以将其用作函数。很可能您无意中用数字覆盖了 mae 的函数定义。
  • 我将 loss_history 声明为浮点数的原因只是因为 mae 函数返回一个浮点数,我认为这可能是问题所在。 @Stef,我编辑了这篇文章,因为我之前确实定义了一个 mae 函数。
  • 正如我所说:你在mae = np.sum(np.abs(y_true - predictions_corrected)) / num_non_zero 中重新定义了mae。将此更改为return np.sum(np.abs(y_true - predictions_corrected)) / num_non_zero,一切都会好起来的:)
  • 确实,这解决了问题!非常感谢!

标签: python numpy for-loop


【解决方案1】:

问题出在您的mae 函数中。在最后一行中,您使用数字覆盖 mae 的函数定义。如果您在一切正常后调用此函数。一旦你再次调用它(就像在循环中一样),你尝试调用一个数字而不是一个函数,这是不可能的。

只是改变

mae = np.sum(np.abs(y_true - predictions_corrected)) / num_non_zero
# return
return(mae)

return np.sum(np.abs(y_true - predictions_corrected)) / num_non_zero

Python 不是 Basic 或 Fortran,您将结果分配给函数名称以返回它:)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2021-05-24
    • 2021-01-27
    • 1970-01-01
    • 2017-06-22
    相关资源
    最近更新 更多