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

如何在Keras中实现含拼接层的小批量学习?

在Keras中实现含拼接层的小批量学习

嘿,你已经把多输入模型的核心框架搭起来了,接下来我帮你补全模型,并详细说明怎么实现小批量训练——其实Keras本身对多输入模型的小批量支持很友好,关键是处理好输入数据的格式就行。

第一步:补全你的模型定义

首先把你没写完的模型补完整,特别是输出层和模型的最终定义(要把两个输入都传入):

import keras
from keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense
from keras.models import Model

# 图像输入分支
img_rows = 32
img_cols = 32
img_channels = 3
img_input = Input(shape=(img_rows, img_cols, img_channels))
layer1 = Conv2D(16, (2, 2), padding='same', activation='relu')(img_input)
layer2 = Conv2D(16, (2, 2), padding='same', activation='relu')(layer1)
layer3 = MaxPooling2D((2, 2), strides=(2, 2), padding='same')(layer2)
layer4 = Flatten()(layer3)

# 激光输入分支
laser_input = Input(shape=(100,))

# 拼接两个分支的输出
merge_input = keras.layers.concatenate([layer4, laser_input])

# 后续全连接层和输出层(这里假设是分类任务,你可以根据任务调整)
layer5 = Dense(300, activation='relu')(merge_input)
output = Dense(10, activation='softmax')(layer5)  # 示例为10类分类任务

# 定义完整模型,传入两个输入和输出
model = Model(inputs=[img_input, laser_input], outputs=output)

# 编译模型,选择优化器、损失函数和评估指标
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

第二步:准备多输入的小批量训练数据

因为你的模型有两个输入,所以训练数据需要分成两个独立的数组/张量,分别对应图像输入和激光输入,而且两者的样本数量必须一致:

  • 图像数据:形状为 (总样本数, 32, 32, 3),每个样本是32x32的RGB图像
  • 激光数据:形状为 (总样本数, 100),每个样本是100维的特征向量
  • 标签数据:根据任务类型,比如分类任务用one-hot编码的数组,形状为 (总样本数, 类别数)

第三步:实现小批量训练

Keras的fit()方法默认就是小批量训练,你只需要指定batch_size参数即可:

方法1:直接用fit()(最常用)

# 假设你已经准备好了训练数据:X_img, X_laser, y_train;验证数据:X_val_img, X_val_laser, y_val
history = model.fit(
    [X_img, X_laser],  # 传入两个输入数据
    y_train,
    batch_size=32,  # 设置你的小批量大小,比如32、64都可以
    epochs=15,  # 训练轮数
    validation_data=([X_val_img, X_val_laser], y_val)  # 验证数据同样要传两个输入
)

方法2:手动处理批次(用train_on_batch)

如果需要更灵活的批次控制(比如自定义数据生成逻辑),可以用train_on_batch()手动遍历每个批次:

# 自定义批次生成器,每次返回一个批次的图像、激光数据和标签
def batch_generator(X_img, X_laser, y, batch_size=32):
    n_samples = len(X_img)
    for i in range(0, n_samples, batch_size):
        batch_img = X_img[i:i+batch_size]
        batch_laser = X_laser[i:i+batch_size]
        batch_y = y[i:i+batch_size]
        yield batch_img, batch_laser, batch_y

# 开始训练
epochs = 15
for epoch in range(epochs):
    print(f"===== Epoch {epoch+1}/{epochs} =====")
    total_loss = 0.0
    total_acc = 0.0
    batch_count = 0
    
    for batch_img, batch_laser, batch_y in batch_generator(X_img, X_laser, y_train):
        loss, acc = model.train_on_batch([batch_img, batch_laser], batch_y)
        total_loss += loss
        total_acc += acc
        batch_count += 1
        print(f"Batch {batch_count} - Loss: {loss:.4f}, Accuracy: {acc:.4f}")
    
    # 打印本轮平均损失和精度
    avg_loss = total_loss / batch_count
    avg_acc = total_acc / batch_count
    print(f"Epoch {epoch+1} - Average Loss: {avg_loss:.4f}, Average Accuracy: {avg_acc:.4f}\n")

关键注意事项

  • 确保两个输入的样本数量完全匹配,否则会报错
  • 每个批次的输入形状要和模型输入层定义的一致:图像批次是(batch_size, 32, 32, 3),激光批次是(batch_size, 100)
  • 如果用数据生成器(比如ImageDataGenerator),可以用keras.utils.Sequence自定义多输入生成器,逻辑和上面的batch_generator类似

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:18:09