1
resposta

Loss não diminui

Olá, estou com o mesmo problema do post anterior. meu modelo não converge de maneira alguma ficando sempre com a mesma Loss. Não sei se está relacionado ao fato de eu não estar usando GPU agora (o google colab não deixa mais eu usar por um tempo) Eu segui os mesmos parametros que foram sugeridos acima e não funcionou. Alguma outra ideia?

args = {
    'batch_size': 100,
    'num_workers': 4,
    'num_classes': 10,
    'epochs': 10,
    'weight_decay': 0,
    'lr': 0.1
}

if torch.cuda.is_available():
  args['device'] = torch.device('cuda')
else:
  args['device'] = torch.device('cpu')

print(args)

Loader:

train_set = datasets.MNIST(root='./data', train=True, download=True, transform=transforms.ToTensor())
test_set = datasets.MNIST(root='./data', train=False, download=True, transform=transforms.ToTensor())
train_loader = DataLoader(train_set, batch_size=args['batch_size'], shuffle=True, num_workers=args['num_workers'])
test_loader = DataLoader(test_set, batch_size=args['batch_size'], shuffle=False, num_workers=args['num_workers'])

Modelo:

class MNISTClassifier(nn.Module):

  def __init__(self,input_size, hidden_size, output_size) -> None:
     super().__init__()
     self.features = nn.Sequential(
         nn.Linear(input_size, hidden_size),
         nn.ReLU(),
         nn.Linear(hidden_size, hidden_size),
         nn.ReLU()
     )
     self.out = nn.Linear(hidden_size, output_size)
     self.softmax = nn.Softmax()

  def forward(self, x):
    x = x.view(x.size(0), -1)
    x = self.features(x)
    x = self.softmax(self.out(x))
    return x


input_size = 28 * 28
hidden_size = 128
output_size = args['num_classes']
MNIST_model = MNISTClassifier(input_size, hidden_size, output_size).to(args['device'])

Otimizadores e perda:

#loss
criterion = nn.CrossEntropyLoss().to(args['device'])
#optimizer
optimizer = torch.optim.Adam(model.parameters(), lr=args['lr'], weight_decay=args['weight_decay'])
#

Execução

for epoch in range(args['epochs']):
  epoch_loss = []
  for batch in train_loader:
    data, target = batch
    #cast to device
    data = data.to(args['device'])
    target = target.to(args['device'])

    #forward
    pred = MNIST_model(data)
    loss = criterion(pred, target)
    epoch_loss.append(loss.cpu().data)

    #backward
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

  epoch_loss = np.asarray(epoch_loss)
  print("Epoca %d, Loss %.4f +/- %.4f" % (epoch, epoch_loss.mean(), epoch_loss.std()) )
1 resposta

Oi Júlio, tudo bem?

Houve atualizações na biblioteca Pytorch, o que acabou influenciando nos valores do Loss. Fiz os testes inserindo a sugestão de alteração que se encontra na transcrição da aula anterior Fluxo de Treinamento, mantive os mesmos parâmetros do modelo MLP e o Loss diminuiu, como em aula. Deixo aqui o código para que você faça a alteração também:

args = {
    'batch_size': 32,
    'num_workers': 4,
    'num_classes': 10,
    'lr': 1e-6,
    'weight_decay': 1e-4,
    'num_epochs': 30
}

Portanto, recomendo apenas alterar os valores em args e para o restante do código, seguir com os mesmos valores do curso.

Espero ter ajudado.

Qualquer dúvida, não hesite em compartilhar no fórum.

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado