我正在联合训练具有 2 个独立输入路径的 2 个自动编码器,并且我想将其中一个输入路径随机设置为零。
我将 Tensorflow 与 keras 后端(功能 API)一起使用。
我正在计算反向传播的联合损失(两个损失的总和)。
A -> A' & B ->B'
损失 => l2(A,A')+l2(B,B')
采用 A 和 B 的网络在潜在空间中连接。
我想将 A 或 B 随机设置为零,并仅在相应路径上计算损耗,这意味着如果输入路径 A 设置为零损耗,则仅使用路径 B 的输出来计算损耗,反之亦然;例如。:
0 -> A' & B ->B'
损失:l2(B,B')
如何随机将输入路径设置为零?我如何编写一个回调来执行此操作?
也许可以尝试以下方法:
import random
def decision(probability):
return random.random() < probability
定义一个方法,根据某个概率 x 做出随机决策,并使你的损失计算取决于该决策。
if current_epoch == random.choice(epochs):
keep_mask = tf.ones_like(A.input, dtype=float32)
throw_mask = tf.zeros_like(A.input, dtype=float32)
if decision(probability=0.5):
total_loss = tf.reduce_sum(reconstruction_loss_a * keep_mask
+ reconstruction_loss_b * throw_mask)
else:
total_loss = tf.reduce_sum(reconstruction_loss_a * throw_mask
+ reconstruction_loss_b * keep_mask)
else:
total_loss = tf.reduce_sum(reconstruction_loss_a + reconstruction_loss_b)
我假设您不希望每次更新模型参数时都将其中一个路径设置为零,因为这样就存在一个甚至两个模型都无法得到充分训练的风险。另请注意,我使用的输入A
创造zero_like
and one_like
张量,因为我假设两个输入具有相同的形状;如果不是这种情况,也可以轻松调整。
根据您的目标,您还可以考虑替换您的输入A
or B
使用随机张量,例如tf.random.normal
基于随机决定。这会在您的模型中产生噪声,这可能是可取的,因为您的模型将被迫查看潜在空间以尝试重建原始输入。这恰恰意味着您仍然可以使用以下方法计算重建损失A.input
and A.output
,但实际上你的模型从未收到过A.input
,而是随机张量。
请注意,此答案作为一个简单的概念示例。一个工作示例Tensorflow
可以被找寻到here https://stackoverflow.com/questions/69713913/how-to-modify-a-variable-inside-the-loss-function-in-each-epoch-during-training.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)