如何在训练自动编码器(回调)期间将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_like
和 one_like
张量,因为我假设这两个输入具有相同的形状;如果不是这种情况,可以轻松调整。
根据您的目标,您还可以考虑将 A
或 B
的输入替换为随机张量,例如tf.random.normal
基于随机决定。这会在您的模型中产生噪音,这可能是可取的,因为您的模型将被迫查看潜在 space 以尝试重建您的原始输入。这恰恰意味着您仍然使用 A.input
和 A.output
计算重建损失,但实际上您的模型从未收到 A.input
,而是随机张量。
请注意,此答案是一个简单的概念示例。 Tensorflow
的工作示例可以在 .
中找到
我正在联合训练 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_like
和 one_like
张量,因为我假设这两个输入具有相同的形状;如果不是这种情况,可以轻松调整。
根据您的目标,您还可以考虑将 A
或 B
的输入替换为随机张量,例如tf.random.normal
基于随机决定。这会在您的模型中产生噪音,这可能是可取的,因为您的模型将被迫查看潜在 space 以尝试重建您的原始输入。这恰恰意味着您仍然使用 A.input
和 A.output
计算重建损失,但实际上您的模型从未收到 A.input
,而是随机张量。
请注意,此答案是一个简单的概念示例。 Tensorflow
的工作示例可以在