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

Я хочу использовать scipy.optimize.fmin_l_bfgs_b для нахождения минимума функции стоимости.

Для этого я хочу создать экземпляр one_batch (код one_batch приведен ниже)в первую очередь указать серию обучающих примеров и те параметры, которые не включены в функцию потерь, но необходимы для расчета потерь.

Поскольку модуль loss_calc предназначен для возврата суммы потерь и потерьв то же время я сталкиваюсь с проблемой разделения функции потерь и функции потери на простое для scipy.optimize.fmin_l_bfgs_b.

Как видно из кода one_batch, с учетом серии примеров обучения, [loss, dloss/dParameters] будет рассчитываться параллельно для каждого из примеров.Я не хочу делать одни и те же вычисления дважды для get_loss и get_loss_prime.

Так как я могу спроектировать методы get_loss и get_loss_prime, чтобы мне нужно было выполнять только параллельноерасчет один раз?

Вот код one_batch

from calculator import loss_calc

class one_batch:

    def __init__(self, 
                 auxiliary_model_parameters, 
                 batch_example):

        # auxiliary_model_parameters are parameters need to specify 
        # the loss calculator but are not included in the loss function.

        self.auxiliary_model_parameters = auxiliary_model_parameters 
        self.batch_example = batch_example

    def parallel(self, func, args):
        pool = multiprocessing.Pool(multiprocessing.cpu_count())
        result = pool.map(func, args)
        return result 

    def one_example(self, example):
        temp_instance = loss_calc(self.auxiliary_model_parameters, 
                                  self.model_vector)
        loss, dloss = temp_instance(example).calculate()
        return [loss, dloss]

    def main(self, model_vector):
        self.model_vector = model_vector

        # model_vector and auxiliary_model_parameters are necessary 
        # for creating an instance of loss function calculator 

        result_list = parallel(self.one_example, 
                               self.batch_examples)

        # result_list is a list of sublists, each sublist is 
        # [loss, dloss/dParameter] for each training example 

   def get_loss(self):
       ?

   def get_loss_prime(self):
       ?

1 Ответ

0 голосов
/ 22 декабря 2018

Вы можете использовать целевую функцию, которая возвращает оба значения функции непосредственно в качестве входных данных для fmin_l_bfgs_b:

from scipy.optimize import fmin_l_bfgs_b
import numpy as np

def obj_fun(x):
    fx = 2*x**2 + 2*x + 1
    grad = np.array([4*x + 2])
    return fx, grad

fmin_l_bfgs_b(obj_fun, x0=[12])

(массив ([- 0,5]), массив ([0,5]), {'grad': array ([[- 3.55271368e-15]]),
'task': b'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT _ <= _ PGTOL ', <br>' funcalls ': 4,' nit ': 2, 'warnflag': 0})

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