Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow:SVM估计器的稀疏数据输入管道 导言:_Tensorflow_Classification_Svm_Sparse Matrix - Fatal编程技术网

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 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
,其中特征列应派生自类
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#专栏
)上的文档

问题:
  • 如何设置输入管道以格式化稀疏数据,以便使用tf.contrib.layers feature_列之一作为svm估计器的输入
  • 一个具有许多特性的密集输入函数会是什么样子
  • 背景 我使用的数据是来自的
    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/。