web-dev-qa-db-fra.com

Python Tensorflow Cast string pour float n'est pas pris en charge dans le modèle linéaire

Je continue à avoir cette erreur dans mon modèle linéaire:

La chaîne de caractères à float n'est pas prise en charge

Plus précisément, l'erreur est sur cette ligne:

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

Si cela vous aide, voici la trace de la pile:

 File "tensorflowtest.py", line 164, in <module>
    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)]]


Le modèle est une adaptation du tutoriel à partir d’ici:
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

Le code du didacticiel s'exécute, donc ce n'est pas un problème avec l'installation de mon tensorflow. 

Le fichier CSV en entrée est constitué de données sous la forme de nombreuses colonnes catégorielles binaires (oui/non). Initialement, je représentais les données dans chaque colonne sous forme de 0 et de 1, mais je reçois la même erreur lorsque je le change en "y" et en "n".

Comment puis-je réparer ça?
Je peux fournir plus d'informations sur mon code s'il permet de diagnostiquer et de résoudre le problème. 

10
user3764124

J'ai eu exactement le même problème, vous devez vous assurer que les données d'entrée que vous alimentez le modèle sont dans le bon format. (pas seulement les caractéristiques mais aussi la colonne de l'étiquette)

Mon problème était que je ne sautais pas la première ligne du fichier de données. J'essayais donc de convertir les titres au format float. Quelque chose d'aussi simple que d'ajouter 

skiprows=1

En lisant le csv:

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

Je vous recommanderais de vérifier:

df_test.dtypes

Vous devriez obtenir quelque chose comme 

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

Si vous n'obtenez pas le bon type, le model.fit va échouer

5
Fgblanch

Vous ne pouvez pas littéralement transformer une chaîne en nombre, en particulier "y", "n" à 1.0/0.0.

Si vous avez des chaînes numériques (par exemple, "0"), vous pouvez essayer tf.string_to_number(..)

2
Mark McDonald

Le problème est que vous avez probablement indiqué la fonctionnalité comme un type real mais que votre cadre de données est toujours string ou que, lorsqu'il est défini dans tf.constant, vous n'avez pas transtypé le type correct. 

Confirmez les types de vos colonnes. Vous pouvez simplement cocher la forme (df est votre cadre de données):

df.info()

Et vous pouvez voir toutes les colonnes et tous les types, certains comme ça:

<class 'pandas.core.frame.DataFrame'>
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
...

Vous pouvez utiliser cette fonction ci-dessous afin de convertir vos données en un type correct dans tensorflow. (ce code provient d'un repo google/training-data-analyst): lien ici

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
2
Andre Araujo

J'utilise W10, Python3 et Tensorflow 1.9

La source de l'erreur dans mon code était dans la définition de fonctionnalité. J'ai eu une fonctionnalité booléenne avec un default_value de -1 comme ceci:

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)

Le problème ne s'est pas posé lorsque le default_value a été remplacé par 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 est la valeur de l'ID entier à renvoyer pour les valeurs d'entité hors vocabulaire. Par exemple, dans une liste/un fichier de valeur comme ['True', 'False'] pour créer default_value == True, ce serait default_value=0; l'index de la liste.

1
Tony Shouse

Vos classes sont probablement sous forme de chaîne et elles doivent être numériques (1 et 0 uniquement pour ce tutoriel)

0
MahdeTo

Normalement, cette erreur est due au fait que m.evaluate est en quelque sorte vide.

Puisque vous chargez vos données depuis un fichier csv, il est très probable que vos données aient été stockées sous forme de chaîne au lieu de float ou int dans le tableau. Je vous suggère de vérifier manuellement pour vous en assurer.

0
Qin Heyang