在一个层上循环以从神经网络输出中执行 Monte Carlo

Loop over a layer to do a Monte Carlo from a neural net output

我最近不得不调整一个神经网络。它是这样工作的:

我想做的是保留 musigma,获取 多个 个样本 z,将它们传播到其余的NN,并将我得到的 多张 图像与给定图像进行比较。

请注意步骤 z -> 图像输出调用其他包,我不想深入研究这些...

到目前为止我做了什么:

当然,我更新了损失和数据输入 类 以将其考虑在内。

你有什么想法吗?基本上,我想要一种以经济高效的方式多次制作 z -> output 的有效方法。我还有很多东西要从 tensorflow 和 keras 中学习,所以我对如何做到这一点有点迷茫。像往常一样,如果某个地方已经存在答案,请道歉,我尽力自己寻找一个!

好吧,我的问题有点愚蠢。为了不重复层,我创建了多个切片层,然后我简单地通过网络传播它们和之前声明的层。这是我的代码:

# First declare layers
a = layer_A()
b = layer_B()
# And so on ...
# Generate samples
samples = generate_samples()([mu, sigma])
# for all the monte carlo samples, do : 
for i in range(mc_samples):
    cur_sample = Lambda(lambda x: K.slice(x, (0, 0, 0, 2*i), (-1, -1, -1, 2)), name="slice-%i" % i)(samples)
    cur_output = a(cur_sample)
    cur_output = b(cur_output)
    all_output.append(output)
output_of_net = keras.layers.concatenate(all_output)
return Model(inputs=inputs, outputs=output_of_net)

只需遍历损失函数的最后一个维度,求平均值,就大功告成了!一瞥我的损失:

loss = 0
for i in range(mc_samples):
    loss += f(y_true[..., i], y_pred[..., i])
return loss/mc_samples