Keras: заменить входной слой и получить доступ к внутреннему слою модели - PullRequest
0 голосов
/ 27 августа 2018

Я бы хотел сложить несколько слоев перед входом (заменить вход) и после вывода модели 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].

Если я не использую таможенную потерю, например, "Мэй" работает нормально. Кажется, что функция потерь смущена новым вводом. Пожалуйста, помогите:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...