Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ValueError:未知层:功能性_Python_Tensorflow_Keras - Fatal编程技术网

Python ValueError:未知层:功能性

Python ValueError:未知层:功能性,python,tensorflow,keras,Python,Tensorflow,Keras,我在colab制作了一个CNN并保存了每个时代的模型。我导出了h5文件,现在正在尝试在一些测试图像上运行该模型。以下是主要错误: ValueError: Unknown layer: Functional 下面是我用来运行模型并在每个历元保存的代码: epochs = 50 callbacks = [ tf.keras.callbacks.TensorBoard(log_dir='./logs'), keras.callbacks.ModelCheckpoint("

我在colab制作了一个CNN并保存了每个时代的模型。我导出了h5文件,现在正在尝试在一些测试图像上运行该模型。以下是主要错误:

ValueError: Unknown layer: Functional
下面是我用来运行模型并在每个历元保存的代码:

epochs = 50

callbacks = [
    tf.keras.callbacks.TensorBoard(log_dir='./logs'),
    keras.callbacks.ModelCheckpoint("save_at_{epoch}.h5"),
]
model.compile(
    optimizer=keras.optimizers.Adam(1e-3),
    loss="binary_crossentropy",
    metrics=["accuracy"],
)
model.fit(
    train_ds, epochs=epochs, callbacks=callbacks, validation_data=val_ds,
)
模型运行后,我刚从本地的colab侧栏下载了h5文件。我从本地磁盘重新上传了该文件,下面是我尝试加载模型的方式:

# load and evaluate a saved model
from tensorflow.keras.models import load_model

# load model#
loaded_model = load_model('save_at_47.h5')
loaded_model.layers[0].input_shape
以下是完整的回溯:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-6af7396280fa> in <module>()
      3 
      4 # load model#
----> 5 loaded_model = load_model('save_at_47.h5')
      6 loaded_model.layers[0].input_shape

5 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/saving/save.py in load_model(filepath, custom_objects, compile)
    182     if (h5py is not None and (
    183         isinstance(filepath, h5py.File) or h5py.is_hdf5(filepath))):
--> 184       return hdf5_format.load_model_from_hdf5(filepath, custom_objects, compile)
    185 
    186     if sys.version_info >= (3, 4) and isinstance(filepath, pathlib.Path):

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/saving/hdf5_format.py in load_model_from_hdf5(filepath, custom_objects, compile)
    176     model_config = json.loads(model_config.decode('utf-8'))
    177     model = model_config_lib.model_from_config(model_config,
--> 178                                                custom_objects=custom_objects)
    179 
    180     # set weights

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/saving/model_config.py in model_from_config(config, custom_objects)
     53                     '`Sequential.from_config(config)`?')
     54   from tensorflow.python.keras.layers import deserialize  # pylint: disable=g-import-not-at-top
---> 55   return deserialize(config, custom_objects=custom_objects)
     56 
     57 

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/layers/serialization.py in deserialize(config, custom_objects)
    107       module_objects=globs,
    108       custom_objects=custom_objects,
--> 109       printable_module_name='layer')

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/utils/generic_utils.py in deserialize_keras_object(identifier, module_objects, custom_objects, printable_module_name)
    360     config = identifier
    361     (cls, cls_config) = class_and_config_for_serialized_keras_object(
--> 362         config, module_objects, custom_objects, printable_module_name)
    363 
    364     if hasattr(cls, 'from_config'):

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/utils/generic_utils.py in class_and_config_for_serialized_keras_object(config, module_objects, custom_objects, printable_module_name)
    319   cls = get_registered_object(class_name, custom_objects, module_objects)
    320   if cls is None:
--> 321     raise ValueError('Unknown ' + printable_module_name + ': ' + class_name)
    322 
    323   cls_config = config['config']

ValueError: Unknown layer: Functional
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
3.
4#负荷模型#
---->5加载的模型=加载的模型('save_at_47.h5')
6加载的\u模型。层[0]。输入\u形状
5帧
/加载\模型中的usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/saving/save.py(文件路径、自定义\对象、编译)
182如果(h5py)不是无和(
183 iInstance(文件路径,h5py.File)或h5py.is_hdf5(文件路径)):
-->184返回hdf5\u格式。从\u hdf5加载\u模型\u(文件路径、自定义\u对象、编译)
185
186如果sys.version_info>=(3,4)和isinstance(filepath,pathlib.Path):
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/saving/hdf5\u format.py从hdf5加载模型(文件路径,自定义对象,编译)
176 model_config=json.load(model_config.decode('utf-8'))
177 model=model_config_lib.model_from_config(model_config,
-->178自定义对象=自定义对象)
179
180#设置重量
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/saving/model\u config.py在来自配置(配置,自定义对象)的模型中
53'`Sequential.from_config(config)`?')
54从tensorflow.python.keras.layers导入反序列化#pylint:disable=g-import-not-at-top
--->55返回反序列化(配置,自定义对象=自定义对象)
56
57
/反序列化中的usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/layers/serialization.py(配置,自定义_对象)
107模块_对象=全局,
108自定义对象=自定义对象,
-->109可打印的\u模块\u name='layer')
/反序列化keras对象(标识符、模块对象、自定义对象、可打印模块名称)中的usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/utils/generic_utils.py
360配置=标识符
361(cls,cls_config)=类_和配置_,用于序列化的_keras_对象(
-->362配置、模块对象、自定义对象、可打印模块名称)
363
364如果hasattr(cls,“来自配置”):
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/utils/generic_utils.py类中的usr/local/lib/python3.6/dist-packages
319 cls=获取注册对象(类名称、自定义对象、模块对象)
320如果cls为无:
-->321提升值错误('Unknown'+可打印模块名称+':'+类名称)
322
323 cls_config=config['config']
ValueError:未知层:功能性

似乎也有过几次类似的,而且。更改导入方法没有任何帮助,尝试创建某些对象也没有起作用。

从头开始重建网络:

image_size = (212, 212)
batch_size = 32

data_augmentation = keras.Sequential(
    [
        layers.experimental.preprocessing.RandomFlip("horizontal_and_vertical"),
        layers.experimental.preprocessing.RandomRotation(0.8),
    ]
)


def make_model(input_shape, num_classes):
    inputs = keras.Input(shape=input_shape)
    # Image augmentation block
    x = data_augmentation(inputs)

    # Entry block
    x = layers.experimental.preprocessing.Rescaling(1.0 / 255)(x)
    x = layers.Conv2D(32, 3, strides=2, padding="same")(x)
    x = layers.BatchNormalization()(x)
    x = layers.Activation("relu")(x)

    x = layers.Conv2D(64, 3, padding="same")(x)
    x = layers.BatchNormalization()(x)
    x = layers.Activation("relu")(x)

    previous_block_activation = x  # Set aside residual

    for size in [128, 256, 512, 728]:
        x = layers.Activation("relu")(x)
        x = layers.SeparableConv2D(size, 3, padding="same")(x)
        x = layers.BatchNormalization()(x)

        x = layers.Activation("relu")(x)
        x = layers.SeparableConv2D(size, 3, padding="same")(x)
        x = layers.BatchNormalization()(x)

        x = layers.MaxPooling2D(3, strides=2, padding="same")(x)

        # Project residual
        residual = layers.Conv2D(size, 1, strides=2, padding="same")(
            previous_block_activation
        )
        x = layers.add([x, residual])  # Add back residual
        previous_block_activation = x  # Set aside next residual

    x = layers.SeparableConv2D(1024, 3, padding="same")(x)
    x = layers.BatchNormalization()(x)
    x = layers.Activation("relu")(x)

    x = layers.GlobalAveragePooling2D()(x)
    if num_classes == 2:
        activation = "sigmoid"
        units = 1
    else:
        activation = "softmax"
        units = num_classes

    x = layers.Dropout(0.5)(x)
    outputs = layers.Dense(units, activation=activation)(x)
    return keras.Model(inputs, outputs)


model = make_model(input_shape=image_size + (3,), num_classes=2)
keras.utils.plot_model(model, show_shapes=False)
加载重量:

model.load_weights('save_at_47.h5')
并对图像进行了预测:

# Running inference on new data
img = keras.preprocessing.image.load_img(
    "le_image.jpg", target_size=image_size
)
img_array = keras.preprocessing.image.img_to_array(img)
img_array = tf.expand_dims(img_array, 0)  # Create batch axis

predictions = model.predict(img_array)
score = predictions[0]
print(
    "This image is %.2f percent negative and %.2f percent positive."
    % (100 * (1 - score), 100 * score)
)

当我在TF2.3.0上时,我遇到了同样的问题,我降级到TF2.2.0,它工作了

当在colab上使用
TF2.3
训练模型并在本地机器上加载
TF2.2
时,我遇到了同样的问题。解决方案是使用以下命令升级TensorFlow:

pip3 install --upgrade tensorflow

该错误的解决方案非常简单,例如,原因是您已经在Tensorflow的“2.3.0”版本和Keras的“2.4.3”版本(在Colab或本地)上对模型进行了培训。现在,您正在通过另一个版本的Keras&TensorFlow访问保存的模型(.h5)。它会给你错误。解决方案是使用升级版本重新培训模型,或者将TF&KERA降级到与培训模型相同的版本。

这里的讨论为我省去了一些麻烦!我有一个不同的解决方案,对我来说更容易

TF2.3和TF2.2之间的更改非常小。我在使用TF2.3下编写的model_config.yaml文件时遇到了相同的错误,我需要在T2.2下加载和训练这些文件。仅包含Conv2D层的模型结构的两个版本的差异很容易手动修复或使用sed修复:

如下图所示,需要将
class_name:Functional
更改为
class_name:Model
,并删除Conv2D和其他Conv层中新增的配置
组:1
。为了保持一致性,最后我还更改了keras版本。显然,只有当groups参数保留为
默认值:1
时,这才有效

*** model_config_tf22.yaml  2021-01-07 15:00:03.042791215 +0100
--- model_config_tf23.yaml  2021-01-07 14:59:56.426791386 +0100
***************
*** 1,5 ****
  backend: tensorflow
! class_name: Model
  config:
    input_layers:
    - - input_1
--- 1,5 ----
  backend: tensorflow
! class_name: Functional
  config:
    input_layers:
    - - input_1
***************
*** 34,39 ****
--- 34,40 ----
        - 1
        dtype: float32
        filters: 128
+       groups: 1
        kernel_constraint: null
        kernel_initializer:
          class_name: RandomUniform
***************
*** 343,346 ****
    - - Conv2D_5_37
      - 0
      - 0
! keras_version: 2.3.0-tf
--- 351,354 ----
    - - Conv2D_5_37
      - 0
      - 0
! keras_version: 2.4.0

如果您正在使用较旧的TF(在我的案例中为2.1.0)并试图解包由较新的TF(例如2.4.1)打包的h5文件,并且面临此错误,则以下技巧可能非常有用

your_model = tf.keras.models.load_model(
    path_to_h5,
    custom_objects={'Functional':tf.keras.models.Model})

你能提供你用来保存模型的代码吗?当然,我更新了这个问题来说明我是如何将模型保存到磁盘的。谢谢你为什么不自己从头开始重建模型,然后从
h5
文件中加载权重(
model.load\u weights('save\u at_47.h5')
)呢?在你的错误中,这个层称为什么功能层?这是你定制的图层吗?很简单。只需运行包含模型定义和编译的单元格,然后将权重加载到我上面告诉过你的这个空模型。我正在使用CoLab和tf,因此每次打开工作区时都可以降级版本,但过一段时间后可能会很麻烦。很高兴知道,谢谢!这是Colab特有的吗?我也犯了同样的错误。你救了我的命;P@LobstaBoy解决方案并不完全相关。您抱怨
加载模型('save_at_47.h5')
不工作