2017-06-15 25 views
1

我正在使用MxNet的条件计算框架。假设我们在小批次中有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) 

我想实现的是以下内容:我获得Ÿ后,我申请的决定功能(这可能是K A d完全连接图层,其中D是数据维度),并为我的N尺寸小批次中的每个样本获得k个激活。然后,我想根据每个样本的最大激活的列索引动态地将我的小批次分为k个不同的部分(k可能是2,3)。我假设的“graph.ArgMaxIndices”函数是这样做的,给定z,一个Nxk大小的矩阵,以及i,该函数查找样本索引,它们沿着第i列给出最大激活并返回它们的索引。 (请注意,我寻找任何给出与“graph.ArgMaxIndices”等效的结果的函数或函数组合,而不是一个函数,具体而言)。最后,对于每个我,我选择具有最大激活的样本并对它们应用特定的变换。目前,就我所知,MxNet在其符号网络中不支持这种有条件的计算。因此,我在每个决策之后建立独立的符号图,并且必须为每个小批次拆分编写单独的簿记 - 条件图结构,这会产生1)非常复杂和繁琐的代码以维护和开发2)训练和评估过程中运行性能下降。

我的问题是,我可以使用Tensorflow的符号运算符来完成上述操作吗?它是否允许根据标准选择小批次的子集?是否有一个函数或一系列函数等同于上面伪代码中的“graph.ArgMaxIndices”? (给定一个Nxk矩阵和列索引i,返回列k中具有最大激活的行的索引)。

回答

2

您可以在Tensorflow中做到这一点。

我看到的是用口罩和tf.boolean_maskk时间的最佳方式,与i个面具被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

给予当我们使用boolean_mask,并Tensorflow跳过这些样本的计算,在未来层?我的意思是,在这个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 ...... –