Проблемы с пользовательским счетчиком - PullRequest
0 голосов
/ 17 июня 2019

Я провожу некоторые онлайн-уроки по машинному обучению, и мы используем следующую функцию оценки в наших моделях DNN для регрессии:

    def r_squared(y_true, y_pred):
        # 1 - ((y_i - y_hat_i)^2 / (y_i - y_sum)^2)

        numerator = tf.reduce_sum(tf.square(tf.subtract(y_true, y_pred)))
        denominator = tf.reduce_sum(tf.square(tf.subtract(y_pred, tf.reduce_mean(y_true))))
        r2 = tf.clip_by_value(tf.subtract(1.0, tf.div(numerator, denominator)), clip_value_min = 0.0, clip_value_max = 1.0)

        return r2

... later ...

        model.compile(loss = "mse", # mean-square-error,
                    optimizer = optimizer(lr = learning_rate),
                    metrics = [r_squared])

Теперь, когда модель и все работает, я хотел провестиgridsearch для определения наилучших параметров для моей модели.Однако при попытке использовать функцию r_squared с gridsearch в качестве оценщика, я получаю несколько ошибок:


        grid = GridSearchCV(estimator = estimator, 
                            param_grid = param_grid,
                            n_jobs = 1,
                            verbose = 1,
                            cv = folds,
                            scoring = make_scorer(FeedForward.r_squared, greater_is_better=True))

приводит к:

TypeError: Input 'y' of 'Sub' Op has type float64 that does not match type float32 of argument 'x'.

где-то здесь:

r2 = tf.clip_by_value(tf.subtract(1.0, tf.div(numerator, denominator)), clip_value_min = 0.0, clip_value_max = 1.0)

Таким образом, я изменил строку следующим образом:

r2 = tf.clip_by_value(tf.subtract(1.0, tf.div(tf.cast(numerator, tf.float32), tf.cast(denominator, tf.float32))), clip_value_min = 0.0, clip_value_max = 1.0)

, что затем приводит к:

ValueError: scoring must return a number, got Tensor("mul:0", shape=(), dtype=float32) (<class 'tensorflow.python.framework.ops.Tensor'>) instead. (scorer=score)

Хотя я понимаю ошибку и могу подтвердить ее в отладчике,Я не могу решить проблему даже с поиском ошибки.Что может быть из-за того, что нет необходимости упоминать, что он еще недостаточно знаком с тензорным потоком.

Так как же получить значение из тензора?И я здесь даже правильно поступаю или что-то не так?

1 Ответ

0 голосов
/ 17 июня 2019

Проблема заключается в смешении использования TensorFlow / Keras и scikit-learn. Метрика Keras должна быть реализована с использованием функций keras.backend, но функции scikit-learn не являются символическими и должны быть реализованы с использованием numpy.

К счастью, в scikit-learn реализована оценка R ^ 2 как sklearn.metrics.r2_score, поэтому вы можете использовать ее следующим образом:

from sklearn.metrics import r2_score

grid = GridSearchCV(estimator = estimator, 
                            param_grid = param_grid,
                            n_jobs = 1,
                            verbose = 1,
                            cv = folds,
                            scoring = make_scorer(r2_score, greater_is_better=True))

Ваша метрика Keras не нуждается в изменениях, немного странно, что вам нужно сохранить две реализации метрики, но это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...