#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
этим .