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.

TypeError: No se puede capturar un resultado de un tipo no compatible tensorflow.python.keras.engine.functional.Functional

Me gustaría cargar una red preentrenada dentro de la función create_keras_model(). Por lo tanto, escribo esto:

def create_keras_model():

  baseModel = tf.keras.models.load_model(model_path, compile=False)

  headModel = baseModel.output
  model_output = tf.keras.layers.Dense(3, activation="softmax", name="output")(headModel)

  model = tf.keras.Model(inputs=baseModel.input, outputs=model_output)

  return model
def model_fn():
  keras_model = create_keras_model()
  return tff.learning.from_keras_model(keras_model, input_spec=input_spec, loss=tf.keras.losses.CategoricalCrossentropy(), metrics=[tf.keras.metrics.CategoricalAccuracy()])
@tff.tf_computation
def get_weights_from_disk():
  keras_model = create_keras_model()
  return keras_model
@tff.federated_computation
def server_init():
  # Puede haber otros estados además de los pesos que se deben devolver aquí,
  # como en la implementación de build_federated_averaging_process.
  return tff.federated_eval(get_weights_from_disk(), tff.SERVER)
old_iterproc = tff.learning.build_federated_averaging_process(model_fn=model_fn, server_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=1.0), client_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=0.001))
new_iterproc = tff.templates.IterativeProcess(initialize_fn=server_init, next_fn=old_iterproc.next)
state = new_iterproc.initialize()
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para cargar una red pre-entrenada dentro de la función create_keras_model(), puedes utilizar la función tf.keras.models.load_model() para cargar tu modelo pre-entrenado desde una ruta específica.

    def create_keras_model():
    
        baseModel = tf.keras.models.load_model(model_path, compile=False)
    
        headModel = baseModel.output
        model_output = tf.keras.layers.Dense(3, activation="softmax", name="output")(headModel)
    
        model = tf.keras.Model(inputs=baseModel.input, outputs=model_output)
    
        return model
    

    En el código anterior, model_path es la ruta de tu modelo pre-entrenado. El argumento compile=False se utiliza para asegurarse de que el modelo se cargue sin ninguna información de entrenamiento. Luego, puedes continuar definiendo la parte principal del modelo y las capas de salida como desees.

    Después de definir la función create_keras_model(), puedes utilizarla en model_fn() para crear un modelo de aprendizaje de TFF:

    def model_fn():
        keras_model = create_keras_model()
        return tff.learning.from_keras_model(keras_model, input_spec = input_spec, loss=tf.keras.losses.CategoricalCrossentropy(), metrics=[tf.keras.metrics.CategoricalAccuracy()])
    

    En el código anterior, se llama a create_keras_model() para crear el modelo de Keras, el cual se utiliza luego para crear un modelo de aprendizaje de TFF utilizando la función tff.learning.from_keras_model(). El argumento input_spec es la especificación de entrada de tu modelo, y los argumentos loss y metrics definen la función de pérdida de entrenamiento y las métricas de evaluación, respectivamente.

    Finalmente, puedes utilizar la función get_weights_from_disk() para obtener los pesos del modelo pre-entrenado e inicializar el proceso de TFF con estos pesos:

    @tff.tf_computation
    def get_weights_from_disk():
       keras_model = create_keras_model()
    
       return keras_model
    
    @tff.federated_computation
    def server_init():
      # Puede haber estado además de los pesos que necesiten ser devueltos desde aquí, como en la implementación de build_federated_averaging_process.
      return tff.federated_eval(get_weights_from_disk(), tff.SERVER)
    
    old_iterproc = tff.learning.build_federated_averaging_process(model_fn=model_fn, server_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=1.0), client_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=0.001))
    new_iterproc = tff.templates.IterativeProcess(intialize_fn=server_init,
      next_fn=old_iterproc.next)
    state = new_iterproc.initialize()
    

    En el código anterior, get_weights_from_disk() se utiliza para obtener los pesos del modelo pre-entrenado, y tff.federated_eval() se utiliza para evaluar la función en el servidor. La función server_init() se llama para retornar los pesos evaluados para ser utilizados en la inicialización del proceso de TFF.

    Ten en cuenta que el código anterior es solo un ejemplo y necesitará modificarse para adaptarse a tu caso de uso específico.

Comments are closed.