Могу ли я настроить вес подключений внутри пользовательского слоя в Keras? - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь обновить веса в своем 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>

Так почему я не могу изменить веса из метода вызова в моем пользовательском слое?

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