参考论文搭建两路指定结构CNN 单输入模型代码修正求助
代码错误修正与实现方案
现有单输入CNN代码问题
你写的单输入CNN存在3个明确错误:
- 卷积层未设置填充,堆叠两次22池化后特征图尺寸为8160,第三个5*5卷积使用默认valid填充会过度压缩特征,且后续无池化直接展平会导致全连接层参数量爆炸,极易过拟合且训练效率极低
- 512维全连接层错误使用
softmax激活:softmax仅用于多分类任务的输出层,隐藏层使用会导致特征分布异常,网络无法正常收敛 - 输出层未设置匹配任务的激活函数:如果是4分类任务需要搭配
softmax激活,如果是回归任务则使用线性激活即可,无激活的输出层不符合常规训练逻辑
修正后的单输入CNN(对应单张32*640图像输入)
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense single_cnn = Sequential([ Conv2D(filters=32, kernel_size=(5, 5), activation='relu', padding='same', input_shape=(32, 640, 3)), MaxPooling2D((2, 2)), Conv2D(filters=64, kernel_size=(5, 5), activation='relu', padding='same'), MaxPooling2D((2, 2)), Conv2D(filters=128, kernel_size=(5, 5), activation='relu', padding='same'), MaxPooling2D((2, 2)), # 新增池化层压缩特征,大幅降低全连接层参数量 Flatten(), Dense(512, activation='relu'), # 隐藏层替换为relu激活 Dense(4, activation='softmax') # 4分类任务用softmax,回归任务可删除activation参数 ]) single_cnn.summary()
三输入CNN(对应三张32*640图像输入)
根据论文常见实现逻辑,提供两种独立三输入CNN的实现方式,按需选择即可:
方式1:三张图通道维拼接后输入(适合三张图为同一样本的不同帧/不同通道场景)
triple_cnn_concat = Sequential([ # 三张RGB图通道拼接后输入通道数为3*3=9 Conv2D(filters=32, kernel_size=(5, 5), activation='relu', padding='same', input_shape=(32, 640, 9)), MaxPooling2D((2, 2)), Conv2D(filters=64, kernel_size=(5, 5), activation='relu', padding='same'), MaxPooling2D((2, 2)), Conv2D(filters=128, kernel_size=(5, 5), activation='relu', padding='same'), MaxPooling2D((2, 2)), Flatten(), Dense(512, activation='relu'), Dense(4, activation='softmax') ]) triple_cnn_concat.summary()
方式2:三分支独立提特征后融合(适合要求单独提取每张图特征再融合的场景)
from tensorflow.keras.models import Model from tensorflow.keras.layers import Input, concatenate # 复用单图特征提取骨干 def cnn_backbone(): return Sequential([ Conv2D(filters=32, kernel_size=(5, 5), activation='relu', padding='same'), MaxPooling2D((2, 2)), Conv2D(filters=64, kernel_size=(5, 5), activation='relu', padding='same'), MaxPooling2D((2, 2)), Conv2D(filters=128, kernel_size=(5, 5), activation='relu', padding='same'), MaxPooling2D((2, 2)), Flatten(), Dense(512, activation='relu') ]) # 定义三个独立输入 input1 = Input(shape=(32, 640, 3)) input2 = Input(shape=(32, 640, 3)) input3 = Input(shape=(32, 640, 3)) # 分别提取特征 feat1 = cnn_backbone()(input1) feat2 = cnn_backbone()(input2) feat3 = cnn_backbone()(input3) # 特征融合后输出 concat_feat = concatenate([feat1, feat2, feat3]) output = Dense(4, activation='softmax')(concat_feat) triple_cnn_multiinput = Model(inputs=[input1, input2, input3], outputs=output) triple_cnn_multiinput.summary()
参考结构图示
目标网络结构:
两路CNN输入形式:
图中(a)为第一个CNN的单张图像输入,(b)为第二个CNN的三张图像输入,每个矩形对应一张独立图像。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

