python tensorflow文本分类中的稀疏矩阵

时间:2016-03-16 16:11:09

标签: python-3.x tensorflow text-classification

我一直在尝试使用python中的tensorflow包实现文本分类例程。我已经有一个成功的感知器版本在scikit-learn环境中工作,但scikit-learn没有多层神经网络(除了一些神秘版本0.18,我似乎无法在任何地方找到/安装)。

我认为最好首先在tensorflow中尝试更简单的方法,以了解包的工作原理以及它能做什么和不能做什么,所以我和最近的邻居一起去了。到目前为止一切都那么好,除了我无法找到一种方法来将稀疏版本的词汇矩阵(文本的词袋矢量化)提供给张量流中的占位符(在scikit中 - 学习这根本不是问题)。将词汇表矩阵转换为密集矩阵可以解决问题,但会严重降低算法速度并阻塞RAM。

这有什么办法吗?从我在网上发现的情况来看,似乎tensorflow对稀疏对象的支持非常有限(只有某些操作会接受它们作为输入),但我希望我错了。

P.S。是的,我读了this线程,但它没有解决我的问题。是的,我知道我可以坚持使用scikit-learn的感知器或选择另一个包,但这是我根据我得到的答案做出的决定。

1 个答案:

答案 0 :(得分:2)

使用TensorFlow 1.0.1,我可以这样做:

a = sparse.csr_matrix([[0, 1, 2], [5, 0, 0], [0, 0, 5],
                       [10, 1, 0], [0, 0, 4]])
# w = np.arange(6, dtype=np.float32).reshape([3, 2])
a = a.tocoo()

a_ = tf.sparse_placeholder('float32')
w_ = tf.Variable(tf.random_normal([3, 2], stddev=1.0))

a_sum = tf.sparse_reduce_sum(a_, 1)
a_mul = tf.sparse_tensor_dense_matmul(a_, w_)

# Initializing the variables
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    indices = np.array(zip(a.row, a.col), dtype=np.int32)
    values = np.array(a.data, dtype=np.float32)
    shape = np.array(a.shape, dtype=np.int32)

    print sess.run(a_mul, feed_dict={a_: tf.SparseTensorValue(indices, values, shape)})
    w = sess.run(w_)
    print np.dot(a.todense(), w)

您可以在API页面中找到代码:sparse placeholder。在第一层之后,其他层的神经网络将是密集矩阵。