在一个层上循环以从神经网络输出中执行 Monte Carlo
Loop over a layer to do a Monte Carlo from a neural net output
我最近不得不调整一个神经网络。它是这样工作的:
- 给定一个图像作为输入,几个层将其转换为均值矩阵
mu
和协方差矩阵 sigma
。
- 然后,从参数
mu
、sigma
. 的高斯分布中抽取样本z
- 几个层把这个样本变成一个输出
- 将此输出与给定图像进行比较,给出成本
我想做的是保留 mu
和 sigma
,获取 多个 个样本 z
,将它们传播到其余的NN,并将我得到的 多张 图像与给定图像进行比较。
请注意步骤 z
-> 图像输出调用其他包,我不想深入研究这些...
到目前为止我做了什么:
- 起初,我认为我不需要经历所有这些麻烦:我拿了一个
batch_size
,就好像我在做一个 Monte Carlo by [=64] =] NN 多次。但实际上我需要神经网络在更新权重之前尝试几张图像,从而改变mu
和sigma
。
- 我简单地采样了多个
z
然后通过网络传播它们。但我很快发现我在复制所有层,使代码非常慢,最重要的是阻止我获取许多样本来实现我的目标 MC。
当然,我更新了损失和数据输入 类 以将其考虑在内。
你有什么想法吗?基本上,我想要一种以经济高效的方式多次制作 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
我最近不得不调整一个神经网络。它是这样工作的:
- 给定一个图像作为输入,几个层将其转换为均值矩阵
mu
和协方差矩阵sigma
。 - 然后,从参数
mu
、sigma
. 的高斯分布中抽取样本 - 几个层把这个样本变成一个输出
- 将此输出与给定图像进行比较,给出成本
z
我想做的是保留 mu
和 sigma
,获取 多个 个样本 z
,将它们传播到其余的NN,并将我得到的 多张 图像与给定图像进行比较。
请注意步骤 z
-> 图像输出调用其他包,我不想深入研究这些...
到目前为止我做了什么:
- 起初,我认为我不需要经历所有这些麻烦:我拿了一个
batch_size
,就好像我在做一个 Monte Carlo by [=64] =] NN 多次。但实际上我需要神经网络在更新权重之前尝试几张图像,从而改变mu
和sigma
。 - 我简单地采样了多个
z
然后通过网络传播它们。但我很快发现我在复制所有层,使代码非常慢,最重要的是阻止我获取许多样本来实现我的目标 MC。
当然,我更新了损失和数据输入 类 以将其考虑在内。
你有什么想法吗?基本上,我想要一种以经济高效的方式多次制作 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