web-dev-qa-db-ja.com

ScipyのスパースCSR行列からTensorFlowSparseTensorへ-ミニバッチ最急降下法

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] )

2つの重要な質問があります。

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)
10
Salman Mohammed

私はあなたの質問の最初の部分に答えることができます。

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コンストラクターに直接渡します。

27
Dave DeCaprio