2016-11-30 68 views
6

我有一个Scipy稀疏CSR矩阵,它是从SVM-Light格式的稀疏TF-IDF特征矩阵创建的。功能的数量是巨大的,它是稀疏的,所以我必须使用SparseTensor,否则它太慢了。Scipy稀疏CSR矩阵到TensorFlow SparseTensor - 小批量梯度下降

例如,功能数为5,和样本文件可以是这样的:

0 4:1 
1 1:3 3:4 
0 5:1 
0 2:1 

解析后,训练集是这样的:

trainX = <scipy CSR matrix> 
trainY = np.array([0,1,00]) 

我有两个重要问题:

1)我如何有效地将它转换为SparseTensor(sp_ids,sp_weights),以便使用lookup执行快速乘法(WX):https://www.tensorflow.org/versions/master/api_docs/python/nn.html#embedding_lookup_sparse

2)如何随机化每个时期的数据集并重新计算sp_ids,sp_weights以便我可以为小批量梯度下降进料(feed_dict)。

像逻辑回归这样的简单模型的示例代码将非常感谢。图表将如下:

# GRAPH 
mul = tf.nn.embedding_lookup_sparse(W, X_sp_ids, X_sp_weights, combiner = "sum") # W.X 
z = tf.add(mul, b) # W.X + b 


cost_op = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(z, y_true)) # this already has built in sigmoid apply 
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost_op) # construct optimizer 

predict_op = tf.nn.sigmoid(z) # sig(W.X + b) 
+0

你有没有找到一个更有效的解决方案呢? – Alt

回答

12

我可以回答你的问题的第一部分。

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

首先将矩阵转换为COO格式。然后提取索引,值和形状,并直接将它们传递给SparseTensor构造函数。

+2

而不是tf.SparseTensor在返回语句(它引发了一个例外)我使用tf.SparseTensorValue,它对我很好。 – Ash