代码之家  ›  专栏  ›  技术社区  ›  Nick

attributeError:“tensor”对象在使用后端随机“uniform”时没有属性“keras”history

  •  0
  • Nick  · 技术社区  · 7 年前

    我正在喀拉斯实施一个wgan-gp,在这里我计算两个张量的随机加权平均值。

    def random_weighted_average(self, generated, real):
        alpha = K.random_uniform(shape=K.shape(real))
        diff = keras.layers.Subtract()([generated, real])
        return keras.layers.Add()([real, keras.layers.Multiply()([alpha, diff])])
    

    这就是它的使用方法。一旦我尝试创建 discriminator_model .

    averaged_samples = self.random_weighted_average(
        generated_samples_for_discriminator, 
        real_samples)
    averaged_samples_out = self.discriminator(averaged_samples)
    
    discriminator_model = Model(
        inputs=[real_samples, generator_input_for_discriminator],
        outputs=[
            discriminator_output_from_real_samples,
            discriminator_output_from_generator, 
            averaged_samples_out
        ])
    

    我的后端是TensorFlow。当我使用 alpha 在最后一行中,我得到以下错误:

    AttributeError: 'Tensor' object has no attribute '_keras_history'

    我试着交换 阿尔法 两个都出去 real generated 看看它是否与后端张量有关,情况就是这样(错误消失了)。那么是什么导致了这个问题呢?我需要一个形状为 真实的 生成 .

    1 回复  |  直到 7 年前
        1
  •  1
  •   nuric    7 年前

    使用后端函数的自定义操作需要包装在 Layer . 如果您没有任何可培训的权重,例如在您的案例中,最简单的方法是使用 Lambda 层:

    def random_weighted_average(inputs):
      generated, real = inputs
      alpha = K.random_uniform(shape=K.shape(real))
      diff = generated - real
      return real + alpha * diff
    averaged_samples = Lambda(random_weighted_average)([generated_for_discriminator, real_samples])