基于Keras的向量回归

基于Keras的向量回归,keras,Keras,例如,假设一个回归问题有五个标量作为输出,其中每个输出具有大致相同的范围。在Keras中,我们可以使用无激活函数的5输出密集层(向量回归)对此进行建模: 总损失(指标)仅仅是单个损失(指标)的总和吗?这是否等同于以下多输出模型,其中输出具有相同的隐式损失权重?在我的实验中,我没有观察到任何显著的差异,但我想确保我没有遗漏任何基本的东西 output_layer_list = [] for _ in range(5): output_layer_list.append(layers.Den

例如,假设一个回归问题有五个标量作为输出,其中每个输出具有大致相同的范围。在Keras中,我们可以使用无激活函数的5输出密集层(向量回归)对此进行建模:

总损失(指标)仅仅是单个损失(指标)的总和吗?这是否等同于以下多输出模型,其中输出具有相同的隐式损失权重?在我的实验中,我没有观察到任何显著的差异,但我想确保我没有遗漏任何基本的东西

output_layer_list = []
for _ in range(5):
    output_layer_list.append(layers.Dense(1, activation=None)(previous_layer))
model = models.Model(input_layer, output_layer_list)
model.compile(optimizer='rmsprop', loss='mse', metrics=['mse'])

在第一种解决方案中,是否有一种简单的方法将权重附加到输出,类似于在多输出模型中指定
损失权重

是的,两者都是等效的。要在第一款车型上复制
loss\u weights
功能,您可以定义自己的自定义损耗函数。大致如下:

import tensorflow as tf
weights = K.variable(value=np.array([[0.1, 0.1, 0.1, 0.1, 0.6]]))

def custom_loss(y_true, y_pred):
    return tf.matmul(K.square(y_true - y_pred), tf.transpose(weights))
并在编译时将此函数传递给
loss
参数:

model.compile(optimizer='rmsprop', loss=custom_loss, metrics=['mse'])
那些模型是一样的。要回答您的问题,让我们看看:

  • 总损失(指标)仅仅是单个损失(指标)的总和吗,因为mse损失应用了
    K.mean
    函数,因此您可以认为它是输出向量中所有元素的总和
  • 这是否等同于以下多输出模型,其中输出具有相同的隐式损失权重,因为减法和平方运算是以向量形式按元素进行的,所以标量输出将产生与单个向量输出相同的结果。多输出模型的损失是单个输出的损失之和
  • model.compile(optimizer='rmsprop', loss=custom_loss, metrics=['mse'])
    
    def mean_squared_error(y_true, y_pred):
      return K.mean(K.square(y_pred - y_true), axis=-1)