1
resposta

[Projeto] Identificando objetos com MobileNetV2

# =========================================
# 1. INSTALAÇÃO E IMPORTAÇÃO
# =========================================


import numpy as np
import gymnasium as gym

# Inicializa o ambiente FrozenLake-v1
env = gym.make("FrozenLake-v1")

# =========================================
# 2. HIPERPARÂMETROS E Q-TABLE
# =========================================

# Número de estados e ações
n_states = env.observation_space.n
n_actions = env.action_space.n

# Inicializa a Q-table com zeros
q_table = np.zeros((n_states, n_actions))

# Hiperparâmetros
alpha = 0.8          # taxa de aprendizado
gamma = 0.95         # fator de desconto
epsilon = 1.0        # taxa de exploração inicial
epsilon_min = 0.01   # valor mínimo de exploração
epsilon_decay = 0.995

# Treinamento
n_episodes = 10000
max_steps = 100

# =========================================
# 3. TREINAR O AGENTE COM Q-LEARNING
# =========================================

for episode in range(n_episodes):
    state, info = env.reset()
    done = False

    for step in range(max_steps):
        # Política epsilon-greedy
        if np.random.random() < epsilon:
            action = env.action_space.sample()
        else:
            action = np.argmax(q_table[state])

        next_state, reward, terminated, truncated, info = env.step(action)
        done = terminated or truncated

        # Atualização Q-Learning
        best_next_action = np.argmax(q_table[next_state])
        td_target = reward + gamma * q_table[next_state, best_next_action] * (not done)
        td_error = td_target - q_table[state, action]
        q_table[state, action] = q_table[state, action] + alpha * td_error

        state = next_state

        if done:
            break

    # Decaimento do epsilon
    if epsilon > epsilon_min:
        epsilon = max(epsilon_min, epsilon * epsilon_decay)

# =========================================
# 4. AVALIAR O DESEMPENHO
# =========================================

n_eval_episodes = 1000
successes = 0

for episode in range(n_eval_episodes):
    state, info = env.reset()
    done = False

    for step in range(max_steps):
        # Sem exploração: escolhe sempre a melhor ação aprendida
        action = np.argmax(q_table[state])

        next_state, reward, terminated, truncated, info = env.step(action)
        done = terminated or truncated
        state = next_state

        if done:
            if reward == 1:
                successes += 1
            break

print("Q-table treinada:")
print(q_table)

print(f"\nEpisódios bem-sucedidos: {successes} de {n_eval_episodes}")
print(f"Taxa de sucesso: {successes / n_eval_episodes:.2%}")

env.close()
1 resposta

Oi, Cássio! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Você estruturou bem o processo de treinamento com Q-Learning, principalmente na separação das etapas e no uso da política epsilon-greedy, que é um ponto importante para equilibrar exploração e aprendizado. Continue assim! ✨

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Por onde começar:
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!