Я хочу использовать 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):
?