2017-06-23 334 views
0

我是Tensorflow的新手。我正在尝试在使用Tensorflow的python中编写一个函数,该函数在稀疏矩阵输入上运行。通常我会定义一个tensorflow占位符,但显然没有稀疏矩阵的占位符。在Tensorflow函数中使用稀疏矩阵参数

定义一个在tensorflow中对稀疏数据进行操作并将值传递给它的函数的正确方法是什么?

具体而言,我试图重写一个多层感知器的基本例子,在这里找到https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/multilayer_perceptron.py,接受稀疏输入,而不是密集。

作为一个虚拟的例子,你将如何编写一个看起来像这样的函数?

import tensorflow as tf 


x = tf.placeholder("sparse") 
y = tf.placeholder("float", [None, n_classes]) 

# Create model 
def sparse_multiply(x, y): 

    outlayer = tf.sparse_tensor_dense_matmul(x, y) 

    return out_layer 

pred = multiply(x, y) 

# Launch the graph 
with tf.Session() as sess: 
    result = sess.run(pred, feed_dict={x: x_input, y: y_input}) 

有人在链路https://github.com/tensorflow/tensorflow/issues/342建议,作为一种解决方法,传入构造稀疏矩阵所需要的元素,然后创建该函数内的飞稀疏矩阵。这似乎有点冒失,当我试图以这种方式构建它时,我会遇到错误。

任何帮助,特别是与代码的答案,将不胜感激!

回答

0

我想我想通了。我建议的链接实际上确实有效,我只需要纠正所有输入以获得一致的类型。这里是我列在问题中的虚拟示例,编码正确:

import tensorflow as tf 

import sklearn.feature_extraction 
import numpy as np 


def convert_csr_to_sparse_tensor_inputs(X): 
    coo = X.tocoo() 
    indices = np.mat([coo.row, coo.col]).transpose() 
    return indices, coo.data, coo.shape 


X = ____ #Some sparse 2 x 8 csr matrix 

y_input = np.asarray([1, 1, 1, 1, 1, 1, 1, 1]) 
y_input.shape = (8,1) 


x_indices, x_values, x_shape = convert_csr_to_sparse_tensor_inputs(X) 

# tf Graph input 
y = tf.placeholder(tf.float64) 
values = tf.placeholder(tf.float64) 
indices = tf.placeholder(tf.int64) 
shape = tf.placeholder(tf.int64) 

# Create model 
def multiply(values, indices, shape, y): 

    x_tensor = tf.SparseTensor(indices, values, shape)  

    out_layer = tf.sparse_tensor_dense_matmul(x_tensor, y) 


    return out_layer 

pred = multiply(values, indices, shape, y) 

# Launch the graph 
with tf.Session() as sess: 
    result = sess.run(pred, feed_dict={values: x_values, indices: x_indices, shape: x_shape, y: y_input})