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

Keras训练图像描述模型报TypeError: tuple索引需为整数或切片

问题背景

Keras开发图像描述生成模型时,调用dual_encoder.fit()启动训练即触发报错,相关训练代码如下:

reduce_lr = keras.callbacks.ReduceLROnPlateau(
monitor="val_loss", factor=0.2, patience=3
)
# 创建早停回调
early_stop = tf.keras.callbacks.EarlyStopping(
monitor="val_loss", patience=5, restore_best_weights=True
)
history = dual_encoder.fit(
train_dataloader,
epochs=num_epochs,
#validation_data=val_dataloader,
#callbacks=[reduce_lr, early_stop],
)
print("Training completed. Saving vision and text encoders...")
vision_encoder.save("vision_encoder")
text_encoder.save("text_encoder")
print("Models are saved.")

训练启动后在第一个Epoch直接中断,核心报错为:TypeError: tuple indices must be integers or slices, not str,对应报错位置在模型前向传播逻辑的这行代码:

caption_embeddings = text_encoder(features["caption"], training=training)
错误原因

这个报错和模型结构、回调配置无关,本质是输入数据格式和模型预期不匹配:

  • 模型前向传播逻辑中,默认输入的features是字典结构,需要通过"caption"这类字符串key取出对应的文本、图像输入数据
  • 实际传入的train_dataloader迭代产出的每个batch是元组结构,元组仅支持整数下标(如0、1)做索引,用字符串key取值就会触发该类型错误
修复步骤
  • 第一步先确认数据加载器的输出结构:执行sample_batch = next(iter(train_dataloader)),打印type(sample_batch)确认返回值类型,同时查看元组每个位置存储的内容(通常元组顺序为输入数据、标签)
  • 选择以下任意一种方案对齐格式即可:
    • 方案1:修改数据加载逻辑,让dataloader直接返回字典格式的输入,字典的key和模型中取数使用的key完全对应(比如包含"caption"以及图像输入对应的key)
    • 方案2:不改动数据加载器,直接修改模型call/train_step方法中的取数逻辑,按元组的位置下标取出对应数据,比如caption存在元组第1位就写features[1],图像输入在第0位就写features[0]
  • 改完后先拿刚才提取的sample_batch跑一次前向传播,确认无报错再启动全量训练,避免浪费训练时间

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:06:22