Scipy稀疏矩阵CSR转换为TensorFlow SparseTensor - Mini-Batch梯度下降

19

我有一个来自SVM-Light格式的稀疏TF-IDF特征矩阵创建的Scipy稀疏CSR矩阵。 特征数量非常庞大且稀疏,因此必须使用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)进行快速乘法(W.X):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)
1个回答

43

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

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 构造函数。


3
我使用了tf.SparseTensorValue替换返回语句中的tf.SparseTensor(对我来说会抛出异常),这对我非常有效。 - Ash
4
你可能希望重新排序: return tf.sparse.reorder(tf.SparseTensor(indices, coo.data, coo.shape)) 这样做就可以了。 - M.Winkens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接