У меня есть CNN, который я использую для определения ключевой точки лица.Я могу построить точки истинности земли и также спрогнозировать, какие ключевые точки будут показаны.Однако они сгруппированы вокруг центра изображения и не двигаются во время или после тренировки.
Я использовал nll_loss с оптимизатором SGD.При этом я получил ожидаемые значения потерь, например, 0,00364755.Я читал, что MSE был хорошим выбором для проблем регрессии, и я изменил функцию потерь на MSE, и теперь все, что я получаю, когда тренировка - это моя потеря.Я изменил params методично, например, пример lr с 0.1 - 0.0000001, импульс 0.1 - 0.9, размеры партий 1, 16, 32, 64, 128
Вот часть кода.Как всегда, любая помощь приветствуется, спасибо за внимание.
criterion = nn.MSELoss()
def train(args, model, device, train_loader, criterion, optimizer,
epoch):
running_loss = 0.0
total_train_loss = 0.0
model.train()
for batch_idx, batch in enumerate(train_loader):
data = batch['image']
target = batch['key_points']
target = target.view(target.size(0), -1)
data, target = data.to(device), target.to(device)
target = target.type(torch.cuda.FloatTensor)
data = data.type(torch.cuda.FloatTensor)
data = data.unsqueeze(1).float()
output = model(data) # forward pass
target = target.view(target.shape[0], -1)
# print(target.dtype, ' Target Data Type')
# print(data.dtype, ' Data Data Type')
train_loss = criterion(output, target)
optimizer.zero_grad()
train_loss.backward()
optimizer.step()
# print loss
running_loss += train_loss.item()
if batch_idx % 10 == 9: # print every 10 batches
print('Epoch: {}, Batch: {}, Avg. Loss:
{}'.format(epoch + 1, batch_idx + 1, running_loss / 1000))
# running_loss = 0.0
print('Finished Training')
def test(args, model, device, criterion, val_loader):
model.eval()
total_loss = 0
test_loss = 0
correct = 0
with torch.no_grad():
for batch_idx, batch in enumerate(val_loader):
data = batch['image']
target = batch['key_points']
data, target = data.to(device), target.to(device)
target = target.type(torch.cuda.FloatTensor)
data = data.type(torch.cuda.FloatTensor)
output = model(data)
test_loss = criterion(output, target)
# print('TESTING 4: Data and target shape: ',
data.shape, ' ', target.shape)
total_loss += test_loss
test_loss /= len(val_loader.dataset)
print('\nTest set: Average loss: {:.4f}, Accuracy:
{}/{}
({:.0f}%)\n'.format(
test_loss, correct, len(val_loader.dataset),
100. * correct / len(val_loader.dataset)))
return total_loss / batch_idx
enter code here