keras реализация алгоритма оптимизации Левенберга-Марквардта в качестве пользовательского оптимизатора
Я пытаюсь реализовать алгоритм Левенберга-Марквардта как оптимизатор Keras, как было описано здесь, но у меня есть несколько проблем, самая большая из которых связана с этой ошибкой
TypeError: Tensor objects are not iterable when eager execution is not enabled. To iterate over this tensor use tf.map_fn.
После быстрого поиска я обнаружил, что это связано с тем, как тензор потока запускает программы с графиками, которые я не понимаю в деталях. Я нашел этот ответ полезным из SO, но он касается функции потерь, а не оптимизатора.
Так к делу.
Моя попытка выглядит так:
from keras.optimizers import Optimizer
from keras.legacy import interfaces
from keras import backend as K
class Leveberg_Marquardt(Optimizer):
def __init__(self, tau =1e-2 , lambda_1=1e-5, lambda_2=1e+2, **kwargs):
super(Leveberg_Marquardt, self).__init__(**kwargs)
with K.name_scope(self.__class__.__name__):
self.iterations = K.variable(0, dtype='int64', name='iterations')
self.tau = K.variable(tau,name ='tau')
self.lambda_1 = K.variable(lambda_1,name='lambda_1')
self.lambda_2 = K.variable(lambda_2,name='lambda_2')
@interfaces.legacy_get_updates_support
def get_updates(self, loss, params):
grads = self.get_gradients(loss,params)
self.updates = [K.update_add(self.iterations,1)]
error = [K.int_shape(m) for m in loss]
for p,g,err in zip(params,grads,error):
H = K.dot(g, K.transpose(g)) + self.tau * K.eye(K.max(g))
w = p - K.pow(H,-1) * K.dot(K.transpose(g),err) #ended at step 3 from http://mads.lanl.gov/presentations/Leif_LM_presentation_m.pdf
if self.tau > self.lambda_2:
w = w - 1/self.tau * err
if self.tau < self.lambda_1:
w = w - K.pow(H,-1) * err
# Apply constraints.
if getattr(p, 'constraint', None) is not None:
w = p.constraint(w)
self.updates.append(K.update_add(err, w))
return self.updates
def get_config(self):
config = {'tau':float(K.get_value(self.tau)),
'lambda_1':float(K.get_value(self.lambda_1)),
'lambda_2':float(K.get_value(self.lambda_2)),}
base_config = super(Leveberg_Marquardt, self).get_config()
return dict(list(base_config.items()) + list(config.items()))
В1 Могу ли я исправить эту ошибку, не углубляясь в тензорный поток (хотелось бы сделать это, оставаясь на уровне Кераса)
Q2 Правильно ли я использую keras backend?
Я имею в виду, в этой строке
H = K.dot(g, K.transpose(g)) + self.tau * K.eye(K.max(g))
Я должен использовать бэкэнд-функцию keras, или numpy или чистый python, чтобы запустить этот код без проблем, чтобы входные данные были numy массивами?
Q3 Этот вопрос больше о самом алгоритме.
Я даже правильно внедряю LMA? Должен сказать, я не уверен, как бороться с граничными условиями, значениями тау / лямбда, которые я догадался, может быть, вы знаете лучший способ?
Я пытался понять, как работает любой другой оптимизатор в keras, но даже код SGD мне кажется неоднозначным.
Q4 Нужно ли каким-либо образом изменять локальный файл optimizers.py?
Чтобы запустить его правильно, я инициализировал свой оптимизатор с помощью:
myOpt = Leveberg_Marquardt()
а затем просто передать его в метод complie. Тем не менее, после быстрого просмотра исходного кода optimizers.py я обнаружил, что в коде есть места с полными именами оптимизаторов (например, функция десериализации). Важно ли расширить это для моего пользовательского оптимизатора, или я могу оставить это?
Буду очень признателен за любую помощь и направление будущих действий.
1 ответ
В1 Могу ли я исправить эту ошибку, не углубляясь в тензорный поток (хотелось бы сделать это, оставаясь на уровне Кераса)
A1 Я верю, что даже если эта ошибка исправлена, в реализации алгоритма все еще есть проблемы, которые keras не поддерживает, например, термин ошибки f(x;w_0)-y
из документа не доступен оптимизатор keras.
Q2 Правильно ли я использую keras backend?
A2 Да, вы должны использовать keras для этого расчета, потому что g
является тензорным объектом, а не пустым массивом. Тем не менее, я считаю правильный расчет для H
должно быть H = K.dot(K.transpose(g), g)
взять вектор Nx1 g и выполнить внешнее произведение для получения матрицы NxN.
Q3 Этот вопрос больше о самом алгоритме.
A3 Как указано в A1, я не уверен, что keras поддерживает необходимые входные данные для этого алгоритма.
Q4 Нужно ли каким-либо образом изменять локальный файл optimizers.py?
A4 Предоставленная строка кода запустит оптимизатор, если он будет предоставлен в качестве аргумента оптимизатора функции компиляции модели keras. Библиотека keras для удобства поддерживает вызов встроенных классов и функций по имени.