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

Far*_*naz 5 python autoencoder deep-learning keras tensorflow

我正在联合训练具有 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')

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

Alo*_*her 5

也许可以尝试以下方法:

import random
def decision(probability):
  return random.random() < probability
Run Code Online (Sandbox Code Playgroud)

定义一种方法,根据某个概率 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)
      
  
Run Code Online (Sandbox Code Playgroud)

我假设您不希望每次更新模型参数时都将其中一个路径设置为零,因为这样就存在一个甚至两个模型都无法得到充分训练的风险。另请注意,我使用 的输入A来创建zero_likeone_like张量,因为我假设两个输入具有相同的形状;如果不是这种情况,也可以轻松调整。

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

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