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

How to randomly set inputs to zero in keras during training autoencoder (callback)?

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

我将 tensorflow 与 keras 后端一起使用(功能性 API)。

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

A -> A' & B ->B'

损失 => l2(A,A')+l2(B,B')

采用 A 和 B 的网络在潜在 space 中连接。 我想随机将 A 或 B 设置为零,并仅计算相应路径上的损失,这意味着如果输入路径 A 设置为零损失,则只能通过仅使用路径 B 的输出来计算,反之亦然;例如:

0 -> A' & B ->B'

损失:l2(B,B')

如何将输入路径随机设置为零?如何编写执行此操作的回调?

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

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

这段代码可以在损失函数中使用

也许可以尝试以下方法:

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 基于随机决定。这会在您的模型中产生噪音,这可能是可取的,因为您的模型将被迫查看潜在 space 以尝试重建您的原始输入。这恰恰意味着您仍然使用 A.inputA.output 计算重建损失,但实际上您的模型从未收到 A.input,而是随机张量。

请注意,此答案是一个简单的概念示例。 Tensorflow 的工作示例可以在 .

中找到