无y输出场景下如何为Keras自定义数据生成器添加样本权重?
解决方案
不改动现有输入格式的样本权重接入方法
你遇到的核心问题是Keras 2.3.1版本的训练引擎逻辑中,只有当y不为None时才会保留传入的样本权重,针对你的场景可以用两种方案解决:
- 方案1(最小改动):将生成器返回的
None替换为和batch size等长的占位空数组,仅用来绕开y is None的判断逻辑,这个占位数组不会被你的模型实际使用,不会触发格式报错。
生成器的yield代码修改如下:
Keras检测到# 替换原有的yield [batch_token_ids, batch_segment_ids], None, sample_weights yield [batch_token_ids, batch_segment_ids], np.zeros((self.batch_size,)), sample_weightsy不为None后,就会正常保留你传入的样本权重进入后续计算流程。 - 方案2(兼容性最高):将样本权重作为第三个输入项合并到
x中,完全绕开Keras原生样本权重的处理逻辑,生成器返回二元组即可:
后续直接在模型的损失计算层,手动将每个样本的损失乘上对应权重即可。yield [batch_token_ids, batch_segment_ids, sample_weights], None
自定义损失函数的适配要求
- 如果使用Keras原生损失函数,只要完成上面的修改让样本权重被Keras正常接收,不需要额外调整损失函数,Keras会自动完成损失加权计算。
- 如果使用自定义损失函数:
- 采用方案1的原生样本权重逻辑时,不需要修改损失函数,Keras会在损失计算完成后自动应用权重。
- 采用方案2的手动传入权重逻辑时,需要在损失函数中取出对应权重,和单样本损失相乘后再返回平均损失即可。
内容的提问来源于stack exchange,提问作者New_Programmer
相关产品推荐
相关产品推荐

