La cadena de conversión de Tensorflow de Python para flotar no es compatible con el modelo lineal

Sigo recibiendo este error en mi modelo lineal:

La cadena de conversión para flotar no es compatible

Específicamente, el error está en esta línea:

results = m.evaluate(input_fn=lambda: input_fn(df_test), steps=1) 

Si ayuda, aquí está la traza de la stack:

  File "tensorflowtest.py", line 164, in  m.fit(input_fn=lambda: input_fn(df_train), steps=int(100)) File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/linear.py", line 475, in fit max_steps=max_steps) File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 333, in fit max_steps=max_steps) File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 662, in _train_model train_op, loss_op = self._get_train_ops(features, targets) File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 963, in _get_train_ops _, loss, train_op = self._call_model_fn(features, targets, ModeKeys.TRAIN) File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 944, in _call_model_fn return self._model_fn(features, targets, mode=mode, params=self.params) File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/linear.py", line 220, in _linear_classifier_model_fn loss = loss_fn(logits, targets) File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/linear.py", line 141, in _log_loss_with_two_classes logits, math_ops.to_float(target)) File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 661, in to_float return cast(x, dtypes.float32, name=name) File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 616, in cast return gen_math_ops.cast(x, base_type, name=name) File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 419, in cast result = _op_def_lib.apply_op("Cast", x=x, DstT=DstT, name=name) File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 749, in apply_op op_def=op_def) File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2380, in create_op original_op=self._default_original_op, op_def=op_def) File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1298, in __init__ self._traceback = _extract_stack() UnimplementedError (see above for traceback): Cast string to float is not supported [[Node: ToFloat = Cast[DstT=DT_FLOAT, SrcT=DT_STRING, _device="/job:localhost/replica:0/task:0/cpu:0"](Reshape_1)]] 

El modelo es una adaptación del tutorial desde aquí:
https://www.tensorflow.org/versions/r0.11/tutorials/wide/index.html
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/learn/wide_n_deep_tutorial.py

El código del tutorial se ejecuta, por lo que no es un problema con mi instalación de tensorflow.

El CSV de entrada son datos en forma de muchas columnas categóricas binarias (sí / no). Inicialmente, representé los datos en cada columna como 0 y 1, pero obtengo el mismo error cuando lo cambio por “y” y “n”.

¿Cómo puedo solucionar esto?
Puedo proporcionar más información sobre mi código si eso ayudará a diagnosticar y solucionar el problema.

Tuve exactamente el mismo problema, debe asegurarse de que los datos de entrada que está alimentando el modelo estén en el formato correcto. (no solo las características sino también la columna de la etiqueta)

Mi problema fue que no estaba saltando la primera fila en el archivo de datos, así que estaba tratando de convertir los títulos a formato flotante. Algo tan simple como agregar

 skiprows=1 

Al leer el csv:

 df_test = pd.read_csv(test_file, names=COLUMNS_TEST, skipinitialspace=True, skiprows=1, engine="python") 

Te recomendaría que compruebes:

 df_test.dtypes 

Deberías conseguir algo como

 Feature1 int64 Feature2 int64 Feature3 int64 Feature4 object Feature5 object Feature6 float64 dtype: object 

Si no obtiene el dtype correcto, entonces el model.fit va a fallar

Literalmente, no puede convertir una cadena a un número, particularmente “y”, “n” a 1.0 / 0.0.

Si tiene cadenas numéricas (p. Ej., “0”) podría intentar tf.string_to_number(..)

El problema es que probablemente haya indicado la característica como un tipo real, pero en su dataframe todavía es una cadena o cuando se configuró en tf.constant no se convirtió al tipo correcto.

Confirma los tipos de tus columnas. Puede verificar solo el tipo (df es su dataframe):

 df.info() 

Y puedes ver todas las columnas y tipos, algunos como ese:

  RangeIndex: 178932 entries, 0 to 178931 Data columns (total 64 columns): d_prcp 178932 non-null float64 d_stn 178932 non-null int64 ws_lat 178932 non-null float64 ws_lon 178932 non-null float64 d_year 178932 non-null int64 d_temp 178932 non-null float64 ... 

Puede utilizar esta función de abajo para convertir sus datos en el tipo correcto en tensorflow . (este código es de un representante de google / training-data-analyst : enlace aquí )

 def make_input_fn(df): def pandas_to_tf(pdcol): # convert the pandas column values to float t = tf.constant(pdcol.astype('float32').values) # take the column which is of shape (N) and make it (N, 1) return tf.expand_dims(t, -1) def input_fn(): # create features, columns features = {k: pandas_to_tf(df[k]) for k in FEATURES} labels = tf.constant(df[TARGET].values) return features, labels return input_fn def make_feature_cols(): input_columns = [tf.contrib.layers.real_valued_column(k) for k in FEATURES] return input_columns 

Estoy usando W10, Python3 y Tensorflow 1.9

La fuente del error en mi código estaba en la definición de la característica. Tenía una característica booleana con un valor default_value de -1 como este:

 tf.feature_column.categorical_column_with_vocabulary_list( key='partial_funding_indicator', vocabulary_list=['True', 'False'], dtype=tf.string, **default_value=-1**, num_oov_buckets=None) 

El problema no surgió cuando el valor default_value se cambió a 0 :

 tf.feature_column.categorical_column_with_vocabulary_list( key='partial_funding_indicator', vocabulary_list=['True', 'False'], dtype=tf.string, **default_value=0**, num_oov_buckets=None) 

default_value es el valor de ID de entero que se devolverá para valores de características fuera de vocabulario. Por ejemplo, en una lista / archivo de valor como ['True', 'False'] para que default_value == True , sería default_value=0 ; el índice de la lista.

Sus clases probablemente estén en formato de cadena y deben ser numéricas (1 y 0 solo para este tutorial específico)

Normalmente este error se debe a que m.evaluate está de alguna manera vacío.

Dado que carga sus datos desde un archivo csv, es muy probable que sus datos se hayan almacenado como una cadena en lugar de flotar o int dentro de la matriz. Te sugiero que lo compruebes manualmente para asegurarte.