【问题标题】:Using hidden activations in loss function在损失函数中使用隐藏激活
【发布时间】:2016-12-29 16:07:07
【问题描述】:

我想在 Keras 中为双输入双输出模型创建一个自定义损失函数:

  1. 最小化两个自编码器的重构误差;
  2. 最大化自动编码器瓶颈特征的相关性。

为此我需要传递给损失函数:

  • 两个输入;
  • 输出/重构;
  • 两者的中间层输出(隐藏激活)。

我知道我可以将输入和输出都传递给模型,但我正在努力寻找一种方法来传递隐藏的激活。

我可以创建两个具有中间层输出的新模型并将其传递给损失,例如:

intermediate_layer_model1 = Model(input=input1, output=autoencoder.get_layer('encoded1').output)
intermediate_layer_model2 = Model(input=input2, output=autoencoder.get_layer('encoded2').output)

autoencoder.compile(optimizer='adadelta', loss=loss(intermediate_layer_model1, intermediate_layer_model2))

但是,我仍然需要找到一种方法将损失中的y_true 匹配到正确的中间模型。

解决这个问题的正确方法是什么?

编辑
这是我认为应该可行的方法。简化:

# autoencoder 1
input1 = Input(shape=(input_dim,))
encoded1 = Dense(encoding_dim, activation='relu', name='encoded1')(input1)
decoded1 = Dense(input_dim, activation='sigmoid', name='decoded1')(encoded1)

# autoencoder 2
input2 = Input(shape=(input_dim,))
encoded2 = Dense(encoding_dim, activation='relu', name='encoded2')(input2)
decoded2 = Dense(input_dim, activation='sigmoid', name='decoded2')(encoded2)

# merge encodings
merge_layer = merge([encoded1, encoded2], mode='concat', name='merge', concat_axis=1)

model = Model(input=[input1, input2], output=[decoded1, decoded2, merge_layer])

model.compile(optimizer='rmsprop', loss={
        'decoded1': 'binary_crossentropy',
        'decoded2': 'binary_crossentropy',
        'merge': correlation,
    })

然后在correlation 中我可以拆分y_pred 并进行计算。

【问题讨论】:

    标签: neural-network deep-learning keras autoencoder


    【解决方案1】:

    怎么样:

    1. 定义具有多个输出的单个模型(确保正确命名编码和重建层):

      duo_model = Model(input=input, output=[coding_layer, reconstruction_layer])
      
    2. 使用两种不同的损失(甚至执行损失重新加权)编译您的模型:

      duo_model.compile(optimizer='rmsprop',
                         loss={'coding_layer': correlation_loss, 
                               'reconstruction_layer': 'mse'})
      
    3. 以你的最终模型为:

      encoder = Model(input=input, output=[coding_layer])
      autoencoder = Model(input=input, output=[reconstruction_layer])
      

    正确编译后,这应该可以完成工作。

    在定义适当的相关损失函数时,有两种方法:

    1. 当编码层和输出层具有相同的维度时 - 您可以轻松使用预定义的 cosine_proximity 函数 Keras 库。
    2. 当编码层有不同的维度时- 您应该首先找到将编码向量和重建向量嵌入到同一空间,然后 - 在那里计算相关性。请记住,此嵌入应该是 Keras 层/函数或 Theano/Tensor 流操作(取决于您使用的后端)。当然,您可以将嵌入函数和相关函数计算为一个损失函数的一部分。

    【讨论】:

    • 感谢您的回答,但也许我并不清楚:我想计算两个自动编码器的编码之间的相关性。理想情况下,我应该只有一个损失函数来优化两个自动编码器的重建误差和两个编码的相关性。
    • 查看我的原始帖子编辑以获取可能的解决方案。 wdyt ?
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2017-10-08
    • 2020-09-14
    • 2019-10-31
    • 2018-09-29
    • 2019-05-18
    • 2022-01-08
    • 2015-06-26
    相关资源
    最近更新 更多