在运行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 layer
- Average layer
- Maximum layer
- Minimum layer
- Add layer
- Subtract layer
- Multiply layer
- Dot 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 Concatenate
merge6 = 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 Layer
import keras.backend as K
class 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 MergeLayer
latent_repr = MergeLayer()([mu, log_var])