Pular para o conteúdo principal

Questão de Programação — Python — FGV 2024

ProgramaçãoPython
Código
fg079825
Banca
FGV
Órgão
DATAPREV
Ano
2024
Nível
Superior
Cargo
ATI - Inteligência da Informação
Considere o seguinte código que tenta criar e treinar uma rede neural simples com TensorFlow e Keras. Observe o erro que pode ocorrer ao tentar executá-lo (desconsidere questões de indentação do Pythone):Q64.png 333×145Com base no código, assinale a opção que indica o erro que levaria a uma falha na execução.
  1. AO modelo não pode ser compilado porque não possui uma função de métrica definida no método compile.
  2. BO código falhará, pois x_train e y_train não foram definidos ou carregados.
  3. CO método Dense precisa especificar a função de ativação sigmoid na última camada.
  4. DO código apresenta erro na função de perda, que deveria ser definida como categorical_crossentropy.
  5. EA função Sequential deveria ter os parâmetros explicitamente definidos como layers=[].
Revelar gabarito e comentário

GabaritoB — O código falhará, pois x_train e y_train não foram definidos ou carregados.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Redes Neurais com TensorFlow/Keras: identificando o erro de execução

Gabarito: letra B. O código falhará porque x_train e y_train não foram definidos ou carregados antes do model.fit(). Em Python, a tentativa de usar uma variável que não recebeu valor gera NameError em tempo de execução — é exatamente o que ocorre aqui, pois o trecho apresentado não inclui a criação ou o carregamento desses dados.

O código em questão tenta construir e treinar uma rede neural simples usando a API Sequential do Keras. O fluxo típico é: definir o modelo com camadas Dense, compilar com otimizador, função de perda e métricas, e então treinar com model.fit(x_train, y_train, epochs=...). O erro apontado na alternativa B é o mais fundamental: sem os dados de treinamento, o método fit não tem o que processar e o interpretador lança uma exceção NameError ao tentar acessar x_train e y_train.

Vamos entender cada parte do código. A função Sequential cria um modelo linear, onde as camadas são adicionadas em sequência. A camada Dense é uma camada totalmente conectada, e seus principais parâmetros são o número de neurônios e a função de ativação. O método compile configura o processo de treinamento: define o otimizador (como adam), a função de perda (como sparse_categorical_crossentropy para classificação com rótulos inteiros) e as métricas de avaliação (como accuracy). O método fit executa o treinamento, recebendo os dados de entrada e os rótulos.

A alternativa B é a correta porque, no código apresentado, não há nenhuma instrução que crie ou carregue x_train e y_train. Em Python, quando uma variável não é definida, qualquer tentativa de usá-la resulta em NameError. Isso é um erro de execução, não de sintaxe — o código pode ser sintaticamente válido, mas falha ao rodar. As demais alternativas apontam problemas que não existem no código: a métrica é opcional no compile, a ativação sigmoid não é obrigatória na última camada, a função de perda sparse_categorical_crossentropy é adequada para rótulos inteiros, e a Sequential aceita as camadas como argumentos posicionais sem precisar de layers=[].

A pegadinha desta questão está em confundir erros de execução com erros de configuração do modelo. Muitos candidatos focam em detalhes de API (como a função de perda ou a ativação) e esquecem do erro mais básico: a ausência dos dados. A banca explora exatamente essa distração — o código parece completo, mas falta a definição das variáveis que alimentam o treinamento.

Alternativa A — ❌ Incorreta

A métrica não é obrigatória no método compile. O Keras permite compilar um modelo apenas com otimizador e função de perda; a métrica é um parâmetro opcional usado para monitorar o desempenho durante o treinamento. Portanto, a ausência de métrica não causa falha na execução.

Alternativa B — ✅ Correta ⟵ GABARITO

O código não define x_train e y_train antes de usá-los em model.fit(). Em Python, isso gera NameError em tempo de execução, pois a variável não existe no escopo. É o erro mais direto e evidente: sem os dados, o treinamento não pode começar.

Alternativa C — ❌ Incorreta

A função de ativação sigmoid não é obrigatória na última camada. A escolha da ativação depende do problema: para classificação binária, sigmoid é comum; para multiclasse, softmax; para regressão, nenhuma ativação (linear). O código pode usar relu ou outra ativação sem causar erro de execução.

Alternativa D — ❌ Incorreta

A função de perda sparse_categorical_crossentropy é válida quando os rótulos são inteiros (ex.: 0, 1, 2). Se os rótulos fossem one-hot encoded, usaríamos categorical_crossentropy. Mas não há erro no código por usar sparse_categorical_crossentropy — é uma escolha correta para muitos problemas de classificação.

Alternativa E — ❌ Incorreta

A Sequential aceita as camadas como argumentos posicionais, sem necessidade de nomear o parâmetro layers. O código Sequential([Dense(...), Dense(...)]) é perfeitamente válido. A alternativa sugere uma exigência que não existe na API do Keras.

NÃO CAIA NESSA!

A banca tenta desviar a atenção para detalhes de configuração do modelo (métrica, ativação, perda, parâmetros) quando o erro real é muito mais básico: a falta de definição das variáveis de dados. Em Python, usar uma variável não definida gera NameError — um erro de execução que interrompe o programa. Fique atento: antes de analisar a API, verifique se todas as variáveis usadas foram criadas.

PEGA ESSA DICA!

Ao analisar código que usa model.fit(), sempre confira se os argumentos (x_train, y_train, etc.) foram definidos anteriormente. Em questões de programação, erros de execução por variáveis não definidas são comuns e fáceis de identificar — basta procurar a atribuição da variável no código. Se não houver, é o erro.

Gabarito: letra B

Link permanente: /questoes/fg079825