Python 用张量流建立支持向量机
我目前有两个numpy阵列:Python 用张量流建立支持向量机,python,tensorflow,machine-learning,svm,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) 然后我尝试拟合一个SVM模型: svm = tf.co
-(157,128)-157套128项功能X
-(157)-要素集的分类Y
train_input_fn = tf.estimator.inputs.numpy_input_fn(
x={"x": X},
y=Y,
num_epochs=None,
shuffle=True)
然后我尝试拟合
一个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: ''
<代码>警告:TooSoFrase:许多模型不支持FLUAT64,考虑将FLUAT32转换为FLUAT32。
警告:tensorflow:使用临时文件夹作为模型目录:/tmp/tmpf1mwlR
警告:tensorflow:tf.variable\u op\u scope(值、名称、默认名称)已弃用,请使用tf.variable\u scope(名称、默认名称、值)
回溯(最近一次呼叫最后一次):
文件“/var/www/idmy.team/python/train/classifier.py”,第59行,在
svm.fit(输入值=训练值,步数=10)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/python/util/deprecation.py”,第316行,在new_func中
返回函数(*args,**kwargs)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py”,第480行
损耗=自身。\列车\模型(输入\ fn=输入\ fn,挂钩=挂钩)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py”,第985行,列车模型
型号(功能、标签)
文件“/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py”,第1201行,在“获取”操作中
返回self.\u调用\u model\u fn(特性、标签、model\u fn\u lib.ModeKeys.TRAIN)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py”,第1165行,在调用模型fn中
模型\结果=自身。\模型\结果(特征、标签,**kwargs)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/contrib/learn/python/learn/estimators/linear.py”,第244行,sdca_model_fn
要素。更新(图层。变换要素(要素、要素列))
文件“/usr/local/lib/python2.7/dist packages/tensorflow/contrib/layers/python/layers/feature_column_ops.py”,第656行,在transform_features中
transformer.transform(列)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/contrib/layers/python/layers/feature_column_ops.py”,第847行,在转换中
特征列。插入转换的特征(自列到张量)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/contrib/layers/python/layers/feature\u column.py”,第1816行,插入\u转换\u功能
输入张量=self.\u规范化输入张量(列到张量[self.name])
密钥错误:“”
我做错了什么?- 键
不在self.name
字典中,这就是错误所在,column\u to\u tensors
的值为空字符串self.name
- 我想你把参数给了
tf.estimator.inputs.numpy\u input\u fn
- 解决方案可能是将列车输入线路更改为
train_input_fn = tf.estimator.inputs.numpy_input_fn(x=X, y=Y, num_epochs=None, shuffle=True)
- 我认为
参数必须是一个numpy数组,你给它一个字典x
- 我将坚持他们的观点,不做任何幻想
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
的字典中,该字典从创建
对象的输入中推断出实值列\u reallvaluedcolumn
- 因此,我通过调试错误发现,
传递的X必须是一个字典,这样,tf.contrib.learn.experte\u real\u valued\u columns\u from\u input(X)
对象的\u RealValuedColumn
由传递的字典的键初始化self.name
- 这就是我所做的
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:“SdcaFprint”Op的Input“Input”的类型int64与预期的字符串类型不匹配。
- 希望你取消你的否决票
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估计器。您可能可以替换回
从\u输入推断\u实值\u列\u,但您需要向它传递一个字典,以便它为列选择正确的名称。在这种情况下,从概念上讲,只需自己构建功能栏就更简单了。您可以编辑您的问题并发布错误的完整回溯吗?@NiayeshIsky UpdatedHanks,以获取您的回答。虽然它似乎只是说明了我的问题是什么,然后是tensorflow的一段代码片段。伙计,看看我的答案吧。。。。当x需要numpy数组时,你正在给它一本字典。幸运的是,这不是真的。