用Keras进行向量回归

时间:2018-08-05 17:59:29

标签: keras

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

output_layer = layers.Dense(5, activation=None)(previous_layer)
model = models.Model(input_layer, output_layer)
model.compile(optimizer='rmsprop', loss='mse', metrics=['mse'])

总损失(公制)是否仅仅是单个损失(公制)的总和?这是否等效于以下多输出模型,其中输出具有相同的隐式损耗权重?在我的实验中,我没有观察到任何明显的差异,但想确保我不会错过任何基本知识。

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_weights一样?

2 个答案:

答案 0 :(得分:1)

是的,两者都是等效的。要在第一个模型中复制loss_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'])

答案 1 :(得分:1)

这些模型是相同。要回答您的问题,让我们看一下mse loss

def mean_squared_error(y_true, y_pred):
  return K.mean(K.square(y_pred - y_true), axis=-1)
  1. 总损失(公制)是否仅仅是单个损失(公制)的总和? ,因为mse损失应用了K.mean函数您可以说这是输出向量中所有元素的总和。
  2. 这是否等效于以下多输出模型,其中输出具有相同的隐式损耗权重? ,因为减法和平方是元素明智的形式,因此标量输出将产生与单个矢量输出相同的结果。多输出模型损失是单个输出损失的总和。
相关问题