Построение SVM с Tensorflow
в настоящее время у меня есть два массива 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 ответов
вот пример использования 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 нужны идентификаторы строк. Вы, вероятно, можете заменить back infer_real_valued_columns_from_input, но вам нужно будет передать ему словарь, чтобы он выбрал правильное имя для столбца. В этом случае концептуально проще просто построить столбец объектов самостоятельно.
- ключ 
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) 
===============обновлено==============
- мой обновленный ответ будет специфичен для вашей ошибки
 - как говорится в ошибке 
self.nameявляется пустой строкой, и эта пустая строка отсутствует в вашем словаре, который вы передаете вinfer_real_valued_columns_from_inputсоздает_RealValuedColumnобъект - так что я нашел, отладив ошибку, что 
tf.contrib.learn.infer_real_valued_columns_from_input(X)X, что вы pass должен быть словарем, чтобыself.nameof_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.- надеюсь, вы удалите свой голос вниз