Tensorflow可以实现条件计算吗?

时间:2017-06-15 12:40:54

标签: python tensorflow deep-learning mxnet

我正在使用MxNet开发一个条件计算框架。假设我们的小批量有N个样本。我需要在我的计算图中使用伪代码执行这种操作:

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)

我想要实现的目标如下:获得y之后,我应用决策函数(这可以是D到k完全连接层,其中D是数据维度)并获取我的每个样本的k个激活N号迷你巴士。然后,我想基于每个样本的最大激活的列索引,动态地将我的小批量分成k个不同的部分(k可以是2,3,一个小数字)。我的假设" graph.ArgMaxIndices"函数确实如此,给定z,一个Nxk大小的矩阵,而i,该函数查找样本索引,这些索引沿列i给出最大激活并返回它们的索引。 (注意,我寻找任何系列或函数组合,它们给予" graph.ArgMaxIndices"等等,而不是单个函数,具体而言)。最后,对于每个i,我选择具有最大激活的样本并对它们应用特定的变换。目前,据我所知,MxNet在其符号网络中不支持这种条件计算。因此,我在每个决策之后构建单独的符号图,并且必须编写单独的簿记 - 每个小批量分割的条件图结构,这产生1)维护和开发的非常复杂和繁琐的代码2)在训练和评估期间降低的运行性能。

我的问题是,我可以使用Tensorflow的符号运算符执行上述操作吗?是否允许根据标准选择小批量的子集?是一个功能或一系列功能,相当于" graph.ArgMaxIndices"在上面的伪代码? (给定Nxk矩阵和列索引i,返回行的索引,其在列k处具有最大激活)。

1 个答案:

答案 0 :(得分:2)

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

我看到的最佳方法是使用遮罩和tf.boolean_mask k次,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)