【发布时间】: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,一切都会好起来的:) -
确实,这解决了问题!非常感谢!