Objetivo: acompanhar o cálculo de uma rede e distinguir treinamento e inferência.
A propagação direta (forward pass) aplica cada camada na ordem. Ela produz os logits e, em seguida, a perda se os alvos estiverem disponíveis. Ela não modifica nenhum peso.
logits = model(x) # propagação direta
loss = criterion(logits, y)Para um batch x de forma (32, 20), uma camada Linear(20, 64) fornece (32, 64).
Uma segunda Linear(64, 4) fornece (32, 4). O eixo do batch é conservado; o último eixo
muda conforme a camada.
Em treinamento, a rede conserva as informações necessárias ao cálculo dos gradientes. Em inferência, desativamos esse rastreamento e colocamos o modelo em modo de avaliação:
model.eval()
with torch.inference_mode():
logits = model(x)
predictions = logits.argmax(dim=1)model.eval() regula o comportamento de Dropout e BatchNorm. inference_mode() evita a
construção do grafo de gradiente. As duas operações são complementares.
Uma rede é um grafo de operações. O PyTorch memoriza quais operações produziram
cada tensor quando requires_grad=True. Esse rastro será percorrido em sentido inverso pela
retropropagação.
argmax antes da função de perda: a operação destrói a informação útil ao
gradiente.model.eval() durante a validação.A propagação direta aprende? Por que chamar ao mesmo tempo eval() e
inference_mode()?
Não, ela calcula. eval() muda certas camadas; inference_mode() desativa o
grafo de gradiente.
Escreva um pseudoteste que chama duas vezes o mesmo modelo contendo dropout, primeiro em
modo de treinamento e depois em modo de avaliação. Preveja quais resultados devem ser idênticos
e explique o papel distinto de eval() e inference_mode(). Entregável: teste e diagnóstico.
Leitura: a propagação direta calcula as saídas nos dois casos, mas apenas o percurso
de treinamento conserva o que é necessário ao cálculo dos gradientes. Em inferência,
combine model.eval() e torch.inference_mode(). A armadilha é acreditar que um
substitui o outro: eles controlam mecanismos diferentes.