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.
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
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(..)
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
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.
Vos classes sont probablement sous forme de chaîne et elles doivent être numériques (1 et 0 uniquement pour ce tutoriel)
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.