Я бы хотел сложить несколько слоев перед входом (заменить вход) и после вывода модели keras.
В API-интерфейсе Keras указано, что модель можно использовать как слой, поэтому я сделал:
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])
Однако мне нужно получить доступ к промежуточному слою старой модели для пользовательской функции потерь (KL для VAE):
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')
Но на тренировке я получаю ошибку:
tenorflow.python.framework.errors_impl.InvalidArgumentError: Вы должны
передать значение для тензора-заполнителя 'myOldInput' с помощью типа dtype и
форма [?, 26,21,4].
Если я не использую таможенную потерю, например, "Мэй" работает нормально. Кажется, что функция потерь смущена новым вводом.
Пожалуйста, помогите:)