TensorFlow实现并行层拼接神经网络触发TypeError如何解决
报错原因
Concatenate层调用逻辑错误:Keras中Concatenate是层类,需要先完成实例化,再将待拼接的张量列表作为参数传入实例化后的层对象。你的代码直接把张量列表传入Concatenate的构造函数,最终得到的是层对象而非计算张量,后续Flatten层收到层对象而非张量,就触发了类型报错。- 模型输入定义错误:你的网络仅有一个全局输入
input_,四个并行分支都是基于这个输入衍生的计算节点,你在定义Model时错误将四个分支的第一层卷积输出设为模型输入,也会导致后续计算逻辑异常。
修复后可运行的完整代码
from tensorflow.keras.layers import Input, Conv2D, BatchNormalization, AveragePooling2D, MaxPooling2D, Concatenate, Flatten, Dense from tensorflow.keras.activations import relu, softmax from tensorflow.keras.models import Model # 定义模型输入 input_ = Input(shape=(224, 224, 3)) # 第一个并行分支 in_1 = Conv2D(filters=16, kernel_size=(3, 3), activation=relu)(input_) conv_1 = BatchNormalization()(in_1) conv_1 = AveragePooling2D(pool_size=(2, 2), strides=(3, 3))(conv_1) # 第二个并行分支 in_2 = Conv2D(filters=16, kernel_size=(5, 5), activation=relu)(input_) conv_2 = BatchNormalization()(in_2) conv_2 = AveragePooling2D(pool_size=(2, 2), strides=(3, 3))(conv_2) # 第三个并行分支 in_3 = Conv2D(filters=16, kernel_size=(5, 5), activation=relu)(input_) conv_3 = BatchNormalization()(in_3) conv_3 = MaxPooling2D(pool_size=(2, 2), strides=(3, 3))(conv_3) # 第四个并行分支 in_4 = Conv2D(filters=16, kernel_size=(9, 9), activation=relu)(input_) conv_4 = BatchNormalization()(in_4) conv_4 = MaxPooling2D(pool_size=(2, 2), strides=(3, 3))(conv_4) # 修正拼接逻辑:先实例化Concatenate层,再传入待拼接张量列表 concat = Concatenate()([conv_1, conv_2, conv_3, conv_4]) flat = Flatten()(concat) out = Dense(units=4, activation=softmax)(flat) # 修正模型输入为全局唯一的输入张量 model = Model(inputs=input_, outputs=out) model.summary()
内容的提问来源于stack exchange,提问作者Milad Sadeghi.DM
相关产品推荐
相关产品推荐

