Разреженные матрицы в текстовой классификации tensorflow python

Я пытался реализовать процедуру классификации текста, используя пакет tensorflow в python. У меня уже была успешная версия персептрона, работающая в среде scikit-learn, но scikit-learn не имеет многослойных нейронных сетей (за исключением какой-то мифической версии 0.18, которую я нигде не могу найти/установить).

Я подумал, что лучше сначала попробовать что-то более простое в tensorflow, чтобы узнать, как работает пакет и что он может и чего не может делать, поэтому я пошел с ближайшими соседями. Пока все хорошо, за исключением того, что я просто не могу найти способ скормить разреженную версию словарной матрицы (векторизация текстов с помощью мешков слов) заполнителю в тензорном потоке (в scikit-learn это не проблема вообще ). Преобразование словарной матрицы в плотную матрицу решает проблему, но сильно замедляет работу алгоритма и забивает оперативную память.

Есть ли способ обойти это? Из того, что я нашел в Интернете, кажется, что тензорный поток имеет очень ограниченную поддержку разреженных объектов (только определенные операции будут принимать их в качестве входных данных), но я надеюсь, что ошибаюсь.

P.S. Да, я прочитал эту тему, и это не решило мою проблему. И да, я знаю, что могу придерживаться персептрона scikit-learn или выбрать другой пакет, но это решение, которое я приму на основе ответов, которые я здесь получу.


person Bubba    schedule 16.03.2016    source источник
comment
Почему бы не использовать возможность встраивания слов, доступную в тензорном потоке?   -  person j314erre    schedule 16.03.2016
comment
Использует ли это трюк с хешированием (это требуется для моего проекта) и ведет ли он себя как разреженная память объекта/в плане обработки?   -  person Bubba    schedule 16.03.2016


Ответы (1)


С 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: разреженный заполнитель . После первого слоя остальные слои нейронной сети будут плотной матрицей.

person Shawn    schedule 15.03.2017