[Python] Getting ValueError: Unexpected object from deserialization, expected a layer or...

Discussão em 'Python' iniciado por Stack, Abril 13, 2025.

  1. Stack

    Stack Membro Participativo

    here is the code from the Distance layer part because site is not allowing me to upload full code.

    embedding = make_embedding()


    distance layer

    class L1Dist(Layer):

    def __init__(self, **kwargs):
    super().__init__()

    def call(self, input_embedding, validation_embedding):
    return tf.math.abs(input_embedding - validation_embedding)


    def make_siamese_model():

    input_image = Input(name='input_img', shape=(100,100,3))

    validation_image = Input(name='validation_img', shape=(100,100,3))

    siamese_layer = L1Dist()
    siamese_layer._name = 'distance'
    distances = siamese_layer(embedding(input_image), embedding(validation_image))

    classifier = Dense(1, activation='sigmoid')(distances)

    return Model(inputs=[input_image, validation_image], outputs=classifier, name='SiameseNetwork')


    siamese_model = make_siamese_model()


    binary_cross_loss = tf.losses.BinaryCrossentropy()


    opt = tf.keras.optimizers.Adam(1e-4) # 0.0001


    checkpoint_dir = './training_checkpoints'
    checkpoint_prefix = os.path.join(checkpoint_dir, 'ckpt')
    checkpoint = tf.train.Checkpoint(opt=opt, siamese_model=siamese_model)


    @tf.function
    def train_step(batch):

    with tf.GradientTape() as tape:
    X = batch[:2]
    y = batch[2]

    yhat = siamese_model(X, training=True)
    loss = binary_cross_loss(y, yhat)
    print(loss)

    grad = tape.gradient(loss, siamese_model.trainable_variables)

    opt.apply_gradients(zip(grad, siamese_model.trainable_variables))

    return loss


    from tensorflow.python.keras.metrics import Precision, Recall


    def train(data, EPOCHS):
    for epoch in range(1, EPOCHS+1):
    print('\n Epoch {}/{}'.format(epoch, EPOCHS))
    progbar = tf.keras.utils.Progbar(len(data))

    r = Recall()
    p = Precision()

    for idx, batch in enumerate(data):
    # Run train step here
    loss = train_step(batch)
    yhat = siamese_model(batch[:2], training=False)
    r.update_state(batch[2], yhat)
    p.update_state(batch[2], yhat)
    progbar.update(idx+1)
    print(loss.numpy(), r.result().numpy(), p.result().numpy())

    if epoch % 1 == 0:
    checkpoint.save(file_prefix=checkpoint_prefix)


    siamese_model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['accuracy']
    )


    EPOCHS = 2
    train(train_data, EPOCHS)


    siamese_model.save('siamese_model.h5')


    new_model = tf.keras.models.load_model('siamese_model.h5',custom_objects={'L1Dist':L1Dist, 'binary_crossentropy':tf.losses.binary_crossentropy})


    while reloading the model it is showing an ValueError: Unexpected object from deserialization, expected a layer or operation, got a <class 'main.L1Dist'>
    please suggest changes in the code so that i could reload the siamsese model.

    Continue reading...

Compartilhe esta Página