Tensorflow:SVM估计器的稀疏数据输入管道 导言:
我试图用稀疏数据训练tensorflow svm估计器Tensorflow:SVM估计器的稀疏数据输入管道 导言:,tensorflow,classification,svm,sparse-matrix,Tensorflow,Classification,Svm,Sparse Matrix,我试图用稀疏数据训练tensorflow svm估计器tensorflow.contrib.learn.python.learn.estimators.svm。github repo上稀疏数据的示例使用,位于tensorflow/contrib/learn/python/learn/estimators/svm#u test.py#L167(我不允许发布更多链接,因此这里是相对路径) svm估计器期望作为参数example\u id\u column和feature\u column,其中特征列
tensorflow.contrib.learn.python.learn.estimators.svm
。github repo上稀疏数据的示例使用,位于tensorflow/contrib/learn/python/learn/estimators/svm#u test.py#L167
(我不允许发布更多链接,因此这里是相对路径)
svm估计器期望作为参数example\u id\u column
和feature\u column
,其中特征列应派生自类FeatureColumn
,例如tf.contrib.layers.feature\u column.sparse\u column\u和\u hash\u bucket
。参见Github repo(位于tensorflow/contrib/learn/python/learn/estimators/svm.py#L85
)和tensorflow.org(位于python/contrib.layers#Feature#专栏
)上的文档
问题:
a1a
数据集。数据集有123个特征(如果数据密集,则对应于123个特征列)。我编写了一个用户操作来读取数据,比如tf.decode\u csv()
,但是是LIBSVM格式。op以密集张量返回标签,以稀疏张量返回特征。我的输入管道:
NUM_FEATURES=123
批量大小=200
#我的操作用于解析libsvm数据
decode_libsvm_module=tf.load_op_库('./libsvm.so')
def输入_管道(文件名_队列、批大小):
使用tf.name_作用域(“输入”):
reader=tf.TextLineReader(name=“TextLineReader”)
_,libsvm_row=reader.read(filename_queue,name=“libsvm_row”)
出列后的最小值=1000
容量=出列后的最小容量+3*批量大小
batch=tf.train.shuffle\u batch([libsvm\u row],batch\u size=batch\u size,
容量=容量,
出列后最小值=出列后最小值,
name=“text\u line\u batch”
标签、sp_索引、sp_值、sp_形状=\
解码\u libsvm\u模块。解码\u libsvm(记录=批次,
num_features=123,
OUT_TYPE=tf.int64,
name=“Libsvm\u已解码”)
#将特征返回为稀疏张量,将标签返回为稠密张量
返回tf.SparseTensor(sp_索引、sp_值、sp_形状)、标签
是一个批大小为5的示例批
def输入(数据集名称):
也许下载
filename\u queue\u train=tf.train.string\u input\u producer([dataset\u name],
name=“队列”
特征、标签=输入管道(文件名、队列、批量大小)
返回{
'example_id':tf.as_字符串(tf.range(1123,1,dtype=tf.int64)),
“功能”:功能
},标签
这就是我迄今为止所尝试的:
将tf.Session()作为默认值()作为sess:
sess.run(tf.global\u variables\u initializer())
coord=tf.train.Coordinator()
线程=tf.train.start\u queue\u runner(sess=sess,coord=coord)
feature\u column=tf.contrib.layers.sparse\u column\u与\u hash\u bucket(
“功能”,散列(bucket大小=1000,dtype=tf.int64)
svm\u分类器=svm.svm(特征列=[特征列],
示例\u id\u column='example\u id',
l1_正则化=0.0,
l2_正则化=1.0)
svm_分类器.fit(输入_fn=lambda:input_fn(训练),
步骤=30)
精度=svm_分类器。评估(
输入\u fn=λ:输入\u fn(特征、标签),
步骤=1)[“准确度”]
打印(准确性)
协调请求停止()
坐标连接(线程)
sess.close()
下面是一个示例,其中包含虚构的数据,适用于TensorFlow 1.1.0-rc2。我认为我的评论有误导性;您最好将大约100个二进制特征转换为实值特征(tf.sparse\u tensor\u to\u densite
),并使用实值列
,因为sparse\u column\u with\u integerized\u feature
隐藏了SVM估计器的大部分有用信息
import tensorflow as tf
batch_size = 10
num_features = 123
num_examples = 100
def input_fn():
example_ids = tf.random_uniform(
[batch_size], maxval=num_examples, dtype=tf.int64)
# Construct a SparseTensor with features
dense_features = (example_ids[:, None]
+ tf.range(num_features, dtype=tf.int64)[None, :]) % 2
non_zeros = tf.where(tf.not_equal(dense_features, 0))
sparse_features = tf.SparseTensor(
indices=non_zeros,
values=tf.gather_nd(dense_features, non_zeros),
dense_shape=[batch_size, num_features])
features = {
'some_sparse_features': tf.sparse_tensor_to_dense(sparse_features),
'example_id': tf.as_string(example_ids)}
labels = tf.equal(dense_features[:, 0], 1)
return features, labels
svm = tf.contrib.learn.SVM(
example_id_column='example_id',
feature_columns=[
tf.contrib.layers.real_valued_column(
'some_sparse_features')],
l2_regularization=0.1, l1_regularization=0.5)
svm.fit(input_fn=input_fn, steps=1000)
positive_example = lambda: {
'some_sparse_features': tf.sparse_tensor_to_dense(
tf.SparseTensor([[0, 0]], [1], [1, num_features])),
'example_id': ['a']}
print(svm.evaluate(input_fn=input_fn, steps=20))
print(next(svm.predict(input_fn=positive_example)))
negative_example = lambda: {
'some_sparse_features': tf.sparse_tensor_to_dense(
tf.SparseTensor([[0, 0]], [0], [1, num_features])),
'example_id': ['b']}
print(next(svm.predict(input_fn=negative_example)))
印刷品:
{'accuracy': 1.0, 'global_step': 1000, 'loss': 1.0645389e-06}
{'logits': array([ 0.01612902], dtype=float32), 'classes': 1}
{'logits': array([ 0.], dtype=float32), 'classes': 0}
由于TensorFlow 1.5.0有一个内置函数来读取LIBSVM数据, 请参考我的答案
看来你走对了方向。你有整数特征,对吗?对你有用吗?是的,事实上,如果有一个值,它就是“1”,所以基本上是布尔特征。使用带有“集成化”功能的稀疏列,我得到一个
批处理大小=200
的形状错误:无效arguminterror:Expected shape[200,4]例如,“状态”数据,得到[122,4]
()得到错误:警告:tensorflow:tf.variable\u op\u作用域(值、名称、默认名称)已弃用,请使用tf.variable\u作用域(名称,默认名称,值)
但是没有variable\u op\u scope
lol。有什么想法吗?呃。不知道为什么它还在那里(它是FWIW)。实际上,想发出一个拉取请求吗?我想你可以在那一行上键入/variable\u op\u scope/variable\u scope/。