在损失函数中使用隐藏激活

时间:2016-12-29 16:07:08

标签: neural-network deep-learning keras autoencoder

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

  1. 最小化两个自动编码器的重建错误;
  2. 最大化自动编码器的瓶颈功能的相关性。
  3. 为此,我需要传递给损失函数:

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

    我知道我可以将输入和输出传递给Model,但我很难找到一种方法来传递隐藏的激活。

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

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:ordering="sequentially">
        <objectAnimator
            android:duration="1000"
            android:propertyName="rotation"
            android:valueFrom="0"
            android:valueTo="0"
            android:valueType="floatType"/>
        <objectAnimator
            android:duration="1000"
            android:propertyName="rotation"
            android:valueFrom="0"
            android:valueTo="180"
            android:valueType="floatType"/>
    </set>
    

    但是,我仍然需要找到一种方法来将损失中的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并进行计算。

1 个答案:

答案 0 :(得分: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])
    
  4. 经过适当的编译,这应该可以胜任。

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

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