Ошибка модели Tensorflow 2 -Keras SAVE / LOAD (слои DenseFeatures и DistributionLambda) - PullRequest
1 голос
/ 27 января 2020

У меня есть модель Tensorflow 2.x, в которой используется уровень предварительной обработки TF (tf.keras.layers.DenseFeatures) и уровень распределения с вероятностью TF (DistributionLambda):

def regression_deep1_proba2(preprocessing_layer, feature_layer_inputs, model_name='test_model'):


    model = tf.keras.Sequential([
        preprocessing_layer,
        tf.keras.layers.Dense(100, activation='relu', name='hidden_1'),
        tf.keras.layers.Dense(50, activation='relu', name='hidden_2'),
        tf.keras.layers.Dense(1 + 1, name='output'),
        tfp.layers.DistributionLambda(
            lambda t: tfd.LogNormal(loc=t[..., :1], scale=tf.math.softplus(0.05 * t[..., 1:]))
        ),
    ])

    # ____________________ COMPILE WITH  ____________________________________________
    optimizer = tf.keras.optimizers.Adam()
    negloglik = lambda y, p_y: -p_y.log_prob(y)

    metrics = [
        tf.keras.metrics.MeanAbsolutePercentageError()
        ]

    model.compile(
        loss=negloglik,
        optimizer=optimizer,
        metrics=metrics
    )

    # ____________________ CALLBACKS DEFINITION ___________________________________________
    tbCallBack = tf.keras.callbacks.TensorBoard(
        log_dir=f'./logs_regression/{model_name}',
        update_freq='batch',
        histogram_freq=1,
        embeddings_freq=1,
        write_graph=True,
        write_images=True
    )

    # Create a callback that saves the model's weights every 5 epochs
    cp_callback = tf.keras.callbacks.ModelCheckpoint(
        filepath=f'./weights.{model_name}.hdf5',
        verbose=1,
        save_weights_only=True,
        save_best_onlt=True,
        monitor='MeanSquaredError'
    )
    early_stop = tf.keras.callbacks.EarlyStopping(
        monitor='MeanSquaredError',
        patience=2
    )
    callbacks_list = [tbCallBack, cp_callback, early_stop]

    return model, callbacks_list

Я могу получить некоторые хорошие результаты для проблемы регрессии с этой моделью, но когда я сохраняю ее для дальнейшего использования, я больше не могу загрузить ее обратно (я перепробовал все онлайн-уроки и решения, но ничего не работает) !!

Я получаю различные типы ошибок в зависимости от того, как сохранить модель Tahat, но в целом у меня есть:

при использовании:

tf.keras.models.save_model(model, 'model_name.h5')

на

new_model = tf.keras.models.load_model('model_name.h5')

I get:

ValueError: ('We expected a dictionary here. Instead we got: ', <tf.Tensor 'Placeholder:0' shape=(None,) dtype=float32>)

Я не могу понять, что я делаю неправильно - любая помощь будет оценена?

Ответы [ 3 ]

1 голос
/ 28 января 2020

Не могу вспомнить, где я наткнулся на это, но в моем случае я решил сохранить модель без расширения ".h5" в названии модели

tf.keras.models.save_model(model, "model_name")
new_model = tf.keras.models.load_model("model_name")
0 голосов
/ 10 марта 2020

Для моделей вероятности Tensorflow в настоящее время работают только веса нагрузки. Обратный вызов также только экономит вес. Поэтому для загрузки модели сначала определите архитектуру модели, а затем загрузите веса.

  model = tf.keras.Sequential([
        preprocessing_layer,
        tf.keras.layers.Dense(100, activation='relu', name='hidden_1'),
        tf.keras.layers.Dense(50, activation='relu', name='hidden_2'),
        tf.keras.layers.Dense(1 + 1, name='output'),
        tfp.layers.DistributionLambda(
            lambda t: tfd.LogNormal(loc=t[..., :1], scale=tf.math.softplus(0.05 * t[..., 1:]))
        ),
    ])

model.load_weights(model_path)
#Predict using Model (Currently model.predict() will not work given distribution Lamba output layer)
model(new_data)
0 голосов
/ 03 февраля 2020

Я создал проблему по проблемам вероятности Tensorflow github:

https://github.com/tensorflow/probability/issues/755

...