Я хотел бы попросить вас помочь в создании моего пользовательского слоя. То, что я пытаюсь сделать, на самом деле довольно простое: создание выходного слоя с переменными с сохранением состояния, то есть тензорами, значение которых обновляется при каждой партии.
Чтобы все было понятнее, вот отрывок того, что я хотел бы сделать:
def call(self, inputs)
c = self.constant
m = self.extra_constant
update = inputs*m + c
X_new = self.X_old + update
outputs = X_new
self.X_old = X_new
return outputs
Идея здесь довольно проста:
X_old
инициализируется значением 0 вdef__ init__(self, ...)
update
вычисляется как функция входов в слой- вычисляется выход слоя (т.е.
X_new
) - значение
X_old
устанавливается равнымX_new
, так что в следующем пакетеX_old
больше не равно нулю, а равноX_new
из предыдущего пакета.
Я обнаружил, что K.update
выполняет свою работу, как показано в примере:
X_new = K.update(self.X_old, self.X_old + update)
Проблема здесь в том, что, если я попытаюсь определить выходы слоя как:
outputs = X_new
return outputs
Когда я попробую model.fit (), я получу следующую ошибку:
ValueError: An operation has `None` for gradient. Please make sure that all of your ops have
gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.
И у меня все еще возникает эта ошибка, хотя я ввел layer.trainable = False
и не определил смещение или веса для слоя. С другой стороны, если я просто сделаю self.X_old = X_new
, значение X_old
не обновится.
У вас, ребята, есть решение для этого? Я считаю, что это не должно быть так сложно, поскольку RNN с отслеживанием состояния также имеют «похожее» функционирование.
Заранее спасибо за помощь!