python - 用于一次梯度更新的 Tensorflow 不同的 dropout 配置
问题描述
我正在尝试实现 [1] 中介绍的用于半监督学习的 PI 模型。
为了计算损失函数,需要使用相同数据通过网络的两次前向传递,其中在每次前向传递中使用随机增强来修改数据。此外,使用了 dropout,并且在两次传递中的每一次中,都应该丢弃不同的神经元选择。
我不太确定如何实现所需的 dropout 机制。
当我连接两个不同的增强批次作为网络的输入时,一个批次现在包含两个不同的数据增强。有没有办法tf.nn.dropout
在需要辍学层的地方添加两个“平行”层,并以某种方式定义批次的前半部分应该使用第一个,第二个应该使用第二个?再次拆分网络的输出应该会给出两个“单独”运行的结果。
另一种方法是真正使用两个单独session.run
的调用,使用两个不同的数据增强。但是,我不太确定如何正确执行渐变更新。
解决方案
您可以使用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 )
推荐阅读
- apache-spark - 在 pyspark 中减去两行并将 ans 添加为新行
- ruby-on-rails - 如何编写条件 ruby 代码以 .arb 文件的形式显示(活动管理员)
- r - 如何重建 tidy.prcomp 输出以显示观察/样本和加载/旋转之间的联系?
- java - 2021 年 EMC Documentum 是否有 spring-data UPDATED 模块?
- ios - 用于从端点接收大量文件的正确方法
- python - 如何在 Django 中修复此错误,“无法分配必须是实例。”
- java - Android-Java Stripe 汇款
- r - 箱线图中的意义线
- terraform - Nomad 集群配置错误(如何查看日志)
- sql - SQL AVG OVER 所有观察结果