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

如何拼接输入不同的两个CNN模型并完成二分类任务的训练与验证?

多输入拼接二分类模型训练实现方案

1. 统一数据集格式

你的两个输入分别是numpy数组(单通道)和tf.data.Dataset(三通道),需要打包成匹配模型双输入结构的数据集:

  • 先把单通道numpy数组转成tf.data.Dataset:
import tensorflow as tf

# 单通道数据集转成Dataset
train_ds_single = tf.data.Dataset.from_tensor_slices((x_train, y_train))
val_ds_single = tf.data.Dataset.from_tensor_slices((x_val, y_val))

# 对齐三通道数据集的batch大小与性能优化
BATCH_SIZE = 32
train_ds_single = train_ds_single.batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)
val_ds_single = val_ds_single.batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)
  • 把两个数据集打包成双输入元组(顺序要和模型输入定义对应):
# 打包训练集:(单通道图像, 三通道图像) 作为输入,标签作为输出
train_ds_combined = tf.data.Dataset.zip((train_ds_single, train_set)).map(
    lambda (x1, y), (x2, _): ((x1, x2), y)
)

# 打包验证集
val_ds_combined = tf.data.Dataset.zip((val_ds_single, val_set)).map(
    lambda (x1, y), (x2, _): ((x1, x2), y)
)

注意:确保单通道与三通道数据集的样本一一对应(来自同一张原始图),这里忽略三通道数据集的重复标签不影响训练。

2. 构建双分支拼接模型

分别定义两个分支的特征提取网络,拼接输出后添加二分类头:

from tensorflow.keras import layers, Model

# 分支1:单通道输入特征提取
input_single = layers.Input(shape=(224, 224, 1), name="single_channel_input")
x1 = layers.Conv2D(32, (3,3), activation='relu')(input_single)
x1 = layers.MaxPooling2D((2,2))(x1)
x1 = layers.Conv2D(64, (3,3), activation='relu')(x1)
x1 = layers.MaxPooling2D((2,2))(x1)
x1 = layers.GlobalAveragePooling2D()(x1)
branch1_output = layers.Dense(128, activation='relu')(x1)

# 分支2:三通道输入特征提取
input_triple = layers.Input(shape=(224, 224, 3), name="triple_channel_input")
x2 = layers.Conv2D(64, (3,3), activation='relu')(input_triple)
x2 = layers.MaxPooling2D((2,2))(x2)
x2 = layers.Conv2D(128, (3,3), activation='relu')(x2)
x2 = layers.MaxPooling2D((2,2))(x2)
x2 = layers.GlobalAveragePooling2D()(x2)
branch2_output = layers.Dense(128, activation='relu')(x2)

# 拼接两个分支的特征
concat = layers.concatenate([branch1_output, branch2_output])
# 二分类输出层
output = layers.Dense(1, activation='sigmoid', name="binary_output")(concat)

# 定义完整模型
combined_model = Model(inputs=[input_single, input_triple], outputs=output)

# 编译模型
combined_model.compile(optimizer='adam',
                       loss='binary_crossentropy',
                       metrics=['accuracy'])

3. 训练与验证

直接使用打包好的组合数据集进行训练和验证:

# 训练模型
history = combined_model.fit(
    train_ds_combined,
    validation_data=val_ds_combined,
    epochs=10
)

# 验证模型性能
val_loss, val_acc = combined_model.evaluate(val_ds_combined)
print(f"验证集准确率: {val_acc:.4f}")

关键注意事项

  • 样本对齐:必须保证单通道的第i个样本和三通道的第i个样本是同一张图的不同预处理版本,否则训练完全失效。
  • 预处理同步:如果三通道数据集有归一化等预处理(比如image_dataset_from_directory的rescale参数),单通道数据要执行相同的预处理逻辑,比如:
def preprocess_single(x, y):
    x = tf.cast(x, tf.float32) / 255.0  # 和三通道归一化逻辑一致
    return x, y

train_ds_single = train_ds_single.map(preprocess_single)
  • 分支结构调整:可以根据需求替换分支网络(比如用预训练模型作为特征提取器),只要保证最终输出可以拼接即可。

内容的提问来源于stack exchange,提问作者Meriem Chahinez Ben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:05:22