Приведенный ниже код выдает ошибку объект 'numpy.float64' не может быть вызван в last_mae = mae (val_scaled_price_client, cv_model) . Тем не менее, функция 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)
0
Nele 14 Июн 2020 в 14:16

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, где вы назначаете результат имени функции, чтобы вернуть его :).

0
Stef 14 Июн 2020 в 12:08