【问题标题】:Vector regression with Keras使用 Keras 进行向量回归
【发布时间】:2018-08-06 03:24:31
【问题描述】:

例如,假设一个回归问题,以五个标量作为输出,其中每个输出的范围大致相同。在 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

【问题讨论】:

    标签: keras


    【解决方案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. 这是否等同于以下多输出模型,其中输出具有相同的隐式损失权重? ,因为减法和平方是在元素方面完成的 strong> 向量形式,因此标量输出将产生与单个向量输出相同的结果。而多输出模型损失是各个输出损失的总和。

    【讨论】:

      【解决方案2】:

      是的,两者是等价的。要使用您的第一个模型复制 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'])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-04
        • 2017-10-14
        • 2020-05-16
        • 2018-06-18
        • 2014-12-22
        • 2018-05-01
        • 1970-01-01
        • 2018-03-13
        相关资源
        最近更新 更多