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.

¿Cómo convertir la salida de capa promedio para enviarla a una capa Conv2D en Keras?

Estoy intentando construir una CNN personalizada utilizando la API funcional de Keras. El problema con mi idea teórica y práctica es que cuando trato de obtener el promedio de la salida de tres capas Conv2D y pasarla a otra Conv2D, recibo un error que dice que la salida de Average es tf.float, mientras que Conv2D (que es la primera capa de convolución de VGG16, porque estoy haciendo transferencia de aprendizaje) espera recibir un tf.int32.

Estoy recibiendo el siguiente error: **TypeError: Expected int32, got 0.0 of type 'float' instead.

Notas:
1. He intentado Maximum y Minimum como prueba solamente y aún así recibo el mismo error.
2. Lamentablemente, no puedo compartir el código debido a un NDA.

Aquí hay un fragmento de código:

self._layer_hs_o = Average(name=”heads”)(
[self._layer_hs_s, self._layer_hs_m, self._layer_hs_l])

Tratando de pasar la salida promedio a la siguiente capa Conv2D

self._layer_d2c_c = Conv2D(d2c_config[“filters”],
d2c_config[“kernels”][0],
padding=”same”,
activation=d2c_config[“activation”],
name=”d2c_c”,
kernel_initializer=d2c_config[“init”],
input_shape=self._layer_hs_o.shape,
dilation_rate=d2c_config[“dilations”][0]
)(self._layer_hs_o)

En este momento el modelo no puede ser compilado debido a este paso. Cuando lo omito para solo realizar las convoluciones normales, se compila y el aprendizaje ocurre normalmente. Sin embargo, necesito utilizar la capa Average en cierto grado.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema aquí es que la salida de la capa Average es del tipo de dato float, mientras que la capa Conv2D espera una entrada del tipo de dato int32. Para solucionar este problema, puedes intentar convertir la salida de la capa Average a int32. Aquí tienes un fragmento de código actualizado:

    from tensorflow.keras import backend as K
    
    self._layer_hs_o = Average(name="heads")(
          [self._layer_hs_s, self._layer_hs_m, self._layer_hs_l])
    # Convierte la salida a int32
    self._layer_hs_o = K.cast(self._layer_hs_o, 'int32')
    # Pasa la salida actualizada a la siguiente capa Conv2D
    self._layer_d2c_c = Conv2D(d2c_config["filters"], 
          d2c_config["kernels"][0], 
          padding="same",
          activation=d2c_config["activation"], 
          name="d2c_c",
          kernel_initializer=d2c_config["init"],
          input_shape=self._layer_hs_o.shape,
          dilation_rate=d2c_config["dilations"][0]
        )(self._layer_hs_o)
    

    Al convertir la salida de la capa Average a int32, aseguramos que la entrada a la capa Conv2D también sea del tipo de dato esperado. Esto debería solucionar el error TypeError y permitir compilar el modelo con éxito.

Comments are closed.