2016-11-14 6 views
2

のためのpythonで遅すぎますK個の合計クラスの中から、行列Sを返します。ここで、S.shape = (N,K)(N:与えられたデータの行とKは合計クラスです)。Tensorflowは2を言うことができます、私は<strong>にTensorflow</strong>、与えられたデータXのライン毎に、唯一のいくつかのサンプリングされたクラスに対して<strong>ソフトマックス</strong>関数を適用していることを関数を作成したいループ

最後に、行列Sは、サンプリングされたクラスによってすべての行について定義されたインデックスにゼロとゼロ以外の値を含むことになります。

シンプルなpythonでは、私はという高度な索引付けを使用していますが、Tensorflowではどのように作成するかわかりません。私の最初の質問はthis, where I present the numpy codeでした。

Tensorflowで解を見つけようとしましたが、主なアイデアは2-d行列としてSを1-d配列として使用することではありませんでした。コードは次のようになります。

num_samps = 2 
S = tf.Variable(tf.zeros(shape=(N*K))) 
W = tf.Variable(tf.random_uniform((K,D))) 
tfx = tf.placeholder(tf.float32,shape=(None,D)) 
sampled_ind = tf.random_uniform(dtype=tf.int32, minval=0, maxval=K-1, shape=[num_samps]) 
ar_to_sof = tf.matmul(tfx,tf.gather(W,sampled_ind),transpose_b=True) 
updates = tf.reshape(tf.nn.softmax(ar_to_sof),shape=(num_samps,)) 
init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 
for line in range(N): 
    inds_new = sampled_ind + line*K 
    sess.run(tf.scatter_update(S,inds_new,updates), feed_dict={tfx: X[line:line+1]}) 

S = tf.reshape(S,shape=(N,K)) 

これは動作しており、結果は期待されています。しかし、それはが極端に遅いを実行しています。なぜそれが起こっているのですか?どのように私はその仕事をより速くすることができますか?

答えて

6

テンソルフローでプログラミングするときは、操作の定義と実行の区別を学ぶことが重要です。 tf.で始まる関数のほとんどは、Python で実行すると、演算グラフに演算を追加します。あなたが行うとき

たとえば、:

tf.scatter_update(S,inds_new,updates) 

など:

inds_new = sampled_ind + line*K 

複数回、あなたの計算グラフは、すべてのメモリを充填し、非常に物事を遅くし、必要なものを超えて成長します。あなたの代わりに何をすべき

にあるループの前に、計算を一度を定義します。

init = tf.initialize_all_variables() 
inds_new = sampled_ind + line*K 
update_op = tf.scatter_update(S, inds_new, updates) 
sess = tf.Session() 
sess.run(init) 
for line in range(N): 
    sess.run(update_op, feed_dict={tfx: X[line:line+1]}) 

をこの方法で、あなたの計算グラフはinds_newupdate_opのコピーを1つだけ含まれています。 update_opを実行すると、計算グラフの親であるので、inds_newも暗黙的に実行されることに注意してください。

update_opは、実行するたびに結果が異なることがあり、正常であり、予期されていることも知っておくべきです。

ところで、この種の問題をデバッグする良い方法は、テンソルボードを使用して計算グラフを視覚化することです。コードでは、追加:

summary_writer = tf.train.SummaryWriter('some_logdir', sess.graph_def) 

し、コンソールで実行する:

tensorboard --logdir=some_logdir 

務めたhtmlページにあなたのテンソルを調べることができます計算グラフの絵があるでしょう。

+0

おかげで多くをコピーしないようになるん正確に私の質問に答える!しかし、問題は依然として残っています。マトリックスSを作成するためのコードは、これよりもまだまだ高速です。そして私はテンローロー関数のみを使っています...なぜそれが起こるか知っていますか?私はスピードを上げるためにC++で新しいオペレーションを作成する必要がありますか? –

+0

速くすると20%速くなり、20倍速くなりますか? CPUで20%遅いテンソルフローが予想される動作です。 CUDA対応の優れたGPU(それを使用するテンソルフローインストール)をお持ちですか? Tensorflowは、GPU /クラスタを使用する状況を想定しています。 – sygi

0

tf.scatter_updateはセッション実行時に大きなメモリコピーを意味するTensor S、または分散環境でネットワークコピーさえも意味することに注意してください。解決策は、@ sygiの回答に基づいて、次のとおりです。

update_op = tf.scatter_update(S, inds_new, updates) 
update_op_op = update_op.op 

そして、セッションの実行中に、あなたはこの

sess.run(update_op_op) 

これはこれは、大きなテンソルS.

関連する問題

 関連する問題