簡體   English   中英

Tensorflow 訓練 - 打印一個 output 的多個損失

[英]Tensorflow training - print multiple losses for one output

我想分別打印一個 output 的所有不同損失。 目前它看起來像:

1/1 [==============================] - 1s 1s/sample - loss: 4.2632

目標是擁有如下歷史:

1/1 [==============================] - 1s 1s/sample - loss1: 2.1, loss2: 2.1632

我有一個 output 層 out1 和兩個損失函數 loss1 和 loss2。

def loss1(y_true, y_pred):
    ...
    return ...
def loss2(y_true, y_pred):
    ...
    return ...

當我做

model.compile(...)

我可以選擇單損function,

model.compile(loss=lambda x: loss1(x) + loss2(x))

或為字典中的每個 output 定義損失

model.compile(loss={'out1': loss1(x), 'out2': loss2(x)})

因為我只有一個 output,所以這不是我的選擇。 有誰知道只有一個 output 時如何單獨打印損失?

只需使用metrics參數:

model.compile(optimizer='adam', loss='mae', metrics=['mse'])

您仍然需要選擇一種損失來最小化。

一種解決方法是人為地創建相同的兩個輸出,然后將它們與等於 1 的權重組合。為了具體起見,我編寫了示例:

from tensorflow.keras import Model
from tensorflow.keras.layers import Input, Dense, Lambda
from tensorflow.keras.losses import mse, mae
import numpy as np

if __name__ == '__main__':
    train_x = np.random.rand(10000, 200)
    train_y = np.random.rand(10000, 1)

    x_input = Input(shape=(200))
    x = Dense(64)(x_input)
    x = Dense(64)(x)
    x = Dense(1)(x)

    x1 = Lambda(lambda x: x, name='out1')(x)
    x2 = Lambda(lambda x: x, name='out2')(x)

    model = Model(inputs=x_input, outputs=[x1, x2])

    model.compile(optimizer='adam', loss={'out1': mse, 'out2': mae}, loss_weights={'out1': 1, 'out2': 1})

    model.fit(train_x, train_y, epochs=10)

暫無
暫無

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

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