簡體   English   中英

在 Keras 中輸出由 add_loss 添加的多個損失

[英]Output multiple losses added by add_loss in Keras

我研究了由變分自動編碼器 (VAE) 演示的自定義損失層的 Keras 示例。 他們在示例中只有一個損失層,而 VAE 的目標由兩個不同的部分組成:重建和 KL-Divergence。 但是,我想繪制/可視化這兩個部分在訓練期間如何演變並將單個自定義損失分成兩個損失層:

Keras 示例模型:

在此處輸入圖片說明

我的型號:

在此處輸入圖片說明

不幸的是,Keras 只在我的多重損失示例中輸出一個單一的損失值,如 我的 Jupyter Notebook 示例中所示,我已經實現了這兩種方法。 有人知道如何獲得由add_loss添加的每個損失的值嗎? 此外,在給定多個add_loss調用(Mean/Sum/...?)的情況下, add_loss如何計算單個損失值?

我正在使用 Keras 的 2.2.4-tf 版本,上面的解決方案對我不起作用。 這是我找到的解決方案(繼續dumkar例子):

reconstruction_loss = mse(K.flatten(inputs), K.flatten(outputs))
kl_loss = beta*K.mean(- 0.5 * 1/latent_dim * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1))

model.add_loss(reconstruction_loss)
model.add_loss(kl_loss)

model.add_metric(kl_loss, name='kl_loss', aggregation='mean')
model.add_metric(reconstruction_loss, name='mse_loss', aggregation='mean')

model.compile(optimizer='adam')

希望它會幫助你。

這確實不受支持,目前在網絡上的不同地方都有討論。 可以通過在編譯步驟之后再次添加損失作為單獨的指標來獲得解決方案(也在此處討論)

這會導致類似這樣的事情(特別是對於 VAE):

reconstruction_loss = mse(K.flatten(inputs), K.flatten(outputs))
kl_loss = beta*K.mean(- 0.5 * 1/latent_dim * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1))

model.add_loss(reconstruction_loss)
model.add_loss(kl_loss)
model.compile(optimizer='adam')

model.metrics_tensors.append(kl_loss)
model.metrics_names.append("kl_loss")

model.metrics_tensors.append(reconstruction_loss)
model.metrics_names.append("mse_loss")

對我來說,這給出了這樣的輸出:

Epoch 1/1
252/252 [==============================] - 23s 92ms/step - loss: 0.4336 - kl_loss: 0.0823 - mse_loss: 0.3513 - val_loss: 0.2624 - val_kl_loss: 0.0436 - val_mse_loss: 0.2188

事實證明,答案並不簡單,而且 Keras 不支持開箱即用的功能。 但是,我已經實現了一個解決方案,其中每個損失層都輸出損失,並且自定義的回調函數會在每個 epoch 之后記錄它。 我的多頭示例的解決方案可以在這里找到: https : //gist.github.com/tik0/7c03ad11580ae0d69c326ac70b88f395

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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