Keras:替换输入层并访问内部模型层

时间:2018-08-27 11:25:46

标签: python keras deep-learning autoencoder

我想在keras模型的输出之前堆叠一些层(替换输入)。 在Keras api中,statet表示可以像图层一样使用模型,所以我这样做了:

newIn = Conv2D(32, kernel_size=(3, 3), strides=(1, 1))(newIn) #add some new layers
oldModelOut = myModel(newIn)
newOut = Conv2D(32, kernel_size=(3, 3), strides=(1, 1))(oldModelOut) #add some new layers
myModel = Model(inputs=[newIn], outputs=[newOut])

但是,我必须访问旧模型的中间层以实现自定义损失函数(对于VAE,是KL):

class KL_Err():
    def __init__(self, z_ln_stdv, z_mean):
        self.z_ln_stdv = z_ln_stdv
        self.z_mean = z_mean
    def calc_loss(self, y, ypred):
        self.error = K.mean((objectives.mean_absolute_error(y, ypred)))
        self.kl_loss = -0.5 * K.mean(1 + self.z_ln_stdv - K.square(self.z_mean) - K.exp(self.z_ln_stdv), axis=-1)
        return self.error + self.kl_loss

该模型可以使用以下命令进行编译:

z_ln_stdv = myModel.get_layer("myOldModelName").get_layer("my_z_ln_layer").output
z_mean = myModel.get_layer("myOldModelName").get_layer("my_z_mean_layer").output
loss = KL_Err(z_ln_stdv, z_mean).calc_loss
myModel.compile(loss=loss, optimizer='adam')

但是在训练中我会收到错误消息:

  

tensorflow.python.framework.errors_impl.InvalidArgumentError:您必须   用dtype float和占位符张量'myOldInput'的值   形状[?,26,21,4]。

如果我不使用自定义损失,例如“湄”它工作正常。损失函数似乎被新输入所混淆。 请帮助:)

0 个答案:

没有答案