我想在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]。
如果我不使用自定义损失,例如“湄”它工作正常。损失函数似乎被新输入所混淆。 请帮助:)