21

我的线性模型中不断出现此错误:

不支持将字符串转换为浮点数

具体来说,错误在这一行:

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

如果有帮助,这里是堆栈跟踪:

 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)]]

该模型是改编自此处此处的教程。教程代码确实可以运行,所以我的 TensorFlow 安装没有问题。

输入 CSV 是许多二进制分类列 ( yes/ no) 形式的数据。最初,我将每列中的数据表示为 0 和 1,但是当我将其更改为ys 和ns 时,我得到了同样的错误。

我该如何解决?

4

11 回答 11

15

我遇到了完全相同的问题,您需要确保为模型提供的输入数据格式正确。(不仅是特征,还有标签列)

我的问题是我没有跳过数据文件中的第一行,所以我试图将标题转换为浮点格式。就像添加一样简单

skiprows=1

读取 csv 时:

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

我建议您检查:

df_test.dtypes

你应该得到类似的东西

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

如果您没有获得正确的 dtype,那么 model.fit 将会失败

于 2016-12-06T11:58:42.103 回答
4

问题是您可能已经将该功能指示为真实 类型,但在您的数据框中仍然是字符串,或者在 tf.constant 中设置时您没有转换为正确的类型。

确认列的类型。您可以只检查类型(df 是您的数据框):

df.info()

你可以看到所有的列和类型,有些像这样:

<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
...

您可以使用此波纹管功能将数据转换为tensorflow中的正确类型。(此代码来自 repo google/training-data-analyst链接在这里

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
于 2018-01-20T19:13:50.570 回答
2

您不能从字面上将字符串转换为数字,尤其是将“y”、“n”转换为 1.0/0.0。

如果您有数字字符串(例如“0”),您可以尝试tf.string_to_number(..)

于 2016-10-22T02:36:16.013 回答
2

当我尝试在不同的数据集上复制这些步骤以进行练习时,我遇到了同样的问题。

修复简单,只需使用以下代码将 TARGET COLUMN 的数据类型更改为 int,

df["target_column_name"] = df["target_column_name"].astype(str).astype(int)

此外,您需要在开始时执行此操作,此时目标列最初位于您的数据文件中。

于 2020-06-12T07:58:50.823 回答
1

我正在使用 W10、Python3 和 Tensorflow 1.9

我的代码中的错误来源在功能定义中。我有一个带有default_value-1 的布尔功能,如下所示:

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)

default_value更改为时未出现此问题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是为词汇外特征值返回的整数 ID 值。例如,在一个类似于['True', 'False']make的列表/文件中default_value == True,它会是default_value=0; 列表索引。

于 2018-08-02T00:47:39.817 回答
0

通常这个错误是因为m.evaluate它是空的。

由于您从 csv 文件加载数据,因此您的数据很可能存储为字符串而不是数组中的浮点或整数。我建议您手动检查以确保。

于 2017-05-08T16:59:49.833 回答
0

您的类可能是字符串形式,它们需要是数字的(1 和 0 仅适用于本特定教程)

于 2016-10-22T17:26:48.343 回答
0

在代码中的某处,您tf.cast()用于将字符串转换为数字,但您不能这样做。将其替换为tf.strings.to_number()

tf.strings.to_number(x, out_type=tf.float32)
于 2019-11-15T13:08:51.527 回答
0

问题是您导入的文件上有一个标题。标题是 type string,其余行是int64or float64。虽然类型在列中是变体,但它们的类型为object. 您可以检查并确保这是此代码的问题:

df_test.dtypes

要解决此问题,您只需在将 CSV 导入到 pyhton 之前从 CSV 中删除标题行。请记住,如果您在导入后删除该行,它将不起作用并且数据类型不会改变!

于 2020-08-15T09:36:54.167 回答
0

另一种方法是使用

df = df.astype({'COL1': 'float64', 'COL2': 'float64'})

对于数据框

于 2021-04-20T13:25:26.317 回答
0

有时原因是您的馈送数据不是字符串格式,这是错误数据的示例

,0
' or x = 1 , 1, 0,1
SELECT * FROM USERS WHERE(1 = 1, 1, 0 = 0,0),1

首先尝试清理您的数据集,老实说,这在我的毕业项目数据集中对我有用

于 2021-06-10T11:47:11.050 回答