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]
- 方案1:修改数据加载逻辑,让dataloader直接返回字典格式的输入,字典的key和模型中取数使用的key完全对应(比如包含
- 改完后先拿刚才提取的sample_batch跑一次前向传播,确认无报错再启动全量训练,避免浪费训练时间
内容的提问来源于stack exchange,提问作者albert
相关产品推荐
相关产品推荐

