首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >线性模型中不支持将字符串转换为浮点数

线性模型中不支持将字符串转换为浮点数
EN

Stack Overflow用户
提问于 2016-10-22 07:27:27
回答 11查看 47.5K关注 0票数 21

我一直在我的线性模型中得到这个错误:

不支持将

转换为浮点型字符串

具体地说,错误在这一行上:

代码语言:javascript
复制
results = m.evaluate(input_fn=lambda: input_fn(df_test), steps=1)

如果有帮助,下面是堆栈跟踪:

代码语言:javascript
复制
 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时,我得到了相同的错误。

我该如何解决这个问题?

EN

回答 11

Stack Overflow用户

发布于 2016-12-06 19:58:42

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

我的问题是我没有跳过数据文件中的第一行,所以我试图将标题转换为浮点型format.Something,就像添加

代码语言:javascript
复制
skiprows=1

读取csv时:

代码语言:javascript
复制
df_test = pd.read_csv(test_file, names=COLUMNS_TEST, skipinitialspace=True, skiprows=1, engine="python")

我建议你检查一下:

代码语言:javascript
复制
df_test.dtypes

你应该得到像这样的东西

代码语言:javascript
复制
Feature1      int64
Feature2      int64
Feature3      int64
Feature4      object
Feature5      object
Feature6      float64
dtype: object

如果您未获得正确的数据类型,则model.fit将失败

票数 15
EN

Stack Overflow用户

发布于 2018-01-21 03:13:51

问题是您可能已经指出了类似于真正的类型的特性,但是在您的数据框中仍然是string,或者当在tf.constant中设置时,您没有转换为正确的类型。

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

代码语言:javascript
复制
df.info()

您可以看到所有列和类型,其中一些如下所示:

代码语言:javascript
复制
<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:link here)

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2016-10-22 10:36:16

你不能从字面上把一个字符串转换成一个数字,特别是"y","n“到1.0/0.0。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40186722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档