首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CustomEstimator DNNRegressor label_dimensions

CustomEstimator DNNRegressor label_dimensions
EN

Stack Overflow用户
提问于 2018-07-05 13:23:11
回答 1查看 418关注 0票数 0

我现在对tensorflow相当陌生,我试图根据粒子在过去的时间步骤中的位置来预测粒子的位置。

我的特征是这样的:

代码语言:javascript
复制
    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
...

我的标签是这样的:

代码语言:javascript
复制
     LabelX  LabelY
19   655.0   166.3
16   652.0   143.5
...

你可以看到我的标签是二维的。我的第一次尝试使用了张量流预设定的估计器tf.estimator.DNNRegressor,通过在创建过程中给它参数label_dimension=2,这是很好的。

现在,我也想对自定义估计器做同样的处理。遗憾的是,tensorflow网站上的教程都在使用分类器而不是回归器,我在网上找到的唯一例子是,但它们只使用一维输出。

我做了很多实验,但没有取得任何进展。我很确定我必须改变第41行

代码语言:javascript
复制
output_layer = tf.layers.dense(inputs=top, units=1)

但是如果我这样做了,我就不能让文件的其余部分发挥作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-11 08:46:51

我让它开始工作了。

你可以找到我的代码这里

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51192489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档