keras-team / keras

Deep Learning for humans
http://keras.io/
Apache License 2.0
61.37k stars 19.39k forks source link

ValueError when trying to load a .keras model created using Functional API #19803

Open iamsoroush opened 1 month ago

iamsoroush commented 1 month ago

create an encoder-decoder model:

def get_encoder(input_shape):
    input_tensor = keras.Input(input_shape, dtype='float32')
    x1 = keras.layers.Conv2D(8, 3, padding='same')(input_tensor)
    x2 = keras.layers.Conv2D(16, 3, padding='same')(x1)
    return keras.Model(input_tensor, [x1, x2])

def get_decoder(inputs):
    x1 = keras.layers.Conv2D(8, 3, padding='same')(inputs[0])
    x2 = keras.layers.Conv2D(8, 3, padding='same')(inputs[1])
    x = keras.layers.Concatenate()([x1, x2])
    return keras.Model(inputs, x)

input_shape = (512, 512, 3)
encoder = get_encoder(input_shape)

inputs = keras.Input(input_shape, dtype='uint8')
encoded = encoder(inputs)
x = keras.layers.Conv2D(4, 3, padding='same')(encoded[-1])
x = keras.layers.Conv2D(4, 3, padding='same')(x)
skips = encoded[:-1]
skips.append(x)
decoder = get_decoder(skips)
decoded = decoder(skips)
model = keras.Model(inputs, decoded)
model.summary()

extract a bottleneck model and save it as a .keras model:

bottleneck = keras.Model(model.layers[2].input, model.layers[3].output)
bottleneck.save('model.keras')

when trying to load the saved model, throws an error:

loaded = keras.saving.load_model('model.keras')

ValueError: Layer node index out of bounds.
inbound_layer = <Conv2D name=conv2d_45, built=True>
inbound_layer._inbound_nodes = []
inbound_node_index = 0
sachinprasadhs commented 1 month ago

I was able to replicate the reported behavior here https://colab.sandbox.google.com/gist/sachinprasadhs/d40631f9ee4702a0b93a69c143f8c3a6/19803.ipynb

Jaimin020 commented 1 month ago

I am currently working on this bug

iamsoroush commented 2 weeks ago

any updates?

Jaimin020 commented 2 weeks ago

Hi @iamsoroush, I’m currently working on it, and it will be done in the coming days.