Я пытаюсь обновить веса в своем ANN без использования встроенных оптимизаторов или потерь (у меня есть причины для этого и я могу объяснить, если это необходимо).Поскольку model.compile требует функции потерь и оптимизатора, я определяю пользовательские фиктивные потери и функции оптимизатора и использую их.Я думаю, что они не должны иметь никакого влияния на весовые коэффициенты (скажите мне, если я ошибаюсь по этому поводу).
С моей точки зрения, представляется вероятным обновить весовые коэффициенты в моих пользовательских методах слоев,но веса не обновляются вообще.
Вот минимальный рабочий пример:
from keras import backend as K
from keras.layers import Layer
class MyLayer(Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyLayer, self).__init__(**kwargs)
def build(self, input_shape):
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
super(MyLayer, self).build(input_shape) # Be sure to call this at the end
def call(self, x):
self.kernel = self.kernel * 0
return K.dot(x, self.kernel)
def compute_output_shape(self, input_shape):
return (input_shape[0], self.output_dim)
model = Sequential()
model.add(MyLayer(input_shape = (1, 1), output_dim = 1))
model.summary()
def dummy_loss(y_true, y_pred): return y_pred
class dummy_opt(keras.optimizers.Optimizer):
def __init__(self): return(None)
def get_updates(self, loss, params): return(np.array(0))
def get_configs(self): return(0)
dummyOpt = dummy_opt()
model.compile(optimizer = dummyOpt, loss = dummy_loss)
print_weights = LambdaCallback(on_epoch_end=lambda epoch, logs: print(model.layers[0].get_weights()))
model.fit(x = np.ones(10).reshape(10,1,1), y=np.zeros(10), epochs = 5, verbose = 2, callbacks = [print_weights])
Я ожидал, что веса будут равны нулю, потому что я умножил self.kernel на ноль в методе вызова моего пользовательского слоя.
Вместо этого это результат (веса не меняются)
Epoch 1/5
4s - loss: 0.0000e+00
[array([[-0.03051628]], dtype=float32)]
Epoch 2/5
0s - loss: 0.0000e+00
[array([[-0.03051628]], dtype=float32)]
Epoch 3/5
0s - loss: 0.0000e+00
[array([[-0.03051628]], dtype=float32)]
Epoch 4/5
0s - loss: 0.0000e+00
[array([[-0.03051628]], dtype=float32)]
Epoch 5/5
0s - loss: 0.0000e+00
[array([[-0.03051628]], dtype=float32)]
<keras.callbacks.History at 0x1cb0319a908>
Так почему я не могу изменить веса из метода вызова в моем пользовательском слое?