web-dev-qa-db-ja.com

Tensorflowを使用したSVMの構築

私は現在2つのnumpy配列を持っています:

  • X-(157、128)-157セットの128機能
  • Y-(157)-機能セットの分類

これは、これらの機能の線形分類モデルを構築しようとするために書いたコードです。

まず、配列をTensorflowデータセットに適合させました。

train_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": X},
    y=Y,
    num_epochs=None,
    shuffle=True)

次に、SVMモデルをfitしようとしました:

svm = tf.contrib.learn.SVM(
    example_id_column='example_id', # not sure why this is necessary
    feature_columns=tf.contrib.learn.infer_real_valued_columns_from_input(X), # create feature columns (not sure why this is necessary) 
    l2_regularization=0.1)

svm.fit(input_fn=train_input_fn, steps=10)

しかし、これは単にエラーを返します:

WARNING:tensorflow:float64 is not supported by many models, consider casting to float32.
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpf1mwlR
WARNING:tensorflow:tf.variable_op_scope(values, name, default_name) is deprecated, use tf.variable_scope(name, default_name, values)
Traceback (most recent call last):
  File "/var/www/idmy.team/python/train/classifier.py", line 59, in <module>
    svm.fit(input_fn=train_input_fn, steps=10)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/util/deprecation.py", line 316, in new_func
    return func(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 480, in fit
    loss = self._train_model(input_fn=input_fn, hooks=hooks)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 985, in _train_model
    model_fn_ops = self._get_train_ops(features, labels)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 1201, in _get_train_ops
    return self._call_model_fn(features, labels, model_fn_lib.ModeKeys.TRAIN)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 1165, in _call_model_fn
    model_fn_results = self._model_fn(features, labels, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/learn/python/learn/estimators/linear.py", line 244, in sdca_model_fn
    features.update(layers.transform_features(features, feature_columns))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers/python/layers/feature_column_ops.py", line 656, in transform_features
    transformer.transform(column)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers/python/layers/feature_column_ops.py", line 847, in transform
    feature_column.insert_transformed_feature(self._columns_to_tensors)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers/python/layers/feature_column.py", line 1816, in insert_transformed_feature
    input_tensor = self._normalized_input_tensor(columns_to_tensors[self.name])
KeyError: ''

私は何を間違えていますか?

14
maxisme

エラーをスローしないSVMの使用例を次に示します。

import numpy
import tensorflow as tf

X = numpy.zeros([157, 128])
Y = numpy.zeros([157], dtype=numpy.int32)
example_id = numpy.array(['%d' % i for i in range(len(Y))])

x_column_name = 'x'
example_id_column_name = 'example_id'

train_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={x_column_name: X, example_id_column_name: example_id},
    y=Y,
    num_epochs=None,
    shuffle=True)

svm = tf.contrib.learn.SVM(
    example_id_column=example_id_column_name,
    feature_columns=(tf.contrib.layers.real_valued_column(
        column_name=x_column_name, dimension=128),),
    l2_regularization=0.1)

svm.fit(input_fn=train_input_fn, steps=10)

SVM Estimatorに渡される例 文字列IDが必要 。おそらくinfer_real_valued_columns_from_input、ただし、列に適切な名前を選択するために辞書を渡す必要があります。この場合、機能列を自分で作成する方が概念的に簡単です。

11
Allen Lavoie
  • キー_self.name_は、エラーの内容である_column_to_tensors_辞書に存在せず、_self.name_の値は空の文字列です
  • _tf.estimator.inputs.numpy_input_fn_に引数を与えることに失敗したと思います
  • 解決策は、train_input_fn行を次のように変更することです。

    _train_input_fn = tf.estimator.inputs.numpy_input_fn(x=X,
                                                        y=Y,
                                                        num_epochs=None,
                                                        shuffle=True)
    _
  • x引数はnumpy配列でなければならず、辞書を与えていると思います

  • 私は彼らの チュートリアル に固執し、空想をしません

    _real_feature_column = real_valued_column(...)
    sparse_feature_column = sparse_column_with_hash_bucket(...)
    
    estimator = SVM(
        example_id_column='example_id',
        feature_columns=[real_feature_column, sparse_feature_column],
        l2_regularization=10.0)
    
    # Input builders
    def input_fn_train: # returns x, y
        ...
    def input_fn_eval: # returns x, y
        ...
    
    estimator.fit(input_fn=input_fn_train)
    estimator.evaluate(input_fn=input_fn_eval)
    estimator.predict(x=x)
    _

=============== UPDATED ==============

  • 私の更新された答えはあなたのエラーに固有のものです
  • エラーは_self.name_が空の文字列であり、その空の文字列は_infer_real_valued_columns_from_input_オブジェクトを作成する__RealValuedColumn_に渡す辞書に存在しないことを示しています
  • したがって、エラーをデバッグすることで見つけたのは、tf.contrib.learn.infer_real_valued_columns_from_input(X)渡すXは辞書である必要があるため、_self.name_の__RealValuedColumn_オブジェクトは、あなたが渡す辞書
  • これが私がしたことです

    _import tensorflow as tf
    import numpy as np
    
    X = np.array([[1], [0], [0], [1]])
    Y = np.array([[1], [0], [0], [1]])
    
    dic = {"x": X}
    
    train_input_fn = tf.estimator.inputs.numpy_input_fn(
        x=dic,
        y=Y,
        num_epochs=None,
        shuffle=True)
    
    svm = tf.contrib.learn.SVM(example_id_column='x', feature_columns=tf.contrib.learn.infer_real_valued_columns_from_input(dic), l2_regularization=0.1)
    
    svm.fit(input_fn=train_input_fn, steps=10)
    _
  • 今、これは上記のエラーを削除しますが、新しいエラー_TypeError: Input 'input' of 'SdcaFprint' Op has type int64 that does not match expected type of string._を与えます

  • うまくいけば、あなたは下票を削除します
2
Jai