es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Es posible implementar una capa keras que siempre propague un vector fijo a las otras capas?

Estoy tratando de desarrollar una arquitectura de red neuronal que tenga dos entradas. Sin embargo, me gustaría fijar una de estas entradas vectoriales durante el entrenamiento. Sé que esto parece ser un sinsentido para la mayoría de ustedes, pero me gustaría saber cómo hacerlo para probar una hipótesis.

Es evidente que una forma de hacer esto sería preparar un conjunto de datos donde simplemente repita el valor fijo en todas las instancias que desee. Sin embargo, esto parece ser una mala solución.

Me gustaría saber si es posible implementar una capa de Keras que reciba un vector como parámetro fijo y siempre lo propague a las capas siguientes en cada paso de entrenamiento, mientras la otra entrada varíe. Estoy representando la idea en la imagen adjunta.
imagen enlace

¿Es posible hacer eso?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible implementar una capa de Keras que reciba un vector como un parámetro fijo y siempre lo propague a las capas siguientes durante el entrenamiento. Esto se puede lograr creando una capa personalizada en Keras que reciba dos entradas: una para la entrada variable y otra para la entrada fija. Durante el entrenamiento, la capa solo pasará la entrada variable a las capas siguientes e ignorará la entrada fija.

    Aquí tienes un ejemplo de implementación de tal capa personalizada:

    import tensorflow as tf
    from keras.layers import Layer
    
    class FixedInputLayer(Layer):
        def __init__(self, fixed_input, **kwargs):
            self.fixed_input = tf.constant(fixed_input, dtype=tf.float32)
            super(FixedInputLayer, self).__init__(**kwargs)
    
        def call(self, inputs):
            return inputs[0]
    
        def compute_output_shape(self, input_shape):
            return input_shape[0]
    
        def get_config(self):
            base_config = super(FixedInputLayer, self).get_config()
            base_config['fixed_input'] = self.fixed_input.numpy()
            return base_config
    
        @classmethod
        def from_config(cls, config):
            fixed_input = config.pop('fixed_input')
            return cls(fixed_input=fixed_input, **config)
    

    La capa recibe un parámetro fixed_input durante la inicialización y lo almacena como un tensor constante. En el método call, la capa solo devuelve la primera entrada (es decir, la entrada variable) e ignora la segunda entrada (es decir, la entrada fija). El método compute_output_shape simplemente devuelve la forma de la entrada variable.

    Para utilizar esta capa en la arquitectura de tu red neuronal, simplemente la insertas después de tu entrada fija y antes de tu entrada variable, de la siguiente manera:

    from keras.layers import Input, Dense, concatenate
    
    fixed_input = Input(shape=(1,))
    fixed_input_layer = FixedInputLayer(fixed_input)
    
    variable_input = Input(shape=(3,))
    hidden_layer = Dense(10)(variable_input)
    output_layer = Dense(1)(hidden_layer)
    
    model = Model(inputs=[fixed_input, variable_input], outputs=output_layer)
    

    Luego puedes entrenar tu modelo utilizando la entrada variable mientras mantienes la entrada fija.

Comments are closed.