Python 如何对位序列使用二进制交叉熵

Python 如何对位序列使用二进制交叉熵,python,keras,deep-learning,Python,Keras,Deep Learning,我想应用二进制交叉熵函数来预测N个长度位的序列,例如10位的序列[1 0 1 0 1 0 1 0 1 0 0 0]作为基本真值。softmax层后的模型输出大小为[10,2]。第二个维度是指[Probx=0,Probx=1]。我想计算这个序列的二元熵损失 所以我的基本事实是大小[?,10],我的模型输出是大小[?,10,2]。在这种情况下如何使用二元熵损失 对于这个,我得到一个错误 检查目标时出错:预期模型_3有3个维度,但得到的数组的形状为batchsize,10 当我从softmax输出中使

我想应用二进制交叉熵函数来预测N个长度位的序列,例如10位的序列[1 0 1 0 1 0 1 0 1 0 0 0]作为基本真值。softmax层后的模型输出大小为[10,2]。第二个维度是指[Probx=0,Probx=1]。我想计算这个序列的二元熵损失

所以我的基本事实是大小[?,10],我的模型输出是大小[?,10,2]。在这种情况下如何使用二元熵损失

对于这个,我得到一个错误 检查目标时出错:预期模型_3有3个维度,但得到的数组的形状为batchsize,10


当我从softmax输出中使用Probx=0或Probx=1]时,我没有得到期望的结果。如何实现这一点?

对于形状为None,10的二进制位地面真实值,模型输出应具有相同的形状。由于每个位都是独立的,为了使用二进制熵损失,您应该在输出端使用sigmoid激活,而不是softmax激活:

一个重要的细节是,模型的输出在[0,1]中是连续的,为了获得位预测,必须将模型的输出阈值设置为0.5这是keras计算二进制精度的方式:

raw_preds = model.predict(some_inputs)
bit_preds = raw_preds > 0.5

如果您想使用softmax保留当前模型,那么您必须对标签进行一次热编码,使其具有形状无、10、2,然后使用分类交叉熵作为损失。

通过使用密集层,可以为网络增加更多权重,对吗?在我使用的模型中,最后的softmax作为一个层添加到模型中,就在它不是神经网络之前。有没有办法只添加一个sigmoid层?@toinahseh是的,但除非您包含您的模型代码,否则这些详细信息并不真正负责。我使用Lambda层添加了一个sigmoid层,作为output=Lambdalambda x:keras.backend.sigmoidxoutput。我会尝试用你的方法训练。Thanks@toinahseh您可以对Activationsigmoid执行相同的操作,如更新的答案中所述
raw_preds = model.predict(some_inputs)
bit_preds = raw_preds > 0.5