#tensorflow #deep-learning #pytorch
#тензорный поток #глубокое обучение #pytorch
Вопрос:
Я пытался скопировать код, который был написан в tensorflow, с помощью pytorch. Я наткнулся на функцию потерь в tensorflow, softmax_cross_entropy_with_logits.Я искал его эквивалент в pytorch и нашел torch.nn.MultiLabelSoftMarginLoss, хотя я не совсем уверен, что это правильная функция.Также я не знаю, как измерить точность моей модели, когда я использую эту функцию потерь и нет уровня relu в конце сети вот мой код :
# GRADED FUNCTION: compute_cost
def compute_cost(Z3, Y):
loss = torch.nn.MultiLabelSoftMarginLoss()
return loss(Z3,Y)
def model(net,X_train, y_train, X_test, y_test, learning_rate = 0.009,
num_epochs = 100, minibatch_size = 64, print_cost = True):
optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate)
optimizer.zero_grad()
total_train_acc=0
for epoch in range(num_epochs):
for i, data in enumerate(train_loader, 0):
running_loss = 0.0
inputs, labels = data
inputs, labels = Variable(inputs), Variable(labels)
Z3 = net(inputs)
# Cost function
cost = compute_cost(Z3, labels)
# Backpropagation: Define the optimizer.
# Use an AdamOptimizer that minimizes the cost.
cost.backward()
optimizer.step()
running_loss = cost.item()
# Measuring the accuracy of minibatch
acc = (labels==Z3).sum()
total_train_acc = acc.item()
#Print every 10th batch of an epoch
if epoch%1 == 0:
print("Cost after epoch {} :
{:.3f}".format(epoch,running_loss/len(train_loader)))
Ответ №1:
Использовать torch.nn.CrossEntropyLoss()
. Он сочетает в себе как softmax, так и кросс-энтропию. Из документации:
Этот критерий объединяет nn.LogSoftmax() иnn.NLLLoss() в одном классе.
Пример:
# define loss function
loss_fn = torch.nn.CrossEntropyLoss(reduction='mean')
# during training
for (x, y) in train_loader:
model.train()
y_pred = model(x) # your input `torch.FloatTensor`
loss_val = loss_fn(y_pred, y)
print(loss_val.item()) # prints numpy value
optimizer.zero_grad()
loss_val.backward()
optimizer.step()
Убедитесь, что типы x
и y
указаны правильно. Обычно преобразование выполняется следующим образом: loss_fn(y_pred.type(torch.FloatTensor), y.type(torch.LongTensor))
.
Для измерения точности вы можете определить пользовательскую функцию:
def compute_accuracy(y_pred, y):
if list(y_pred.size()) != list(y.size()):
raise ValueError('Inputs have different shapes.',
list(y_pred.size()), 'and', list(y.size()))
result = [1 if y1==y2 else 0 for y1, y2 in zip(y_pred, y)]
return sum(result) / len(result)
И использовать оба вот так:
model.train()
y_pred = model(x)
loss_val = loss_fn(y_pred.type(torch.FloatTensor), y.type(torch.LongTensor))
_, y_pred = torch.max(y_pred, 1)
accuracy_val = compute_accuracy(y_pred, y)
print(loss_val.item()) # print loss value
print(accuracy_val) # print accuracy value
# update step e.t.c
Если ваши входные данные одноразово закодированы, вы можете преобразовать их в обычную кодировку перед использованием loss_fn
:
_, targets = y.max(dim=1)
y_pred = model(x)
loss_val = loss_fn(y_pred, targets)
Комментарии:
1. tnx в любом случае, существует проблема с CrossEntropyLoss, и она не принимает метки с горячей кодировкой, в любом случае, я могу использовать ее с одной горячей кодировкой?
2. Да, я добавлю это к ответу через минуту.