Почему ошибка Tensorflow: `не удалось преобразовать объект типас Tensor` происходит и как я могу это решить? - PullRequest
2 голосов
/ 24 марта 2019

Я выполняю задание по анализу трафика, и я застрял с некоторой ошибкой в ​​моем коде.Мои строки данных выглядят так:

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

Значения примерно такие:

1, 6, 19, 23, 53.32, 45.23

Что означает на определенной улице в течение 1st четверть 19 час Friday, плотность трафика измеряется 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. Прежде всего, каково понятие ошибки?Я не мог найти источник по причине ошибки, чтобы иметь дело с этим.И как я могу изменить код для решения?

во-вторых, это улучшает производительность модели, чтобы использовать тензор потока categorical_column_with_identity вместо numeric_columns для DOW, который указывает дни недели?

Я также хочучтобы узнать, полезно ли объединить quarter и hour в один столбец, например day time (quarter - минуты в часе, которые будут нормализованы между 0 и 1)?

1 Ответ

1 голос
/ 27 марта 2019

Прежде всего, каково понятие ошибки? Я не мог найти источник для причина ошибки, чтобы справиться с этим. И как я могу изменить код для решение?

Позвольте мне сначала поговорить о решении проблемы. Вам необходимо изменить параметр 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 тип.

во-вторых, это улучшает производительность модели, чтобы использовать тензор потока categoryor_column_with_identity вместо numeric_columns для DOW который указывает дни недели?

Это связано с тем, когда нам следует выбрать categorical или numeric для разработки функций. Очень простое правило - выбрать numeric, если во внутреннем сравнении вашей функции есть существенная разница между большим и малым. Если функция не имеет большего или меньшего значения, вам следует выбрать categorical. Поэтому я склонен выбирать categorical_column_with_identity для функции DOW.

Я также хочу знать, полезно ли объединять квартал и час как один столбец, например, дневное время (четверть минуты в часе, будет нормализовано между 0 и 1)?

Перекрестные функции могут принести некоторые преимущества, такие как широта и долгота. Я рекомендую вам использовать tf.feature_column.crossed_column ( link ) здесь. Возвращает столбец для выполнения скрещивания категориальных признаков. Вы также можете одновременно сохранить функции quarter и hour в модели,.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...