2017-05-29 5 views
0

テンソルフローの各入力フィーチャにマスクを適用したいと思います。これは、マスクが固定されている場合は非常に簡単です。グラフで定義して適用するだけです。キャッチは、訓練中にマスクを変更したいのですが、それは各訓練ステップごとに若干異なります。実際、各ステップごとに、すべてのステップでマスクを表す数値配列を返す関数があります。マスクテンソルフロー入力データ

多くの試行錯誤と検索の結果、私はこのマスクを適用する方法が見つかっていません。私が関与する限り、テンソルフローの特性によって義務づけられて、グラフが作成されます。

しかし、私はテンソルフローが非常に新しいので、これが可能であり、容易である可能性は非常に高いです。誰でも助けてくれますか?

擬似コードは次のようになります。

build graph with mask as placeholder 
    Loop over training steps 
     numpy_array = my_func(step_number) 
     mask_placeholder = something(numpy_array)* 
     Session.run([my graph(mask_placeholder)])* 

私が何をするか分からないところ星があります。

答えて

0

TensorFlow graphの一部としてマスク操作ロジックを追加する必要があります。具体的には、control flow operators tf.case tf.logical_or、およびtf.logical_andのように、モデルが実行されているときに、条件付きで目的のデータを選択することができます。

たとえば、次のコードは、2つのトレーニングデータまたはラベル入力の状態に基づいて4要素テンソルを作成する方法を示しています。あなたはあなたの状況に同様のロジックを適用することができるはずです。

def const_v(val): 
    return tf.constant(val, tf.float32) 

def const_1(): 
    return const_v(1) 

def const_0(): 
    return const_v(0) 

def cond_and(cond_1, cond_2, val_1, val_2): 
    return tf.logical_and(tf.equal(cond_1, val_1), 
          tf.equal(cond_2, val_2)) 

def vec4(c1, c2, c3, c4): 
    return [const_v(c1), const_v(c2), const_v(c3), const_v(c4)] 

# c1 c2 vector 
# 1 1 [1, 0 , 0 ,0] 
# 1 0 [0, 1, 0, 0] 
# 0 1 [0, 0, 1, 0] 
# 0 0 [0, 0, 0, 1] 

def combined_conditions(cond_1, cond_2): 
    return tf.stack(tf.case({cond_and(cond_1, cond_2, const_1(), const_1()): lambda: vec4(1, 0, 0, 0), 
        cond_and(cond_1, cond_2, const_1(), const_0()): lambda: vec4(0, 1, 0, 0), 
        cond_and(cond_1, cond_2, const_0(), const_1()): lambda: vec4(0, 0, 1, 0), 
        cond_and(cond_1, cond_2, const_0(), const_0()): lambda: vec4(0, 0, 0, 1) 
        }, default=lambda: vec4(0, 0, 0, 0), exclusive=True)) 
+0

これは、このトリックを行うことはわかりません。具体的な例を挙げておきます。私の特徴が長さ100,000のベクトルであるとします。私は10万歩のトレーニングをしています。各ステップでは、1と0のマスクベクトルで入力フィーチャをマスクする必要があります。その数は、トレーニングステップ数だけです。グラフは何とかこの数を知り、各ステップで新しいマスクを作成する必要があります。入力データセット自体から必要な数を集めることはできません。 –

+0

私はそれらを使ったことはありませんが、[トレーニングユーティリティ](https://www.tensorflow.org/versions/master/api_guides/python/train#Training_Utilities)の機能の1つからトレーニングステップを得ることができます。 - tf.train.get_global_stepまたはtf.train.global_step。これに加えて、グラフロジックとPythonを使ってあなたの問題を解決できるかもしれません。 –

1

これはちょうどnumpyで簡単にできるようです。実際には、私は私には些細ではないがテンソルフローでは難しいような何かをしたいという状況がありました。具体的には、これらの要素の値に基づいてテンソルの特定の要素に数学的関数を適用したいと考えました。 EG:「Aがゼロ以上であるAは、AのログプラスAがゼロより大きい1に等しい」のようなものに変換

array_a[array_a > 0] = np.log(array_a + 1)[array_a > 0]

私が発見するまでテンソルフローで成功しなかったtf.py_funchttps://www.tensorflow.org/api_docs/python/tf/py_funcでpy_funcの説明によれば、

「TensorFlowグラフで動作として、この機能をラップその入力としてnumpyの配列を受け取り、その出力としてnumpyの配列を返すPythonの関数funcを、考える。」

自分の状況にこれを適用する

だから、あなたは

def tf_mask(the_tensor,the_mask): 
    def np_mask(a,b): 
     return a[b] 
    return tf.py_func(np_mask, [the_tensor,the_mask], tf.float32) 

ような何かを行うことができたり、配列の形状を保持したい場合は、

ような何かを
def tf_mask(the_tensor,the_mask): 
    def np_mask(a,b): 
     a[b == 0] = 0 
     return a 
    return tf.py_func(np_mask, [the_tensor,the_mask], tf.float32) 

要約すると、numpyでそれを行う方法を見つけ、py_funcを使用します。 Numpyはかなり強力で、Tensorflowでそのパワーを発揮できるのは素晴らしいことです。