【发布时间】:2016-12-29 16:07:07
【问题描述】:
我想在 Keras 中为双输入双输出模型创建一个自定义损失函数:
- 最小化两个自编码器的重构误差;
- 最大化自动编码器瓶颈特征的相关性。
为此我需要传递给损失函数:
- 两个输入;
- 输出/重构;
- 两者的中间层输出(隐藏激活)。
我知道我可以将输入和输出都传递给模型,但我正在努力寻找一种方法来传递隐藏的激活。
我可以创建两个具有中间层输出的新模型并将其传递给损失,例如:
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