Keras实现WGAN-GP遇AttributeError:Tensor无_keras_history属性
解决WGAN-GP中随机加权平均的
_keras_history属性错误 这个问题我在实现WGAN-GP时也碰到过,核心原因是:K.random_uniform()直接生成的是原生TensorFlow张量,它没有Keras层输出张量必需的_keras_history属性,当你把这种纯TF张量和Keras层的输出(比如generated、real)一起传入Subtract、Multiply等Keras层时,Keras无法追踪整个计算图的历史,就会抛出AttributeError: 'Tensor' object has no attribute '_keras_history'的错误。
下面提供两种可行的解决方法,都能让生成的随机alpha张量符合Keras的要求:
方法1:用Lambda层包裹alpha的生成
把alpha的生成逻辑放到Keras的Lambda层中,这样生成的张量会自动带上Keras的历史信息,和后续的层操作兼容:
def random_weighted_average(self, generated, real): # 用Lambda层生成和real同形状的均匀随机张量,自动携带_keras_history alpha = keras.layers.Lambda(lambda x: K.random_uniform(shape=K.shape(x)))(real) diff = keras.layers.Subtract()([generated, real]) scaled_diff = keras.layers.Multiply()([alpha, diff]) return keras.layers.Add()([real, scaled_diff])
方法2:将整个加权平均逻辑封装到单个Lambda层
这种方式更简洁,把所有计算逻辑都放到一个Lambda层里,避免单独处理alpha的问题:
def random_weighted_average(self, generated, real): return keras.layers.Lambda( lambda inputs: inputs[1] + K.random_uniform(K.shape(inputs[1])) * (inputs[0] - inputs[1]) )([generated, real])
为什么这两种方法有效?
Keras的Lambda层会把内部的张量操作封装成Keras层的一部分,它的输出张量会自动携带_keras_history属性,这样后续传入discriminator时,整个计算图的历史是连续可追踪的,就不会再触发属性错误了。
修改完random_weighted_average函数后,你原来的discriminator_model调用代码不需要做任何改动,就能正常运行了。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

