使用Tensorflow构建支持向量机

19

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

我做错了什么?


你能编辑你的问题并发布完整的错误回溯吗? - Niayesh Isky
@NiayeshIsky 已更新 - maxisme
2个回答

17

以下是一个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评估器接受的示例需要字符串ID。您可以可能替换回infer_real_valued_columns_from_input,但您需要传递一个字典,以便它选择正确的列名称。在这种情况下,手动构建特征列在概念上更简单。


4
  • As the error says self.name is an empty string and that empty string is not present in your dictionary that you are passing to infer_real_valued_columns_from_input that creates _RealValuedColumn object

  • So What I found by debugging the error is that the tf.contrib.learn.infer_real_valued_columns_from_input(X) the X that you pass has to be a dictionary so that the self.name of _RealValuedColumn object is initialized by the key of the dictionary that you pass

  • So this is what I did

      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)
    
  • Now this removes the above error an but it gives a new error TypeError: Input 'input' of 'SdcaFprint' Op has type int64 that does not match expected type of string.


感谢您的回复。虽然它似乎只是陈述了我的问题,然后提供了来自TensorFlow的代码片段。 - maxisme
哥们,看清楚我的回答... 你给 x 传了一个字典,但是它需要的是 numpy 数组。 - Jai
不幸的是,那并不是真的。 - maxisme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接