在运行AAE的git代码时,发现encoder的构建中,有一行是报错的:
latent_repr = merge([mu, log_var],mode=lambda p: p[0] + K.random_normal(K.shape(p[0])) * K.exp(p[1] / 2),output_shape=lambda p: p[0])
报错显示merge有问题:TypeError: 'module' object is not callable
原因分析:
查看了keras关于Merging layer的文档,发现现在的keras.layer中并不存在merge这个方法。keras.layer只提供以下几个方法
Concatenate layerAverage layerMaximum layerMinimum layerAdd layerSubtract layerMultiply layerDot layer
解决办法:对merge进行改写。
若merge( [Layer] , mode, output_shape) 中的mode = 'concat' , 则需要使用Concatenate方法, 若mode='multi' 则换成Multiply方法
merge6 = merge([drop4, up6], mode='concat', concat_axis=3)# 换成:from keras.layers import Concatenatemerge6 = Concatenate(axis=3)([drop4, up6])
若merge( [Layer] , mode, output_shape) 中的mode =是一个复杂的公式,则需要自己创建一个class
latent_repr = merge([mu, log_var],mode=lambda p: p[0] + K.random_normal(K.shape(p[0])) * K.exp(p[1] / 2),output_shape=lambda p: p[0])# 换成:# 1 新建一个MergeLayer.py文件如下from keras.engine.base_layer import Layerimport keras.backend as Kclass MergeLayer(Layer):def __init__(self, **kwargs):super(MergeLayer, self).__init__(**kwargs)def compute_output_shape(self, input_shape):return (input_shape[0][0], input_shape[0][1])def call(self, x, mask=None):final_output = x[0] + K.random_normal(K.shape(x[0])) * K.exp(x[1] / 2)return final_output# 2 在原方法中引用并调用这个类的方法:from MergeLayer import MergeLayerlatent_repr = MergeLayer()([mu, log_var])
参考博客