【问题标题】:Cast string to float is not supported in Linear Model线性模型不支持将字符串转换为浮点数
【发布时间】:2017-03-04 08:38:10
【问题描述】:

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

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

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

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

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

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

我该如何解决这个问题?

【问题讨论】:

    标签: python tensorflow model linearmodels


    【解决方案1】:

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

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

    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 将会失败

    【讨论】:

    • 是的,这绝对是数据类型问题,但这不是因为您包含了列名行。这些是最经常需要的。此错误很可能是由于将分类列解释为数字列。例如。有些特征是对象。
    【解决方案2】:

    问题是您可能已经指出了类似 real 类型的功能,但在您的数据框中仍然是 string 或者在 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-analystlink here

    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
    

    【讨论】:

    • 请在投反对票前发表评论。这行 t = tf.constant(pdcol.astype('float32').values) 可以解决问题的主要问题。
    【解决方案3】:

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

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

    【讨论】:

    • 链接无效。这是新的https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/strings/to_number
    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

      我正在使用 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'] 这样的值列表/文件中,要生成default_value == True,它将是default_value=0;列表索引。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 你能再具体一点吗?您是指输入中的类还是模型中的类?
        • 这里的类是指标签,这个例子只适用于二元分类问题,标签必须是特定的数字并且只有 0 或 1
        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

          tf.strings.to_number(x, out_type=tf.float32)
          

          【讨论】:

            【解决方案9】:

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

            df_test.dtypes
            

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

            【讨论】:

              【解决方案10】:

              另一种方法是使用

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

              对于数据框

              【讨论】:

                【解决方案11】:

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

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

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

                【讨论】:

                • 你应该仔细阅读这个问题。错误显示Cast string to float is not supported 表示数据实际上是string,但它不知道如何将该字符串数据转换为float。请参考How do I write a good answer?
                • @nobleknight 我知道兄弟,我给了他解决方案,以解决在相同情况下发生在我身上的相同错误以及我为解决此错误所做的工作,数据可能是字符串,但提取此数据的问题.
                猜你喜欢
                • 2022-06-28
                • 2020-08-11
                • 1970-01-01
                • 2019-03-02
                • 1970-01-01
                • 2011-11-25
                • 2021-08-27
                • 1970-01-01
                • 2018-09-14
                相关资源
                最近更新 更多