如何在训练自编码器(回调)期间随机设置keras输入为零?



我正在联合训练2个具有2个独立输入路径的自编码器,我想随机设置其中一个输入路径为零。

我使用tensorflow与keras后端(功能API)。

我正在计算反向传播的联合损失(两个损失的总和)。

→",B→B '

损失=比;l2(一个)+ l2 (B, B)

取A和取B的网络在潜空间连通。我想随机设置A或B为零,只计算相应路径上的损失,这意味着如果输入路径A为零,只使用路径B的输出来计算损失,反之亦然;例如:

0→",B→B '

失:l2 (B, B)

如何将输入路径随机设置为0 ?我怎么写一个做这个的回调?

不妨试试下面的方法:

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_likeone_like张量,因为我假设两个输入具有相同的形状;如果不是这种情况,可以很容易地进行调整。

根据你的目标,你也可以考虑用随机张量替换AB的输入,例如基于随机决策的tf.random.normal。这会在模型中产生噪声,这可能是理想的,因为您的模型将被迫查看潜在空间以尝试重建原始输入。这意味着你仍然用A.inputA.output计算重构损失,但实际上你的模型从未接收到A.input,而是随机张量。

请注意,这个答案是一个简单的概念示例。可以在这里找到Tensorflow的工作示例。

您可以简单地将输入设置为0:

A = A*random.choice([0,1])

此代码可用于损失函数

最新更新