自定义损失函数:对二元交叉熵误差应用权重

3

我正在尝试使用Keras预测上下文中的单词,例如从句子“我必须说这食物很美味!”中预测一个单词。我希望得到类似于以下结果:

[say the ? was tasty] -> food, meals, spaghetti, drinks

然而,我当前的问题是,我训练的网络似乎只学习了单个单词的概率,而没有学习它们在特定语境中的概率。
由于单词的频率不平衡,我认为我可以/应该在我的损失函数中应用权重 - 目前是二元交叉熵函数。
我只需将每个单词的相反概率与误差相乘即可。
def weighted_binary_crossentropy(y_true, y_pred):
    return K.mean(K.binary_crossentropy(y_pred, y_true) * (1-word_weights), axis=1)

这个函数被模型用作损失函数:

model.compile(optimizer='adam', loss=weighted_binary_crossentropy)

然而,我的结果完全相同,我不确定是我的模型有问题还是我错误地使用了“loss”参数/函数。我的“weighted_binary_crossentropy()”函数是否做到了我刚刚描述的?我问这个问题是因为由于某种原因这个东西类似:word_weights),axis = 1)。
1个回答

1
实际上,正如您在fit函数的文档中所读到的那样,您可以提供sample_weights,这似乎正是您想要使用的内容。

它说:“*如果您需要进行时间步采样加权(2D权重),请将其设置为“temporal”。 “无”默认为样本加权(1D)。”这对我来说真的不像是会为每个输出维度加权误差的方式 - 因为这正是我想要做的。 - Stefan Falk
你想应用的这些权重对每个单词都不同吗? - Marcin Możejko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接