Keras Sequential添加hub.KerasLayer报错,求不换版本的替代方案
问题描述
尝试将TF Hub上的MobileNetV2模型封装为Keras Layer并加入Sequential模型时,持续报错:Only instances of keras.Layer can be added to a Sequential model,不想更换TensorFlow/Keras版本,寻求替代方案。
使用代码:
mobilenet_v2 ="https://tfhub.dev/google/tf2-preview/mobilenet_v2/classification/4" classifier_model = mobilenet_v2 IMAGE_SHAPE = (224, 224) classifier = tf.keras.Sequential([ hub.KerasLayer(classifier_model, input_shape=IMAGE_SHAPE+(3,)) ])
完整报错信息:
ValueError Traceback (most recent call last) Cell In[8], line 3 1 IMAGE_SHAPE = (224, 224) ----> 3 classifier = tf.keras.Sequential([ 4 hub.KerasLayer(classifier_model, input_shape=IMAGE_SHAPE+(3,)) 5 ]) File ~\Desktop\TFproj\tfvenv\Lib\site-packages\keras\src\models\sequential.py:73, in Sequential.__init__(self, layers, trainable, name) 71 if layers: 72 for layer in layers: ---> 73 self.add(layer, rebuild=False) 74 self._maybe_rebuild() File ~\Desktop\TFproj\tfvenv\Lib\site-packages\keras\src\models\sequential.py:95, in Sequential.add(self, layer, rebuild) 93 layer = origin_layer 94 if not isinstance(layer, Layer): ---> 95 raise ValueError( 96 "Only instances of `keras.Layer` can be " 97 f"added to a Sequential model. Received: {layer} " 98 f"(of type {type(layer)})" 99 ) 100 if not self._is_layer_name_unique(layer): 101 raise ValueError( 102 "All layers added to a Sequential model " 103 f"should have unique names. Name '{layer.name}' is already " 104 "the name of a layer in this model. Update the `name` argument " 105 "to pass a unique name." 106 ) ValueError: Only instances of `keras.Layer` can be added to a Sequential model. Received: <tensorflow_hub.keras_layer.KerasLayer object at 0x0000021DD8434FB0> (of type <class 'tensorflow_hub.keras_layer.KerasLayer'>)
替代解决方案
问题根源是当前环境中tensorflow_hub.KerasLayer与Keras原生Layer类的继承关系不被Sequential模型的类型检查认可,以下两种方法无需更换版本即可解决:
方法1:自定义Keras Layer包装TF Hub模型
手动实现一个继承自tf.keras.layers.Layer的包装类,内部调用TF Hub的模型,绕过类型检查:
import tensorflow as tf import tensorflow_hub as hub mobilenet_v2 = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/classification/4" IMAGE_SHAPE = (224, 224) class HubWrapperLayer(tf.keras.layers.Layer): def __init__(self, hub_model_url, **kwargs): super().__init__(**kwargs) self.hub_layer = hub.KerasLayer(hub_model_url) def call(self, inputs): return self.hub_layer(inputs) # 构建Sequential模型 classifier = tf.keras.Sequential([ HubWrapperLayer(mobilenet_v2, input_shape=IMAGE_SHAPE+(3,)) ])
方法2:使用函数式API替代Sequential模型
直接用Keras函数式API构建模型,避开Sequential的类型检查限制:
import tensorflow as tf import tensorflow_hub as hub mobilenet_v2 = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/classification/4" IMAGE_SHAPE = (224, 224) inputs = tf.keras.Input(shape=IMAGE_SHAPE+(3,)) x = hub.KerasLayer(mobilenet_v2)(inputs) classifier = tf.keras.Model(inputs=inputs, outputs=x)
内容的提问来源于stack exchange,提问作者inter galactic
相关产品推荐
相关产品推荐

