Neural network 如何编写自定义的CrossEntropyLoss

Neural network 如何编写自定义的CrossEntropyLoss,neural-network,pytorch,logistic-regression,cross-entropy,Neural Network,Pytorch,Logistic Regression,Cross Entropy,我正在Pytorch中学习逻辑回归,为了更好地理解我定义的自定义交叉熵如下: def log_softmax(x): return x - torch.logsumexp(x,dim=1) def softmaxx: exp_x=torch.expx sum\u x=torch.sumexp\u x,dim=1,keepdim=True 返回exp\u x/sum\u x def log_softmaxx: return torch.expx-torch.sumtorch.expx,d

我正在Pytorch中学习逻辑回归,为了更好地理解我定义的自定义交叉熵如下:

def log_softmax(x):
    return x - torch.logsumexp(x,dim=1)
def softmaxx: exp_x=torch.expx sum\u x=torch.sumexp\u x,dim=1,keepdim=True 返回exp\u x/sum\u x def log_softmaxx: return torch.expx-torch.sumtorch.expx,dim=1,keepdim=True def CrossEntropylosOutput,目标: num_examples=targets.shape[0] 批次大小=输出。形状[0] 输出=日志\ U softmaxoutputs 输出=输出[范围批次大小,目标] 返回-torch.sumoutputs/num_示例 我还做了我自己的逻辑回归来预测时装设计师,如下所示:

def log_softmax(x):
    return x - torch.logsumexp(x,dim=1)
输入尺寸=784 28x28时装师数据 输出尺寸=10 w_init=np.random.normalscale=0.05,size=input\u dim,output\u dim w_init=torch.tensorw_init,需要w_grad=True.float b=火炬。零点输出尺寸 def my_modelx: bs=x.shape[0] 返回x.ebs,输入w_dim@w_init+b 为了验证我的自定义crossentropyloss,我将其与Pytorch的nn.crossentropyloss进行了比较,将其应用于FashionList数据,如下所示:

def log_softmax(x):
    return x - torch.logsumexp(x,dim=1)
标准=nn.CrossEntropyLoss 对于trn\u fashion\u dl中的X,y: 输出=my_modelX my_输出=softmaxoutputs my_ce=交叉输入路径丢失my_输出,y pytorch\u ce=标准输出,y 打印“我的自定义交叉熵:{my\u ce.item}\npytorch交叉熵:{pytorch\u ce.item}” 打破 我的问题是我的交叉熵与pytorch的交叉熵的结果不同:

我的自定义交叉熵:9.956839561462402 pytorch交叉入口:2.378990888595581 我提前感谢你的帮助

您的日志似乎有误。它应该是:

def log_softmax(x):
    return torch.log(softmax(x))
但由于您的softmax在数值上不稳定,因此可能会有点不稳定。您可以通过以下方式进行改进:

def log_softmax(x):
    return x - torch.logsumexp(x,dim=1)
请注意,我使用了标识 log exp{x}/sum expx=x-log sum expx

另请参见

您的日志似乎是错误的。它应该是:

def log_softmax(x):
    return torch.log(softmax(x))
但由于您的softmax在数值上不稳定,因此可能会有点不稳定。您可以通过以下方式进行改进:

def log_softmax(x):
    return x - torch.logsumexp(x,dim=1)
请注意,我使用了标识 log exp{x}/sum expx=x-log sum expx


另请参见

代码中有两个错误

log_softmaxx应该是这样的, def log_softmaxx: return torch.logsoftmaxx 当您计算自己的CE损耗时,您应该输入输出,而不是my_输出。因为您将在自己的CE损耗函数中计算softmax。应该是,, 输出=my_modelX my_ce=交叉输入输出,y pytorch\u ce=标准输出,y 然后你会得到相同的结果

我的自定义交叉熵:3.584486961364746 pytorch交叉入口:3.584486961364746
代码中有两个bug

log_softmaxx应该是这样的, def log_softmaxx: return torch.logsoftmaxx 当您计算自己的CE损耗时,您应该输入输出,而不是my_输出。因为您将在自己的CE损耗函数中计算softmax。应该是,, 输出=my_modelX my_ce=交叉输入输出,y pytorch\u ce=标准输出,y 然后你会得到相同的结果

我的自定义交叉熵:3.584486961364746 pytorch交叉入口:3.584486961364746
谢谢,在更改log_softmax后,两个交叉熵变得更接近,但并不完全相同,这是预期的吗?我的自定义交叉熵:2.3021483421325684 pytorch交叉熵:2.4871463775634766谢谢,更改log_softmax后,两个交叉熵变得更接近,但不完全相同,这是预期的吗?我的自定义交叉熵:2.3021483421325684 pytorch交叉熵:2.4871463775634766