我一直在尝试使用python中的tensorflow包实现文本分类例程。我已经有一个成功的感知器版本在scikit-learn环境中工作,但scikit-learn没有多层神经网络(除了一些神秘版本0.18,我似乎无法在任何地方找到/安装)。
我认为最好首先在tensorflow中尝试更简单的方法,以了解包的工作原理以及它能做什么和不能做什么,所以我和最近的邻居一起去了。到目前为止一切都那么好,除了我无法找到一种方法来将稀疏版本的词汇矩阵(文本的词袋矢量化)提供给张量流中的占位符(在scikit中 - 学习这根本不是问题)。将词汇表矩阵转换为密集矩阵可以解决问题,但会严重降低算法速度并阻塞RAM。
这有什么办法吗?从我在网上发现的情况来看,似乎tensorflow对稀疏对象的支持非常有限(只有某些操作会接受它们作为输入),但我希望我错了。
P.S。是的,我读了this线程,但它没有解决我的问题。是的,我知道我可以坚持使用scikit-learn的感知器或选择另一个包,但这是我根据我得到的答案做出的决定。
答案 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。在第一层之后,其他层的神经网络将是密集矩阵。