【问题标题】:Tensorflow 2 -Keras SAVE/LOAD model error (DenseFeatures and DistributionLambda layers)Tensorflow 2 -Keras SAVE/LOAD 模型错误(DenseFeatures 和 DistributionLambda 层)
【发布时间】:2020-01-27 15:00:14
【问题描述】:

我有一个 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')

我明白了:

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

我不知道我做错了什么 - 任何帮助将不胜感激?

【问题讨论】:

    标签: python tensorflow tf.keras tensorflow-probability


    【解决方案1】:

    对于 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)
    

    【讨论】:

      【解决方案2】:

      不记得我是在哪里偶然发现的,但我的想法是保存模型,而模型名称中没有“.h5”扩展名

      tf.keras.models.save_model(model, "model_name")
      new_model = tf.keras.models.load_model("model_name")
      

      【讨论】:

      • 我已经尝试了所有可能的组合:h5、tf、Jason、简单权重和其他格式,但它们都不起作用……我什至在不同的系统上尝试过:Mac、Ubuntu 和不同的 Tensorflow版本:2 和 2.1 ...当然,所有保存和加载(不同的方式)都适用于没有 TF 概率层的所有模型(即使有 DenseFeatures 层)
      【解决方案3】:

      我在 github 上创建了一个关于 Tensorflow 概率问题的问题:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-08
        • 1970-01-01
        • 2022-10-24
        • 2021-01-19
        • 2023-03-10
        • 2021-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多