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')
如何随机将输入路径设置为零?我如何编写一个回调来执行此操作?
也许可以尝试以下方法:
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_like和one_like张量,因为我假设两个输入具有相同的形状;如果不是这种情况,也可以轻松调整。
根据您的目标是什么,您还可以考虑用随机张量替换您的输入,A例如B基于tf.random.normal随机决策。这会在模型中产生噪声,这可能是理想的,因为您的模型将被迫查看潜在空间以尝试重建原始输入。这恰恰意味着您仍然使用A.input和计算重建损失A.output,但实际上您的模型从未收到A.input,而是随机张量。
请注意,此答案作为一个简单的概念示例。Tensorflow可以在此处找到一个工作示例。
| 归档时间: |
|
| 查看次数: |
621 次 |
| 最近记录: |