Когда SciPy.optimize.fmin_l_bfgs_b будет оценивать простую сумму потерь? - PullRequest
0 голосов
/ 22 декабря 2018

Я хочу использовать SciPy.optimize.fmin_l_bfgs_b, чтобы минимизировать функцию потерь.Поскольку loss_calculator в моем коде рассчитан на возврат loss и loss_prime за один прогон и выполнение одной оценки дорого, я должен «обмануть» оптимизатор таким образом:

import numpy as np
from scipy.optimize import fmin_l_bfgs_b as optimizer

x_true = np.arange(0,10,0.1)
m_true = 2.5
b_true = 1.0
y_true = m_true*x_true + b_true

class test:
    def __init__(self, x_true, y_true):
        self.x_true = x_true
        self.y_true = y_true

    def func(self, params):
        x = self.x_true
        y = self.y_true
        m, b = params
        y_model = m*x+b
        error = y-y_model
        self.loss = sum(error**2)
        temp_dm = sum(2*x*(m*x+b-y))
        temp_db = sum(2*(m*x+b-y))
        self.dloss = np.asarray([temp_dm, temp_db])

    def get_loss(self, params):
        self.params = params
        self.func(params)
        return self.loss

    def get_dloss(self, params):
        assert (self.params == params).all()
        return self.dloss

temp_instance = test(x_true, y_true)
initial_values = np.array([1.0, 0.0])
x = optimizer(temp_instance.get_loss, initial_values, temp_instance.get_dloss)

Это всего лишь игрушечный код, демонстрирующий мою идею.Как вы можете видеть, метод get_dloss по сути ничего не делает, loss_prime был вычислен, когда мы вызываем get_loss.

Этот код игрушки работает для этого примера игрушки, но я не уверен,это реально в реальной реализации.

Меня беспокоит, будет ли SciPy.optimize.fmin_l_bfgs_b оценивать loss_prime в первую очередь?

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