实现分段卷积神经网络/分段最大汇集

时间:2017-11-16 19:27:21

标签: tensorflow nlp conv-neural-network

我正在尝试在Tensorflow中实现分段最大池操作,如here所述。给定一个句子,我想将它分成三个不同的部分,并且最大限度地将所有这些部分汇集在一起​​,这样我就会得到3个不同的值,而不是1个。

更具体地说,我的形状training的张量为[batch_len, 1, sentence_len, feature_len]。我还有另一个形状splits的张量[batch_len, 2],其中任何行的第一个元素是拆分第一个部分的索引,第二个元素是拆分最后一个部分的索引。我想以training张量为基础,根据splits张量中提供的值索引值将其划分为树部分。

我们不能简单地使用其他张量索引training张量,因为对于不同的示例,我们对第一,第二和第三部分具有不同的长度。我可以循环遍历所有训练数据并按照这种方式进行,但这样效率非常低。我希望尽可能提高效率。

注意:由于它们将被最大化,我可以使用3个不同形状[batch_len, 1, sentence_len, feature_len]的张量,其中在第一张量中,只有每个句子第一部分中的元素具有值,而其他人则为零。第二个张量只有中间部分的值,依此类推。

2 个答案:

答案 0 :(得分:0)

我是TensorFlow和Keras的新手,如果我错了,请纠正我。

根据我对你的问题的理解,这似乎是在张量流的max_pooling2d层中使用'pool_size'参数的简单例子。

如果你想采用最简单的方法,请确保所有句子都填充到相同的长度,并且因为你想要三个部分(我假设你的意思是三个,当你说'将它划分为树部分'时)你想要完成最大池化,只需将'pool_size'和'strides'参数设置为sent_length / 3.

但是,如果你想使用另一个张量中指定的索引,我建议不要使用张量,而是使用普通整数来表示索引,然后定义一个Lambda图层将你的句子分成3个部分在索引上,并在每个部分上应用全局最大池。此代码可能有助于更好地理解它:

part_1 = Lambda(lambda x: x[:, :, :first_index, :])
part_2 = Lambda(lambda x: x[:, :, first_index:second_index, :])
part_3 = Lambda(lambda x: x[:, :, second_index:, :])

然后在每个部件上进行最大池化,使用适当的过滤器尺寸等于每个部件的长度。如果一个简单的len()没有给你长度,你可以通过调用形状来获得长度(使用适当的形状索引)。

答案 1 :(得分:0)

探索和实施PCNN模型会让我遇到同样的问题:分割边界(实体的位置)可能会因输入而异。

为了实现分段最大池化,使用tf.split调用获取三个部分和tf.pad调用每个部分的组合。然后我们应用tf.nn.max_pool为每个填充部分执行最大池化。

Here是PCNN模型的张量流实现,作为情感分类的应用。 Here是代码中网络描述的确切位置。