簡體   English   中英

循環遍歷一層以從神經網絡輸出進行蒙特卡洛

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

我最近不得不調整神經網絡。 運作方式如下:

  • 在給定圖像作為輸入的情況下,多層將其轉換為均值矩陣mu和協方差矩陣sigma
  • 然后,從參數musigma的高斯分布中獲取樣本z
  • 多層將樣本轉換為輸出
  • 將此輸出與給定圖像進行比較,從而產生了成本

我想做的是保留musigma ,獲取多個樣本z ,將它們傳播到NN的其余部分,然后將得到的多個圖像與給定圖像進行比較。

請注意,步驟z >圖像輸出調用了其他程序包,我不想不必深入研究這些程序包...

我到目前為止所做的:

  • 起初,我以為我不需要經歷所有麻煩:我將batch_size設為1,就好像我通過多次運行NN來進行蒙特卡洛一樣。 但是我實際上需要神經網絡在更新權重之前嘗試幾個圖像,從而改變musigma
  • 我只是簡單地采樣了多個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM