Как я могу обучить модель keras с одним выходом и несколькими y_true?

Я хотел бы обучить модель Keras только с одним выходом, но их несколько y_true. Так:

def CustomLossFunc([y_true1, y_true2], y_pred):
    Score1 = func1(y_true1, y_pred)
    Score2 = func2(y_true2, y_pred)
    return Score1 + Score2 

Возможно ли это в Керасе?

Я думаю об этом: может быть, я мог бы разделить единственный y_pred на два идентичных y_pred1 и y_pred2. Затем обучите его как модель с двумя выходами. И присвойте два y_true двум y_pred. Но я думаю, что это немного грязно, может быть, есть лучшие способы.

Я не пробовал несколько y_true. Но я на 99% уверен, что это возможно. Вы можете добавить любую потерю с add_loss()

Andrey 14.12.2020 08:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
226
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете нарезать y_true внутри пользовательской функции потерь при использовании model.fit:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np

BS = 3
N = 5
X = np.random.rand(BS,N)
Y = np.random.rand(BS,N*2)

def CustomLossFunc(y_true, y_pred):
    y_true1 = y_true[:, :N]
    y_true2 = y_true[:, N:]
    Score1 = MAE(y_true1, y_pred)
    Score2 = MSE(y_true2, y_pred)
    return Score1 + Score2 

def MAE(y_true, y_pred):
    return tf.reduce_mean(tf.abs(y_true - y_pred))

def MSE(y_true, y_pred):
    return tf.reduce_mean((y_true - y_pred)**2.)

input_shape = (N,)
input_layer = keras.Input(shape=input_shape)
output_layer = layers.Dense(N, 'relu')(input_layer)

model = keras.Model(inputs=input_layer, outputs=output_layer)

optimizer = keras.optimizers.Adam(learning_rate=1e-4)
model.compile(optimizer=optimizer, loss=CustomLossFunc)

model.fit(X, Y, batch_size=BS, epochs=1)

Если вы используете GradientTape, просто добавьте потери вместе:

tf.GradientTape() as tape:
    y_pred = model(X)
    loss = loss_1(y_true1, y_pred) + loss_2(y_true2, y_pred)

grads = tape.gradient(loss , model.trainable_variables)
optimizer.apply_gradients(zip(grads , model.trainable_variables))

Спасибо! Это очень полезно. Есть небольшая проблема, что два y_true могут быть разной формы. Я думаю, что мог бы вручную расширить один из них, чтобы они были в той же форме.

Patrick Lee 14.12.2020 09:36

Без проблем, рад помочь

Mr. For Example 14.12.2020 09:38

Очень хороший письменный ответ!

Celius Stingher 14.12.2020 12:10

Другие вопросы по теме