Neural network 如何编写自定义的CrossEntropyLoss
我正在Pytorch中学习逻辑回归,为了更好地理解我定义的自定义交叉熵如下: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
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