我目前对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)
但是,如果这样做,我将无法使文件的其余部分正常工作。
答案 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)