web-dev-qa-db-ja.com

文字列をフロートにキャストすることは線形モデルではサポートされていません

私の線形モデルでこのエラーが発生し続けます。

文字列をフロートにキャストすることはサポートされていません

具体的には、エラーは次の行にあります。

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

モデルは here および here のチュートリアルを適応させたものです。チュートリアルコードは実行されるので、TensorFlowのインストールに問題はありません。

入力CSVは、多くのバイナリカテゴリ列(yes/no)の形式のデータです。最初は、各列のデータを0と1で表しましたが、ysとnsに変更すると同じエラーが発生します。

どうすれば修正できますか?

13
user3764124

まったく同じ問題が発生しました。モデルに入力する入力データが正しい形式であることを確認する必要があります。 (機能だけでなく、ラベル列も)

私の問題は、データファイルの最初の行をスキップしていなかったため、タイトルを浮動小数点形式に変換しようとしていました。

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は失敗します

5
Fgblanch

文字列を文字列から数値、特に "y"、 "n"に1.0/0.0にキャストすることはできません。

数値文字列(たとえば、「0」)がある場合、 tf.string_to_number(..) を試すことができます

2
Mark McDonald

問題は、おそらく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でデータを正しいタイプに変換するために、この怒鳴る関数を使用できます。 (このコードはリポジトリからのものです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
2
Andre Araujo

私は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_value0に変更された場合、問題は発生しませんでした:

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になります。リストのインデックス。

1
Tony Shouse

コードのどこかでtf.cast()を使用して文字列を数値に変換していますが、これを行うことはできません。 tf.strings.to_number() に置き換えます。

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

クラスはおそらく文字列形式であり、数値である必要があります(この特定のチュートリアルでは1と0のみ)

0
MahdeTo

通常、このエラーはm.evaluateは何とか空です。

Csvファイルからデータをロードするため、データが配列内にfloatまたはintではなくstringとして格納された可能性が非常に高くなります。手動で確認してください。

0
Qin Heyang