【发布时间】:2019-12-12 17:11:45
【问题描述】:
我定义了一个由生成器和鉴别器组成的简单生成对抗网络。生成器编译两次:第一次用于非对抗性训练(没有判别器扩展),第二次用于对抗性训练。
在我构建和编译所有内容后,我可以询问我编译的模型的损失和指标。这是我得到的:
- net.generator.loss -> 'mean_absolute_error'
- net.generator.metrics -> []
- net.combined.loss -> ['mean_absolute_error', 'binary_crossentropy']
- net.combined.metrics -> []
到目前为止一切顺利,这似乎是合理的。但是当我随后在 net.generator 或 net.combined 上使用 train_on_batch 方法时,返回的损失的格式与我的预期不符。我发现我可以使用 model.metrics_names 进行检查:
- net.generator.metrics_names -> ['loss']
- net.combined.metrics_names -> ['loss', 'sequential_15_loss', 'discriminator_loss']
我的问题是:为什么我的 net.combined loss 包含 3 而不是我定义的两个元素(loss=[generator_loss_fct, 'binary_crossentropy')。我不希望它长 3 个元素。 此外,前两个几乎总是相同的,或者至少是相同的 非常非常非常相似。
有人明白吗?如果是,请解释我为什么会这样,如果我做错了什么。 :)
提前致谢!
# build and compile the generator
self.encoder = self._build_encoder(input_shape, encoder_filters, kernel_size, latent_size)
self.decoder = self._build_decoder(self.encoder.layers[-1].output_shape[1:], decoder_filters, kernel_size)
self.generator = Sequential([self.encoder, self.decoder])
# compile for non-adversarial training
self.generator.compile(loss=generator_loss_fct, optimizer=self.optimizer)
# get the inputs
masked_img= Input(self.input_shape, name='masked-image')
filled_img = self.generator(masked_img)
# build and compile the (global) discriminator
self.discriminator = self._build_discriminator(input_shape, discriminator_filters, kernel_size)
self.discriminator.compile(loss='binary_crossentropy', optimizer=self.optimizer, metrics=['accuracy'])
# let the discriminator judge the validity of the reconstruction
valid = self.discriminator(filled_img)
# we freeze the discriminator when training the generator
self.discriminator.trainable = False
# build and compile the combined adversarial model
self.combined = Model(masked_img, [filled_img, valid])
self.combined.compile(loss=[generator_loss_fct, 'binary_crossentropy'], loss_weights=[self.alpha, self.beta], optimizer=self.optimizer)
【问题讨论】:
-
您认为您的问题仍未得到解答吗?
标签: keras model metrics loss-function sequential