为什么Tensorflow错误:`无法转换类型的对象 到Tensor`发生了,我该如何解决?

问题描述 投票:2回答:1

我正在进行流量分析的任务,我在代码中遇到了一些错误。我的数据行是这样的:

qurter | DOW (Day of week)| Hour | density | speed | label (predicted speed for another half an hour)

值如下:

1, 6, 19, 23, 53.32, 45.23

这意味着在1st19Friday四分之一的特定街道,交通密度测量23和当前速度是53.32。预测的速度将是45.23

任务是通过上面给出的预测值预测另外半小时的速度。

我正在使用此代码为数据构建TensorFlow DNNRegressor

import pandas as pd
data = pd.read_csv('dataset.csv')
X = data.iloc[:,:5].values
y = data.iloc[:, 5].values
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2, random_state=0)

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train)

X_train = pd.DataFrame(data=scaler.transform(X_train),columns =    ['quarter','DOW','hour','density','speed'])
X_test = pd.DataFrame(data=scaler.transform(X_test),columns = ['quarter','DOW','hour','density','speed'])

y_train = pd.DataFrame(data=y_train,columns = ['label'])
y_test = pd.DataFrame(data=y_test,columns = ['label'])

import tensorflow as tf

speed = tf.feature_column.numeric_column('speed')
hour = tf.feature_column.numeric_column('hour')
density = tf.feature_column.numeric_column('density')
quarter= tf.feature_column.numeric_column('quarter')
DOW = tf.feature_column.numeric_column('DOW')

feat_cols = [h_percentage, DOW, hour, density, speed]
input_func = tf.estimator.inputs.pandas_input_fn(x=X_train,y=y_train ,batch_size=10,num_epochs=1000,shuffle=False)

model = tf.estimator.DNNRegressor(hidden_units=[5,5,5],feature_columns=feat_cols)
model.train(input_fn=input_func,steps=25000)
predict_input_func = tf.estimator.inputs.pandas_input_fn(
  x=X_test,
  batch_size=10,
  num_epochs=1,
  shuffle=False)

pred_gen = model.predict(predict_input_func)

predictions = list(pred_gen)
final_preds = []
for pred in predictions:
    final_preds.append(pred['predictions'])

from sklearn.metrics import mean_squared_error

mean_squared_error(y_test,final_preds)**0.5

当我运行此代码时,它会以此结尾抛出错误:

TypeError: Failed to convert object of type <class 'dict'> to Tensor. Contents: {'label': <tf.Tensor 'fifo_queue_DequeueUpTo:6' shape=(?,) dtype=float64>}. Consider casting elements to a supported type. 首先,错误的概念是什么?我无法找到错误的原因来处理它。我如何修改解决方案的代码?

其次它是否改善模型性能使用tensorflow categorical_column_with_identity而不是numeric_columns用于表示星期几的DOW?

我还想知道将quarterhour合并为像day time这样的单列是否有用(quarter是一小时内的分钟,将在0和1之间归一化)?

tensorflow regression python-3.7 tensorflow-estimator feature-engineering
1个回答
1
投票

首先,错误的概念是什么?我无法找到错误的原因来处理它。我如何修改解决方案的代码?

我先谈谈解决问题的方法。您需要在y中更改参数pandas_input_fn,如下所示。

input_func = tf.estimator.inputs.pandas_input_fn(x=X_train,y=y_train['label'],batch_size=10,num_epochs=1000,shuffle=False)

当你跑到y时,似乎pandas_input_fn中的参数dataframe不支持model.train()类型。在这种情况下,pandas_input_fn将每个样本y解析为类似于{columnname: value}的形式,但是model.train()无法识别它。所以你需要通过series类型。

其次它是否改善模型性能以使用tensorflow categorical_column_with_identity而不是numeric_columns用于表示星期几的DOW?

这涉及到我们应该选择categorical或选择numeric进行特征工程。一个非常简单的规则是,如果在您的要素的内部比较中,大小之间存在显着差异,则选择numeric。如果该特征没有更大或更小的重要性,您应该选择categorical。所以我倾向于选择categorical_column_with_identity作为功能DOW

我还想知道将季度和小时合并为单个列(如白天)(四分之一是一小时的分钟,将在0和1之间归一化)是否有用?

交叉功能可带来一些好处,如纬度和经度功能。我建议你在这里使用tf.feature_column.crossed_columnlink)。它返回一列用于执行分类特征的交叉。您还可以在模型中同时继续保留quarterhour的功能。

© www.soinside.com 2019 - 2024. All rights reserved.