我想为Keras中的双输入双输出模型创建一个自定义丢失函数:
为此,我需要传递给损失函数:
我知道我可以将输入和输出传递给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
并进行计算。
答案 0 :(得分:1)
怎么样:
使用多个输出定义单个模型(确保正确命名了编码和重建层):
duo_model = Model(input=input, output=[coding_layer, reconstruction_layer])
使用两种不同的损失编译模型(甚至执行损失重新加权):
duo_model.compile(optimizer='rmsprop',
loss={'coding_layer': correlation_loss,
'reconstruction_layer': 'mse'})
将您的最终模型作为:
encoder = Model(input=input, output=[coding_layer])
autoencoder = Model(input=input, output=[reconstruction_layer])
经过适当的编译,这应该可以胜任。
在定义适当的相关损失函数时,有两种方法:
cosine_proximity
函数
Keras图书馆。