复合Keras模型中的损失函数

时间:2020-03-13 15:35:45

标签: python tensorflow keras

我有一个Keras自动编码器模型,其中包含一个子模型(解码器部分)。

我的结构基本上是

encoder_input = x = Input(self.input_dim, name="encoder_input")
...
encoder_output = Dense(1024)(x)

decoder_input = x = Input(self.z_dim, name="decoder_input")
...
decoder_output = Conv2DTranspose(3, 4, 2)(x)

self.encoder = Model(encoder_input, encoder_output)
self.decoder = Model(decoder_input, decoder_output)
self.model = Model(encoder_input, self.decoder(encoder_output))

因此,整个Model包含另一个Model用于解码器,而不用于编码器。我喜欢这种结构,因为它使我可以简单地使用解码器部分,例如生成图像。

但是,我现在想要一个损失函数来规范解码器的一部分:

error = 0.0
error += K.mean(self.encoder.layers[3])
error += K.mean(self.decoder.layers[4])

这在我要编译整个模型时会导致问题:

tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'decoder_input' with dtype float and shape [?,2]
     [[{{node decoder_input}}]]

当我第一次调用fit函数时,会弹出此错误。只要我只惩罚 encoder 层,一切都可以完美运行。

我认为这应该可行,有人暗示吗?

编辑

一个最小的例子是

from keras import Input, Model
from keras.layers import Dense
from keras import backend as K
from keras.losses import mse
from keras.optimizers import Adam
import numpy as np


encoder_input = x = Input((100,))
x = Dense(100)(x)
encoder_output = Dense(100)(x)

decoder_input = x = Input((100,))
x = Dense(100)(x)
decoder_output = Dense(100)(x)

global encoder
global decoder
encoder = Model(encoder_input, encoder_output)
decoder = Model(decoder_input, decoder_output)
decoded = decoder(encoder_output)
model = Model(encoder_input, decoded)

def f_loss(t,p):
    loss = 0.0
    loss += K.sum(encoder.layers[1].output, axis=1)
    loss += K.sum(decoder.layers[1].output, axis=1)
    return loss

def whole_loss(t,p):
    return mse(t,p)+f_loss(t,p)

model.compile(optimizer=Adam(), loss=whole_loss)

input = np.random.uniform(0,1,(32,100))
model.fit(input,input)

0 个答案:

没有答案