[英]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
設為1,就好像我通過多次運行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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.