簡體   English   中英

基於輸入的輸出子集上的自定義損失函數

[英]Custom loss function on subset of outputs based on inputs

我想創建一個損失函數,其中 MSE 僅在輸出的子集上計算。 子集取決於輸入數據。 我使用這個問題的答案來弄清楚如何根據輸入數據創建自定義函數:

Keras 中基於輸入數據的自定義損失函數

但是,我在實現自定義功能時遇到了麻煩。

這是我整理的內容。

def custom_loss(input_tensor):


    def loss(y_true, y_pred):
        board = input_tensor[:81]
        answer_vector = board == .5
        #assert np.sum(answer_vector) > 0

        return K.mean(K.square(y_pred * answer_vector - y_true), axis=-1)
    return loss


def build_model(input_size, output_size):
    learning_rate = .001
    a = Input(shape=(input_size,))
    b = Dense(60, activation='relu')(a)
    b = Dense(60, activation='relu')(b)
    b = Dense(60, activation='relu')(b)
    b = Dense(output_size, activation='linear')(b)
    model = Model(inputs=a, outputs=b)
    model.compile(loss=custom_loss(a), optimizer=Adam(lr=learning_rate))

    return model

model = build_model(83, 81)

我希望 MSE 在電路板不等於 0.5 的任何地方將輸出視為 0。 (真正的值是一個熱編碼,一個在子集中)。 出於某種原因,我的輸出始終被視為零。 換句話說,自定義損失函數似乎沒有找到任何棋盤等於 0.5 的地方。

我不知道我是否誤解了維度,或者比較是否由於張量而失敗,或者即使只有一種通常更簡單的方法來做我正在嘗試的事情。

問題是answer_vector = board == .5不是你想的那樣。 它不是張量,而是布爾值 False,因為 board 是張量而 0.5 是數字:

a = tf.constant([0.5, 0.5])
print(a == 0.5) # False

現在, a * False是一個零向量:

with tf.Session() as sess:
   print(sess.run(a * False)) # [0.0, 0.0]

您需要使用 tf.equal 而不是 ==。 另一個可能的陷阱是將浮點數與相等進行比較是危險的,請參閱例如在 Java 中使用 == 比較浮點數有什么問題?

暫無
暫無

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

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