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