2017-05-29 93 views
0

我想对张量流中的每个输入要素应用一个掩码。如果掩模是固定的,这很容易实现 - 只需在图形中定义并应用即可。抓住的是,我希望面罩在训练过程中有所变化 - 每个训练步骤都会略有不同。实际上,对于每一步,我都有一个函数返回一个代表每一步掩码的numpy数组。Mask张量流输入数据

经过大量的试验和错误和搜索,我发现没有办法应用此掩码 - 就我而言,这是不可能的,由tensorflow的属性强制要求修复所有计算属性时该图是建立的。

但是,我对张量流很新,所以很有可能这是可行的,甚至很容易。谁能帮我?

伪代码将是:

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.logical_and,tf.logical_ortf.case允许您在运行模型时有条件地选择所需的数据。

例如,下面的代码显示了如何基于两个训练数据或标签输入的状态建立一个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掩码输入要素,其中1的个数只是训练步数。图表不知何故必须知道这个数字,并在每一步创建一个新的面具。请注意,它所需的数字不能从输入数据集本身收集。 –

+0

我从来没有使用过它们,但看起来您可以从[Training Utility](https://www.tensorflow.org/versions/master/api_guides/python/train#Training_Utilities)函数中获取培训步骤 - - tf.train.get_global_step或tf.train.global_step。这加上图形逻辑和一些聪明的Python可能会解决你的问题。 –

1

这看起来像只是numpy会很容易。事实上,我曾经有过一种情况,我想做一些对我而言似乎微不足道,但在张力流中很难做到的事情。具体而言,我想根据这些元素的值将一个数学函数应用于张量的某些元素。 EG:

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

换算成类似“A,其中A大于零,等于一加一的日志,其中A是大于零”。

我没有在tensorflow中成功,直到我发现了tf.py_func。据py_func在https://www.tensorflow.org/api_docs/python/tf/py_func的描述中,

“给定一个蟒函数func,这需要numpy的阵列作为其输入,并返回numpy的数组作为其输出端,包装这个功能在一个TensorFlow图形的操作。”

所以,这适用于你的情况,你可以不喜欢

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中显然使用这种功能,这真是太好了。