Удалите верхние N слоев из предварительно подготовленной модели и сохраните как новую модель

#tensorflow #keras

Вопрос:

Как я могу удалить определенные слои И сохранить их как новую модель в tensorflow?

У меня есть следующий код для удаления верхних слоев N в tensorflow, и он работает:

 reconstructed_model = tf.keras.models.load_model(model_path) embedding = Model(reconstructed_model.input,  reconstructed_model.layers[-4].output)  

Однако, когда я пытаюсь сохранить его любым из этих двух методов:

 tf.keras.models.save_model(model=embedding, model_path)  embedding.save(model_path)  

Я сталкиваюсь со следующей ошибкой:

 KeyError: "Failed to add concrete function 'b'__inference_model_3_layer_call_fn_286241'' to object-based SavedModel as it captures tensor lt;tf.Tensor: shape=(), dtype=resource, value=lt;Resource Tensorgt;gt; which is unsupported or not reachable from root. One reason could be that a stateful object or a variable that the function depends on is not assigned to an attribute of the serialized trackable object (see SaveTest.test_captures_unreachable_variable)."  

Предварительно подготовленная модель, которую я использую, представляет собой точно настроенный efficientnetv2 из api приложений tensorflow

 from tensorflow.keras.applications import EfficientNetB0  

и я смог сохранить и повторно использовать его здесь, просто не знаю, как сохранить измененный файл после перезагрузки.

Ответ №1:

Я попробовал использовать EfficientNetB0 и построил модель, усекающую последние четыре слоя, точно так же, как это сделали вы.

 from tensorflow.keras.applications import EfficientNetB0 import tensorflow as tf  efficientnet = EfficientNetB0( include_top=False ) embedding = tf.keras.models.Model(  efficientnet.input ,  efficientnet.layers[ -4 ].output ) embedding.summary() embedding.save( 'embedding_model.h5' )  

А затем загрузите модель, используя tf.keras.models.load_model ,

 model = tf.keras.models.load_model( 'embedding_model.h5' ) model.summary()  

Я мог бы загрузить модель без каких-либо проблем. Может быть, есть какая-то проблема с reconstructed_model этим .