Я изучаю логистическую регрессию в Pytorch и, чтобы лучше понять, я определяю собственный CrossEntropyLoss, как показано ниже:
def softmax(x):
exp_x = torch.exp(x)
sum_x = torch.sum(exp_x, dim=1, keepdim=True)
return exp_x/sum_x
def log_softmax(x):
return torch.exp(x) - torch.sum(torch.exp(x), dim=1, keepdim=True)
def CrossEntropyLoss(outputs, targets):
num_examples = targets.shape[0]
batch_size = outputs.shape[0]
outputs = log_softmax(outputs)
outputs = outputs[range(batch_size), targets]
return - torch.sum(outputs)/num_examples
Я также делаю свою собственную логистическую регрессию (для предсказания FashionMNIST), как показано ниже:
input_dim = 784 # 28x28 FashionMNIST data
output_dim = 10
w_init = np.random.normal(scale=0.05, size=(input_dim,output_dim))
w_init = torch.tensor(w_init, requires_grad=True).float()
b = torch.zeros(output_dim)
def my_model(x):
bs = x.shape[0]
return x.reshape(bs, input_dim) @ w_init + b
Чтобы проверить мой собственный кроссентропилосс, я сравнил его с nn.CrossEntropyLoss от Pytorch, применив его к данным FashionMNIST, как показано ниже:
criterion = nn.CrossEntropyLoss()
for X, y in trn_fashion_dl:
outputs = my_model(X)
my_outputs = softmax(outputs)
my_ce = CrossEntropyLoss(my_outputs, y)
pytorch_ce = criterion(outputs, y)
print (f'my custom cross entropy: {my_ce.item()}\npytorch cross entroopy: {pytorch_ce.item()}')
break
Мой вопрос касается результатов my_ce (моя перекрестная энтропия)) против pytorch_ce (кросс-энтропия pytorch), где они разные:
my custom cross entropy: 9.956839561462402
pytorch cross entroopy: 2.378990888595581
Я заранее благодарен за вашу помощь!