【问题标题】:Keras "list index out of range" when saving a model保存模型时Keras“列表索引超出范围”
【发布时间】:2021-01-04 12:06:19
【问题描述】:

当我想使用 model.save 方法保存我的 keras 模型时遇到问题:

IndexError: list index out of range

这是模型:

    ### Model ###
    # 3 inputs
    inputA = tf.keras.layers.Input(shape=(100,))
    inputB = tf.keras.layers.Input(shape=(100,))
    inputC = tf.keras.layers.Input(shape=(4,))

    # First branch
    x = tf.keras.models.Sequential()(inputA)
    x = tf.keras.layers.Dense(350, activation="relu")(x)
    x = tf.keras.layers.Dropout(0.2)(x)
    x = tf.keras.layers.Dense(250, activation="relu")(x)
    x = tf.keras.layers.Dropout(0.2)(x)
    x = tf.keras.layers.Dense(150, activation="relu")(x)
    x = tf.keras.layers.Dropout(0.2)(x)
    x = tf.keras.layers.Dense(100, activation="relu")(x)
    x = tf.keras.layers.Dropout(0.2)(x)
    x = tf.keras.layers.Dense(50, activation="relu")(x)
    x = tf.keras.layers.Dropout(0.2)(x)
    x = tf.keras.layers.Dense(25, activation="relu")(x)
    x = tf.keras.layers.Dropout(0.2)(x)
    x = tf.keras.layers.Dense(10, activation="relu")(x)
    x = tf.keras.layers.Dropout(0.2)(x)
    x = tf.keras.layers.Dense(1, activation="sigmoid")(x)
    x = tf.keras.models.Model(inputs=inputA, outputs=x)

    # Second branch
    y = tf.keras.models.Sequential()(inputB)
    y = tf.keras.layers.Dense(350, activation="relu")(y)
    y = tf.keras.layers.Dropout(0.2)(y)
    y = tf.keras.layers.Dense(250, activation="relu")(y)
    y = tf.keras.layers.Dropout(0.2)(y)
    y = tf.keras.layers.Dense(150, activation="relu")(y)
    y = tf.keras.layers.Dropout(0.2)(y)
    y = tf.keras.layers.Dense(100, activation="relu")(y)
    y = tf.keras.layers.Dropout(0.2)(y)
    y = tf.keras.layers.Dense(50, activation="relu")(y)
    y = tf.keras.layers.Dropout(0.2)(y)
    y = tf.keras.layers.Dense(25, activation="relu")(y)
    y = tf.keras.layers.Dropout(0.2)(y)
    y = tf.keras.layers.Dense(10, activation="relu")(y)
    y = tf.keras.layers.Dropout(0.2)(y)
    y = tf.keras.layers.Dense(1, activation="sigmoid")(y)
    y = tf.keras.models.Model(inputs=inputB, outputs=y)

    # Third branch
    w = tf.keras.models.Sequential()(inputC)
    w = tf.keras.layers.Dense(200, activation="relu")(w)
    w = tf.keras.layers.Dropout(0.2)(w)
    w = tf.keras.layers.Dense(200, activation="relu")(w)
    w = tf.keras.layers.Dropout(0.2)(w)
    w = tf.keras.layers.Dense(150, activation="relu")(w)
    w = tf.keras.layers.Dropout(0.2)(w)
    w = tf.keras.layers.Dense(100, activation="relu")(w)
    w = tf.keras.layers.Dropout(0.2)(w)
    w = tf.keras.layers.Dense(50, activation="relu")(w)
    w = tf.keras.layers.Dropout(0.2)(w)
    w = tf.keras.layers.Dense(1, activation="sigmoid")(w)
    w = tf.keras.models.Model(inputs=inputC, outputs=w)

    # Concatenate outputs
    combined = tf.keras.layers.Concatenate(axis=1)([x.output, y.output, w.output])

    # Last branch with combined
    z = tf.keras.layers.Dense(200, activation="relu")(combined)
    z = tf.keras.layers.Dropout(0.2)(z)
    z = tf.keras.layers.Dense(200, activation="relu")(z)
    z = tf.keras.layers.Dropout(0.2)(z)
    z = tf.keras.layers.Dense(150, activation="relu")(z)
    z = tf.keras.layers.Dropout(0.2)(z)
    z = tf.keras.layers.Dense(100, activation="relu")(z)
    z = tf.keras.layers.Dropout(0.2)(z)
    z = tf.keras.layers.Dense(50, activation="relu")(z)
    z = tf.keras.layers.Dropout(0.2)(z)
    z = tf.keras.layers.Dense(25, activation="relu")(z)
    z = tf.keras.layers.Dropout(0.2)(z)
    z = tf.keras.layers.Dense(1, activation="sigmoid")(z) #softmax ou sigmoid

    model = tf.keras.models.Model(inputs=[x.input, y.input, w.input], outputs=z)
    model.compile(optimizer='adam', loss='binary_crossentropy')
    model.fit(x=[X1, X2, X3], y=y1, batch_size=128, epochs=nb_epoch, verbose=2)

    # Evaluation on test set
    ...

    # Sauvegarde du model
    model.save("path/to/my/model/location")

这是完整的错误:

Traceback (most recent call last):
  File "reseauNeurone.py", line 230, in MLP
    model.save("/Users/x/Documents/Cours/DI5/S9/Projet IA/Model")
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py", line 1979, in save
    signatures, options)
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/saving/save.py", line 134, in save_model
    signatures, options)
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/saving/saved_model/save.py", line 80, in save
    save_lib.save(model, filepath, signatures, options)
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/saved_model/save.py", line 976, in save
    obj, export_dir, signatures, options, meta_graph_def)
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/saved_model/save.py", line 1076, in _build_meta_graph
    asset_info.asset_index)
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/saved_model/save.py", line 721, in _serialize_object_graph
    saveable_view.function_name_map)
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/saved_model/save.py", line 761, in _write_object_proto
    metadata=obj._tracking_metadata)
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer.py", line 3011, in _tracking_metadata
    return self._trackable_saved_model_saver.tracking_metadata
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/saving/saved_model/base_serialization.py", line 54, in tracking_metadata
    return json_utils.Encoder().encode(self.python_properties)
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/saving/saved_model/layer_serialization.py", line 41, in python_properties
    return self._python_properties_internal()
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/saving/saved_model/model_serialization.py", line 35, in _python_properties_internal
    metadata = super(ModelSavedModelSaver, self)._python_properties_internal()
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/saving/saved_model/layer_serialization.py", line 59, in _python_properties_internal
    metadata.update(get_config(self.obj))
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/saving/saved_model/layer_serialization.py", line 118, in get_config
    config = generic_utils.serialize_keras_object(obj)['config']
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/utils/generic_utils.py", line 245, in serialize_keras_object
    config = instance.get_config()
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/engine/functional.py", line 598, in get_config
    return copy.deepcopy(get_network_config(self))
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/engine/functional.py", line 1261, in get_network_config
    kept_nodes = 1 if _should_skip_first_node(layer) else 0
  File "/Users/x/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/engine/functional.py", line 1033, in _should_skip_first_node
    isinstance(layer._layers[0], input_layer_module.InputLayer))
IndexError: list index out of range

我也尝试过使用model.get_config或者使用json来保存模型,但是还是报错。

有谁知道如何解决这个问题以及如何成功保存模型? 谢谢。

【问题讨论】:

标签: python tensorflow keras


【解决方案1】:

我修复了你的代码。 x,y,z 的问题也是一样的。您将 Keras 功能 API 与序列模型混合在一起。

只需注释掉 Sequential Model 并将输入传递给您的第一个密集层。

    #x = tf.keras.models.Sequential()(inputA)
    x = tf.keras.layers.Dense(350, activation="relu")(inputA)

这是整个代码。我能够保存你的模型。

### Model ###
    # 3 inputs
    inputA = tf.keras.layers.Input(shape=(100,))
    inputB = tf.keras.layers.Input(shape=(100,))
    inputC = tf.keras.layers.Input(shape=(4,))

    # First branch
    #x = tf.keras.models.Sequential()(inputA)
    x = tf.keras.layers.Dense(350, activation="relu")(inputA)
    x = tf.keras.layers.Dropout(0.2)(x)
    x = tf.keras.layers.Dense(250, activation="relu")(x)
    x = tf.keras.layers.Dropout(0.2)(x)
    x = tf.keras.layers.Dense(150, activation="relu")(x)
    x = tf.keras.layers.Dropout(0.2)(x)
    x = tf.keras.layers.Dense(100, activation="relu")(x)
    x = tf.keras.layers.Dropout(0.2)(x)
    x = tf.keras.layers.Dense(50, activation="relu")(x)
    x = tf.keras.layers.Dropout(0.2)(x)
    x = tf.keras.layers.Dense(25, activation="relu")(x)
    x = tf.keras.layers.Dropout(0.2)(x)
    x = tf.keras.layers.Dense(10, activation="relu")(x)
    x = tf.keras.layers.Dropout(0.2)(x)
    x = tf.keras.layers.Dense(1, activation="sigmoid")(x)
    x = tf.keras.models.Model(inputs=inputA, outputs=x)

    # Second branch
    #y = tf.keras.models.Sequential()(inputB)
    y = tf.keras.layers.Dense(350, activation="relu")(inputB)
    y = tf.keras.layers.Dropout(0.2)(y)
    y = tf.keras.layers.Dense(250, activation="relu")(y)
    y = tf.keras.layers.Dropout(0.2)(y)
    y = tf.keras.layers.Dense(150, activation="relu")(y)
    y = tf.keras.layers.Dropout(0.2)(y)
    y = tf.keras.layers.Dense(100, activation="relu")(y)
    y = tf.keras.layers.Dropout(0.2)(y)
    y = tf.keras.layers.Dense(50, activation="relu")(y)
    y = tf.keras.layers.Dropout(0.2)(y)
    y = tf.keras.layers.Dense(25, activation="relu")(y)
    y = tf.keras.layers.Dropout(0.2)(y)
    y = tf.keras.layers.Dense(10, activation="relu")(y)
    y = tf.keras.layers.Dropout(0.2)(y)
    y = tf.keras.layers.Dense(1, activation="sigmoid")(y)
    y = tf.keras.models.Model(inputs=inputB, outputs=y)

    # Third branch
    #w = tf.keras.models.Sequential()(inputC)
    w = tf.keras.layers.Dense(200, activation="relu")(inputC)
    w = tf.keras.layers.Dropout(0.2)(w)
    w = tf.keras.layers.Dense(200, activation="relu")(w)
    w = tf.keras.layers.Dropout(0.2)(w)
    w = tf.keras.layers.Dense(150, activation="relu")(w)
    w = tf.keras.layers.Dropout(0.2)(w)
    w = tf.keras.layers.Dense(100, activation="relu")(w)
    w = tf.keras.layers.Dropout(0.2)(w)
    w = tf.keras.layers.Dense(50, activation="relu")(w)
    w = tf.keras.layers.Dropout(0.2)(w)
    w = tf.keras.layers.Dense(1, activation="sigmoid")(w)
    w = tf.keras.models.Model(inputs=inputC, outputs=w)

    # Concatenate outputs
    combined = tf.keras.layers.Concatenate(axis=1)([x.output, y.output, w.output])

    # Last branch with combined
    z = tf.keras.layers.Dense(200, activation="relu")(combined)
    z = tf.keras.layers.Dropout(0.2)(z)
    z = tf.keras.layers.Dense(200, activation="relu")(z)
    z = tf.keras.layers.Dropout(0.2)(z)
    z = tf.keras.layers.Dense(150, activation="relu")(z)
    z = tf.keras.layers.Dropout(0.2)(z)
    z = tf.keras.layers.Dense(100, activation="relu")(z)
    z = tf.keras.layers.Dropout(0.2)(z)
    z = tf.keras.layers.Dense(50, activation="relu")(z)
    z = tf.keras.layers.Dropout(0.2)(z)
    z = tf.keras.layers.Dense(25, activation="relu")(z)
    z = tf.keras.layers.Dropout(0.2)(z)
    z = tf.keras.layers.Dense(1, activation="sigmoid")(z) #softmax ou sigmoid

    model = tf.keras.models.Model(inputs=[x.input, y.input, w.input], outputs=z)
    model.compile(optimizer='adam', loss='binary_crossentropy')
    model.fit(x=[X1, X2, X3], y=y1, batch_size=128, epochs=nb_epoch, verbose=2)

    # Evaluation on test set
    ...

    # Sauvegarde du model
    model.save("path/to/my/model/location")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2016-06-28
    相关资源
    最近更新 更多