Pesos del decodificador de Autoencoder con pesos atados en Keras

He implementado un codificador automático de pesos atados en Keras y lo he entrenado con éxito.

Mi objetivo es usar solo la parte del decodificador del codificador automático como la última capa de otra red, para ajustar tanto la red como el decodificador.

La cosa es que, como puede ver a continuación en el resumen, el decodificador no tiene parámetros con mi implementación de pesos vinculados, por lo que no hay nada que ajustar. (decoder.get_weights() devoluciones[])

Mi pregunta es: ¿Debería cambiar la implementación de los pesos atados, de modo que la capa atada pueda contener pesos, es decir, los pesos transpuestos del codificador? Si es así, ¿cómo?

¿O simplemente estoy lejos?

A continuación se muestra el resumen del modelo de codificador automático, así como la clase de la capa densa atada (ligeramente modificada dehttps://github.com/nanopony/keras-convautoencoder/blob/master/autoencoder_layers.py.)

Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
encoded (Dense)                  (None, Enc_dim)          33000       dense_input_1[0][0]              
____________________________________________________________________________________________________
tieddense_1 (TiedtDense)          (None, Out_Dim)            0           encoded[0][0]                    
====================================================================================================
Total params: 33,000
Trainable params: 33,000
Non-trainable params: 0
________________________________________________________________________


class TiedtDense(Dense):
def __init__(self, output_dim, master_layer, init='glorot_uniform', activation='linear', weights=None,
             W_regularizer=None, b_regularizer=None, activity_regularizer=None,
             W_constraint=None, b_constraint=None, input_dim=None, **kwargs):
    self.master_layer = master_layer
    super(TiedtDense, self).__init__(output_dim, **kwargs)

def build(self, input_shape):
    assert len(input_shape) >= 2
    input_dim = input_shape[-1]
    self.input_dim = input_dim


    self.W = tf.transpose(self.master_layer.W)
    self.b = K.zeros((self.output_dim,))
    self.params = [self.b]
    self.regularizers = []
    if self.W_regularizer:
        self.W_regularizer.set_param(self.W)
        self.regularizers.append(self.W_regularizer)

    if self.b_regularizer:
        self.b_regularizer.set_param(self.b)
        self.regularizers.append(self.b_regularizer)

    if self.activity_regularizer:
        self.activity_regularizer.set_layer(self)
        self.regularizers.append(self.activity_regularizer)

    if self.initial_weights is not None:
        self.set_weights(self.initial_weights)
        del self.initial_weights

Respuestas a la pregunta(0)

Su respuesta a la pregunta