Pesos de decodificador de Autoencoder con pesas atadas en Keras

He implementado un Auto-encoder de pesos vinculados en Keras y lo he entrenado con éxito.

Mi objective es usar solo la parte del decodificador del Auto-codificador como la última capa de otra red, para ajustar tanto la red como el decodificador.

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() devuelve [] )

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

¿O simplemente estoy lejos?

A continuación se muestra el resumen del modelo de autocodificador, así como la clase de la capa densa atada (ligeramente modificada de https://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