Reputation: 4265
I currently have two numpy arrays:
X
- (157, 128) - 157 sets of 128 featuresY
- (157) - classifications of the feature setsThis is the code I have written to attempt to build a linear classification model of these features.
First of all I adapted the arrays to a Tensorflow dataset:
train_input_fn = tf.estimator.inputs.numpy_input_fn(
x={"x": X},
y=Y,
num_epochs=None,
shuffle=True)
I then tried to fit
an SVM model:
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)
But this just returns the error:
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: ''
What am I doing wrong?
Upvotes: 19
Views: 40709
Reputation: 3300
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.
Upvotes: 4
Reputation: 5808
Here's an SVM usage example which does not throw an error:
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)
Examples passed to the SVM Estimator need string IDs. You can probably substitute back infer_real_valued_columns_from_input
, but you would need to pass it a dictionary so it picks up the right name for the column. In this case it's conceptually simpler to just construct the feature column yourself.
Upvotes: 18