You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并卷积层时出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:33:18