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

TensorFlow多输入模型训练报错:Layer期望2个输入仅收到1个张量

问题1:model.fit直接传入数据集时报输入不匹配错误

原因

你构建的数据集每个元素是(vectorized_text, content, likes_rate),而Keras多输入模型期望的输入结构是**(输入特征元组, 标签)**,也就是每个元素应该是((text_tensor, content_tensor), label_tensor)。当前结构会让Keras把前两个张量当成一个整体输入,导致模型收到1个输入而非预期的2个。

解决方案

修改数据集构建代码,将输入特征打包成元组,标签单独分离:

# 把输入特征打包成元组,标签作为第二个元素
dataset = tf.data.Dataset.from_tensor_slices(
    ((vectorized_text, content), df['likes_rate'])
)

# 后续的缓存、打乱、批量操作保持不变
dataset= dataset.cache()
dataset= dataset.shuffle(160000)
dataset= dataset.batch(16)
dataset= dataset.prefetch(8)

之后直接调用model.fit(dataset, epochs=10)即可正常训练,无需手动遍历。

问题2:手动遍历批量训练时权重重置、无训练进展

原因

每次调用model.fit()时,即使只传一个batch,Keras也会默认重新初始化优化器状态(比如学习率调度、动量参数等),相当于每次都从头开始训练,导致权重无法累积更新。

解决方案

改用model.train_on_batch()方法,它专门用于单批次训练,不会重置模型和优化器状态:

# 遍历数据集的每个batch
for (text_batch, content_batch), y_batch in dataset:
    # 传入多输入列表和标签,执行单步训练
    loss = model.train_on_batch(x=[text_batch, content_batch], y=y_batch)
    # 可选:打印当前batch的损失
    print(f"Batch loss: {loss}")

如果需要控制多轮训练,可以在外层加循环:

epochs = 10
for epoch in range(epochs):
    print(f"Epoch {epoch+1}/{epochs}")
    total_loss = 0.0
    batch_count = 0
    for (text_batch, content_batch), y_batch in dataset:
        loss = model.train_on_batch(x=[text_batch, content_batch], y=y_batch)
        total_loss += loss
        batch_count += 1
    # 打印当前epoch的平均损失
    print(f"Average loss: {total_loss / batch_count}")
    # 可选:每轮重新打乱数据集
    dataset = dataset.shuffle(160000)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 02:58:22