Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 理解交叉熵损失_Python_Machine Learning_Neural Network_Loss Function - Fatal编程技术网

Python 理解交叉熵损失

Python 理解交叉熵损失,python,machine-learning,neural-network,loss-function,Python,Machine Learning,Neural Network,Loss Function,我看到很多关于CEL或二元交叉熵损失的解释,基本事实是0或1,然后得到如下函数: def CrossEntropy(yHat, y): if yHat == 1: return -log(y) else: return -log(1 - y) 然而,当您的yHat不是离散的0或1时,我对BCE如何工作感到困惑。例如,如果我想查看MNIST数字的重建损失,其中我的基本事实为0

我看到很多关于CEL或二元交叉熵损失的解释,基本事实是0或1,然后得到如下函数:

def CrossEntropy(yHat, y):
    if yHat == 1:
      return -log(y)
    else:
      return -log(1 - y)
然而,当您的yHat不是离散的0或1时,我对BCE如何工作感到困惑。例如,如果我想查看MNIST数字的重建损失,其中我的基本事实为0 编辑:

抱歉,让我为我的困惑提供更多的背景。在关于VAEs的PyTorch教程中,他们使用BCE计算重建损失,其中yhat(据我所知,不是离散的)。见:


实现是可行的……但我不明白在这种情况下BCE损失是如何计算的。

交叉熵损失仅用于分类问题:即,目标(
yHat
)是离散的。如果你有回归问题,像均方误差(MSE)损失这样的东西会更合适。您可以找到PyTorch库及其实现的各种损失

在MNIST数据集的情况下,实际上存在一个多类分类问题(您试图从10个可能的数字中预测正确的数字),因此二进制交叉熵损失不合适,您应该使用一般交叉熵损失

无论如何,调查的第一步应该是确定你的问题是“分类”还是“回归”。适用于一个问题的损失函数通常不适用于另一个问题


编辑:您可以在TensorFlow网站上的中找到有关MNIST问题的更详细的交叉熵损失解释。

您通常不应该将非二进制的类集编码为0到1之间的值。在MNIST的情况下,如果要标记每个数字0、0.1、0.2等,这意味着2的图像与0的图像更相似,而不是5的图像,这不一定是真的

一个好办法是将标签“一次热编码”,改为10个0元素的数组。然后,将数字图像对应的索引设置为1


如上所述,您将使用正则交叉熵损失函数。然后,您的模型应该为每个样本输出一个条件概率向量,对应于每个可能的类。可能使用softmax函数。

交叉熵测量任意两个概率分布之间的距离。在您描述的(VAE)中,MNIST图像像素被解释为像素“开/关”的概率。在这种情况下,目标概率分布不是狄拉克分布(0或1),但可以有不同的值。看

以上述内容为参考,假设您的模型为某个像素输出0.7的重建。这本质上是说,您的模型估计p(像素=1)=0.7,因此p(像素=0)=0.3。
如果目标像素仅为0或1,则此像素的交叉熵在真实像素为0时为-log(0.3),在真实像素为1时为-log(0.7)(较小的值)。
如果真实像素为1,则完整公式为-(0*log(0.3)+1*log(0.7)),否则为-(1*log(0.3)+1*log(0.7))

假设你的目标像素实际上是0.6!这本质上是说像素的概率为0.6开,0.4关。
这只是将交叉熵计算更改为-(0.4*log(0.3)+0.6*log(0.7))


最后,您可以简单地对图像上的每像素交叉熵进行平均/求和。

Hmm我主要在VAE的上下文中感到困惑。例如,在pytorch官方示例中,BCE用于重建损失:对抗性问题不同于传统的MNIST分类问题。在对抗问题中,第二个网络试图输出第一个网络生成的图像是真实数据的概率。这是一个二元问题:真与假。在传统的分类问题中,单个网络试图输出图像对应于任意数字的概率。这是一个多类问题:0 vs 1 vs 2 vs等。无论如何,对于真实与虚假的问题,BCE是合适的。你写的函数应该能正常工作,除了
yHat
如果图像是假的,则为0,如果图像是真的,则为1
y
是它是真实的概率(由第二个网络生成)。我想你误解了,我指的是一个可变自动编码器,而不是一个GAN。另外,我很想看看源代码,但我在挖掘它时遇到了一些麻烦。如果我没记错的话,nn模块调用F.模块,而F.模块对于BCE调用其他东西(C中的文件?),我实际上很难找到它…对于带有图像的自动编码器,您可以将像素值规格化为范围
[0,1]
,然后明智地使用BCE像素,但这就是他们在这里做的吗?在你发布的代码中,代码处理的不仅仅是0和1。第一个
if
语句处理
1
的情况,但是
else
语句处理所有其他值,而不仅仅是
0
。签出后,他们从数据中获取sigmoid函数,因此它被规范化为
[0,1]
@stackoverflowuser2010-对,但此代码无法正常工作(如在计算适当的CE损失时)如果不是0或1。