Я хочу использовать 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
в первую очередь?