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

参考论文搭建两路指定结构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()

参考结构图示

目标网络结构:
neural network structure

两路CNN输入形式:
input for 2 CNNs

图中(a)为第一个CNN的单张图像输入,(b)为第二个CNN的三张图像输入,每个矩形对应一张独立图像。

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:01:58