合并卷积层时出现Merge未定义错误的解决方法
解决Keras中
NameError: name 'Merge' is not defined的问题 这个错误很常见,是因为你用了Keras 1.x版本的旧API——Merge层在Keras 2.0及以后的版本已经被正式废弃,取而代之的是更灵活的拼接API。下面给你一步步修正代码的方案:
第一步:先解决隐藏的缩进bug
你原来的代码里convs.append(pool)写在了for循环外面,这会导致不管你定义了多少个卷积核尺寸,convs列表最后只会有一个元素。先把这行缩进,放到循环内部:
convs = [] for k_no in range(len(kernel_size)): conv = Convolution2D(nb_filters, kernel_size[k_no][0],kernel_size[k_no][1], border_mode='same', activation='relu', input_shape=input_shape)(inp) pool = MaxPooling2D(pool_size=pool_size)(conv) convs.append(pool) # 把这行缩进,放到循环里!
第二步:替换废弃的Merge为新版拼接方式
有两种常用的新版拼接方式,选一种即可:
方式1:使用Concatenate层(类形式)
首先确保导入这个层:
# 如果用TensorFlow Keras(推荐) from tensorflow.keras.layers import Convolution2D, MaxPooling2D, Concatenate, Model # 如果用纯Keras(不推荐,建议迁移到TF Keras) # from keras.layers import Convolution2D, MaxPooling2D, Concatenate, Model
然后修改拼接逻辑:
if len(kernel_size) > 1: out = Concatenate(axis=-1)(convs) # axis=-1表示按通道维度拼接,这是CNN里最常用的方式 else: out = convs[0] # 注意新版Model的参数是inputs和outputs,不是旧版的input和output conv_model = Model(inputs=inp, outputs=out)
方式2:使用concatenate函数(函数形式)
导入函数:
from tensorflow.keras.layers import concatenate # 或者 from keras.layers import concatenate
拼接逻辑改成:
if len(kernel_size) > 1: out = concatenate(convs, axis=-1) else: out = convs[0] conv_model = Model(inputs=inp, outputs=out)
额外的兼容性优化(避免警告)
Keras 2.x之后,border_mode参数也被重命名为padding,建议同步修改,避免运行时警告,同时可以简化kernel_size的写法:
conv = Convolution2D(nb_filters, kernel_size=kernel_size[k_no], padding='same', activation='relu', input_shape=input_shape)(inp)
如果你非要用旧版Keras(不推荐)
如果因为特殊原因必须使用Keras 1.x版本,可以导入旧的Merge层:
from keras.layers.merge import Merge
但这个API已经被标记为废弃,后续版本会被移除,强烈建议升级到新版Keras/TensorFlow Keras。
内容的提问来源于stack exchange,提问作者Ashna Eldho
相关产品推荐
相关产品推荐

