首页 > 解决方案 > 用于一次梯度更新的 Tensorflow 不同的 dropout 配置

问题描述

我正在尝试实现 [1] 中介绍的用于半监督学习的 PI 模型。

为了计算损失函数,需要使用相同数据通过网络的两次前向传递,其中在每次前向传递中使用随机增强来修改数据。此外,使用了 dropout,并且在两次传递中的每一次中,都应该丢弃不同的神经元选择。

我不太确定如何实现所需的 dropout 机制。

当我连接两个不同的增强批次作为网络的输入时,一个批次现在包含两个不同的数据增强。有没有办法tf.nn.dropout在需要辍学层的地方添加两个“平行”层,并以某种方式定义批次的前半部分应该使用第一个,第二个应该使用第二个?再次拆分网络的输出应该会给出两个“单独”运行的结果。

另一种方法是真正使用两个单独session.run的调用,使用两个不同的数据增强。但是,我不太确定如何正确执行渐变更新。

[1] https://arxiv.org/abs/1610.02242

标签: pythontensorflowkeras

解决方案


您可以使用tf.split()将批次分成两半,分别通过 a 给每一半tf.layers.dropout(),然后将它们重新连接tf.concat()。像这样的东西(伪代码):

splitted = tf.split( batch, 2, axis = 0 )
first_half = tf.dropout( splitted[ 0 ], rate = 0.5 )
second_half = tf.dropout( splitted[ 1 ], rate = 0.6 ) 
rejoined = tf.concatenate( [ first_half, second_half ], axis = 0 )

推荐阅读