2016-11-30 11 views
6

У меня есть Scipy разреженная матрица CSR, созданная из разреженной матрицы функций TF-IDF в формате SVM-Light. Количество функций огромно и мало разрешено, поэтому я должен использовать 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) эффективно, чтобы выполнить быстрое умножение (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

 Смежные вопросы

  • Нет связанных вопросов^_^