使用Tensorflow构建SVM

时间:2018-03-24 14:32:38

标签: python tensorflow machine-learning svm

我目前有两个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)

然后我尝试fit SVM模型:

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: ''

我做错了什么?

2 个答案:

答案 0 :(得分:9)

这是一个不会引发错误的SVM用法示例:

Imports Microsoft.Office.Interop.Word

传递给SVM Estimator need string IDs的示例。您可以替换回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) ,但是您需要将其传递给字典,以便为该列选择正确的名称。在这种情况下,它在概念上更简单,只需自己构建功能列。

答案 1 :(得分:2)

  • 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数组,你给它一个字典

  • 我会坚持他们的tutorial并且不做任何幻想

    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)
    

===============修订==============

  • 我的更新回答将特定于您的错误
  • 由于错误显示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.

  • 希望你删除你的投票