繁体   English   中英

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

[英]Cast string to float is not supported in Linear Model

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

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

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

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

model 是对此处此处教程的改编。 教程代码确实运行了,所以我的TensorFlow安装没有问题。

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

我该如何解决?

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

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

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

问题是您可能已经将特征表示为真实类型,但在您的数据框中仍然是字符串,或者在 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

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

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

我正在使用 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 列表索引。

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

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

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

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

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

通常这个错误是因为m.evaluate不知何故是空的。

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

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

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

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

df_test.dtypes

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

另一种方法是使用

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

对于数据框

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

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

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

直接的答案是,您需要在一开始df_test的格式更改为与df_train相同的格式。

例如,

df_train.replace({'yes':1,'no':0}, inplace = True)
    
df_test.replace({'yes':1,'no':0}, inplace = True)  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM