2017-06-15 13 views
1

私はMxNetを使用して条件付きコンピューティングフレームワークに取り組んでいます。 minibatchにN個のサンプルがあると仮定します。私は擬似コードを使用して、私の計算グラフでの操作のような種類を実行する必要があります。Tensorflowでは条件付き計算が可能ですか?

x = graph.Variable("x") 
y = graph.DoSomeTranformations(x) 
# The following operation generates a Nxk sized matrix, k responses for each sample. 
z = graph.DoDecision(y) 
for i in range(k): 
    argmax_sample_indices_for_i = graph.ArgMaxIndices(z, i) 
    y_selected_samples = graph.TakeSelectedSample(y, argmax_sample_indices_for_i) 
    result = graph.DoSomeTransformations(y_selected_samples) 

私は何を達成したいことは以下の通りです:I yを取得した後、私は決定関数を適用する(これはkにDすることができDがデータ次元である完全接続層)、N個のミニバッチで各サンプルのk個のアクティベーションを得る。次に、各サンプルの最大有効化の列インデックスに基づいて、minibatchをk個の異なる部分に動的に分割したい(kは2、3、少数でもよい)。私のhypothetic "graph.ArgMaxIndices"関数は、与えられたzがNxkサイズの行列であり、関数iは列iに沿って最大の活性化を与え、そのインデックスを返すサンプルインデックスを探します。 (私は、特にgraph.ArgMaxIndicesと同等の結果を与える一連の関数や関数の組み合わせを探すことに注意してください。最後に、各iについて、最大の活性化を持つサンプルを選択し、それらに特定の変換を適用します。現在、私の知る限り、MxNetはそのような種類の条件付き計算をシンボリックネットワークでサポートしていません。したがって、私はそれぞれの決定の後に別々のシンボリックグラフを作成し、別々の簿記をコーディングしなければなりませんでした - 1)非常に複雑で厄介なコードの作成と開発2)訓練と評価中のパフォーマンスの低下。

私の質問は、上記のTensorflowの記号演算子を使用して行うことができますか?それは、基準に基づいて、ミニセットのサブセットを選択することを可能にするか?上記の擬似コードの "graph.ArgMaxIndices"と同等の関数または一連の関数がありますか? (Nxk行列と列インデックスiが与えられた場合、行kの最大活性化を有する行のインデックスを返す)。

答えて

2

これはTensorflowで行うことができます。

私が見る最良の方法は、i番目のマスクは、我々がboolean_maskを使用する場合、Tensorflowは次の中で、これらのサンプルの計算を省略んtf.equal(i, tf.argmax(z, axis=-1))

x = graph.Variable("x") 
y = graph.DoSomeTranformations(x) 
# The following operation generates a Nxk sized matrix, k responses for each sample. 
z = graph.DoDecision(y) 
max_indices = tf.argmax(z, axis=-1) 
for i in range(k): 
    argmax_sample_indices_for_i = tf.equal(i, max_indices) 
    y_selected_samples = tf.boolean_mask(y, mask=argmax_sample_indices_for_i) 
    result = graph.DoSomeTransformations(y_selected_samples) 
+0

によって与えられた状態で、マスクとtf.boolean_maskk回を使用しています層?つまり、このk-ary分割後のバッチ正規化などのバッチ単位の操作には含めないでください。 –

+1

はい、tf.boolean_maskの結果は、基本的にテストに合格した要素のリストです。残りは0に設定されず、テンソルから完全に削除されます。入力yの形が '(batch_size、d1、d2、...、dn)'の場合、 'y_selected_samples'は'(number_of_samples_selected、d1、...、dn) 'の形になります。だから、 'y_selected_samples'に起こったすべての計算では、実際には選択されていないサンプルが存在しないかのようです。 – gdelab

+1

これは非常に有益な答えでした。私はTensorflowへの移行を早急にする必要があるようです... –

関連する問題