Tensorflow CustomEstimator DNNRegressor label_dimensions

时间:2018-07-05 13:23:11

标签: python tensorflow tensorflow-estimator

我目前对tensorflow还是相当陌生,我试图根据过去时间步长中的位置来预测粒子的位置。

我的功能如下:

    X_0    X_1    X_2    X_3    X_4    Y_0    Y_1    Y_2    Y_3    Y_4
19  650.0  651.0  652.0  653.0  654.0  128.3  135.9  143.5  151.1  158.7
16  647.0  648.0  649.0  650.0  651.0  105.5  113.1  120.7  128.3  135.9
...

和我的标签如下:

     LabelX  LabelY
19   655.0   166.3
16   652.0   143.5
...

您会看到我的标签是二维的。我的第一次尝试是使用张量流预制的估计量tf.estimator.DNNRegressor,并在创建过程中为其指定参数label_dimension=2,这样效果很好。

现在,我想对自定义估算器执行相同的操作。 令人遗憾的是,tensorflow站点上的教程都是使用Classifier而不是Regressors的,而我能够在线找到的唯一示例是this,但它们仅使用一维输出。

我已经做了很多试验,但是没有任何进展。 我相当确定我必须更改第41行

output_layer = tf.layers.dense(inputs=top, units=1)

但是,如果这样做,我将无法使文件的其余部分正常工作。

1 个答案:

答案 0 :(得分:0)

我知道了。

您可以找到我的代码here

import tensorflow as tf


def myCustomEstimator(features, labels, mode, params):
    """Modell funktion für Custom Estimator (DNN Regression)"""

    # Input Layer
    top = tf.feature_column.input_layer(features, params["feature_columns"])

    # basierend auf hidden Units wird die Netztopologie aufgebaut
    for units in params.get("hidden_units", [20]):
        top = tf.layers.dense(inputs=top, units=units, activation=tf.nn.relu)
        if "dropout" in params.keys() and params["dropout"] != 0:
            top = tf.layers.dropout(inputs=top, rate=params["dropout"], training=mode == tf.estimator.ModeKeys.TRAIN)

    # lineares output layer mit 2 Neuronen für die 2 Koordinaten
    output_layer = tf.layers.dense(inputs=top, units=2)

    if mode == tf.estimator.ModeKeys.PREDICT:
        # In `PREDICT` mode we only need to return predictions.
        return tf.estimator.EstimatorSpec(
            mode=mode, predictions={"predictions": output_layer})

    average_loss = tf.losses.mean_squared_error(tf.cast(labels, tf.float32), output_layer)
    tf.summary.scalar("average_loss", average_loss)

    MSE = tf.metrics.mean_squared_error(tf.cast(labels, tf.float32), output_layer)
    tf.summary.scalar('error', MSE[1])

    # Pre-made estimators use the total_loss instead of the average,
    # so report total_loss for compatibility.
    batch_size = tf.shape(labels)[0]
    total_loss = tf.to_float(batch_size) * average_loss

    if mode == tf.estimator.ModeKeys.TRAIN:
        optimizer = params.get("optimizer", tf.train.AdamOptimizer)
        optimizer = optimizer(params.get("learning_rate", None))
        train_op = optimizer.minimize(
            loss=average_loss, global_step=tf.train.get_global_step())

        return tf.estimator.EstimatorSpec(
            mode=mode, loss=total_loss, train_op=train_op)


    # In evaluation mode we will calculate evaluation metrics.
    assert mode == tf.estimator.ModeKeys.EVAL

    # Calculate root mean squared error
    rmse = tf.metrics.root_mean_squared_error(tf.cast(labels, tf.float32), output_layer)

    # Add the rmse to the collection of evaluation metrics.
    eval_metrics = {"rmse": rmse, "average_loss": MSE}

    return tf.estimator.EstimatorSpec(
        mode=mode,
        # Report sum of error for compatibility with pre-made estimators
        loss=total_loss,
        eval_metric_ops=eval_metrics)