我如何训练一个输出和多个 y_true 的 keras 模型?

How could I train a keras model with one output and multiple 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 

在 Keras 中可以吗?

我的想法是: 也许我可以将唯一的 y_pred 拆分为两个相同的 y_pred1 和 y_pred2。然后像有两个输出的模型一样训练它。并将两个y_true分配给两个y_pred。但是我觉得有点乱,也许有更好的方法。

您可以在使用 model.fit 时对 y_true 内部自定义损失函数进行切片:

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))