Aprendizagem por Reforço com FIFA e Keras - Agatetepê
Lezwon Castellino Blocked Desbloquear Seguir Seguindo 11 de setembro de 2018
Recentemente me deparei com um artigo interessante de Chintan Trivedi sobre o treinamento de um modelo via reforço de aprendizagem para dar chutes livres na FIFA. Intrigado com isso, decidi experimentá-lo. Infelizmente, a sessão de habilidades de chute livre não foi desbloqueada na minha nova cópia instalada da FIFA ainda, no entanto, as fotos da prática estavam disponíveis. Animado, experimentei o modelo na habilidade de atirar. Depois de alguns minutos executando o código, percebi que o modelo não foi criado para o ambiente de filmagem. Eu, portanto, decidi passar algum tempo hackeando o código para torná-lo adequado ao ambiente. A seguir estão os resultados do modelo depois de treiná-lo por cerca de 100 épocas.
Fotos aleatórias tiradas pelo modelo durante o treinamento. Fotos tiradas pelo modelo após cerca de 100 épocas.
Eu gostaria de explicar alguns trechos do meu código para aqueles que desejam replicar o resultado ou melhorá-lo. Por favor, note que não sou especialista nesta área. Esta é uma das minhas tentativas iniciais de aprendizado por reforço.
1. Vamos construir uma rede neural simples!
2. Árvores de decisão no aprendizado de máquina
3. O equilíbrio da IA passiva vs. IA ativa
4. Uma introdução intuitiva ao Machine Learning
Eu recomendo que você leia o artigo de Chintan Trivedi e seus pré-requisitos para obter um contexto do projeto e também sobre o aprendizado de reforço em geral. Chintan fez um trabalho incrível explicando o código.
Então vamos começar. Primeiro de tudo, permita-me explicar o que estou tentando construir e por quê. Quando experimentei o repo da FIFA sobre a habilidade de tiro, achei muito difícil capturar um tiro (um evento de tiro) individualmente e obter seu resultado. Como não há API do FIFA, temos que trabalhar com os dados de imagem fornecidos. Quando eu executei o modelo fornecido por Chintan, a maioria das recompensas coletadas foi atribuída a ações incorretas, pois havia uma incompatibilidade de tempo. Além disso, o modelo atual não utilizou nenhuma camada temporal que pudesse ajudar a prever eventos que ocorrem em uma sequência. Para corrigir estes dois problemas, decidi capturar toda a sequência de habilidades de tirar fotos junto com as ações e alimentá-lo para uma rede neural com LSTMs. Um grande obstáculo que enfrentei aqui foi que enquanto treinava o modelo, eu poderia inserir uma sequência de imagens e uma sequência de ações esperadas, no entanto, ao prever ações em tempo real, precisamos inserir apenas uma imagem e obter uma saída. Esse foi um desafio muito confuso, pois o modelo foi construído para receber apenas insumos em lote. Eu explicarei este assunto mais tarde. Por enquanto, aqui está o modelo que criei com a API Keras.
Como você pode ver o modelo leva em uma seqüência de imagens (cerca de 30) na forma de (30, 256, 256, 3) e produz uma seqüência de ações da forma (30, 4). As 4 ações que são permitidas no jogo são mover para a direita, mover para a esquerda, tiro baixo e tiro alto. A rede neural prevê a probabilidade das ações das quais tomaremos as duas mais altas e executaremos. Eu adicionei um ConvLSTM2D camadas com MaxPooling3D seguido por TimeDistributed Dense Layers. Essas camadas ajudam a manter a forma da sequência e geram uma saída do mesmo tamanho.
Agora, também precisamos capturar os pontos e o texto para sabermos quando a habilidade terminou e qual foi a performance. Para isso, vamos usar a biblioteca Tesseract pelo Google. Tesseract é uma biblioteca de OCR para reconhecimento de texto pelo google. Por favor, siga as instruções aqui para usá-lo. Devemos usar a API PyTesseract para acessá-lo via python. Para detectar o texto na tela, devemos primeiro capturar a tela como uma imagem. Para isso, usamos a biblioteca GrabScreen e encontramos manualmente as coordenadas do texto dos pontos usando algo como pintura.
Imagem de pontos enviada ao PyTesseract
Depois de extrairmos a área de texto, precisamos pré-processar a imagem para que o pytesseract nos forneça bons resultados de reconhecimento de caracteres. Eu converti o plano de fundo para branco puro e os pontos de primeiro plano para preto usando numpy.
Pontuação captura código para FIFA
Também precisamos capturar a seção 'RETRY DRILL' para detectar se a sessão de habilidade terminou de maneira semelhante.
O modelo anterior utilizou o algoritmo DQN para prever a próxima ação. No entanto, sinto que só pode ser usado para ambientes em que temos controle total sobre o ambiente e podemos executar um evento por vez e receber seu resultado. Algo como o ambiente OpenAI Gym é perfeito para o DQN. Para o nosso caso, eu acabei de substituir o DQN por uma função de recompensa simples que diz que se o total de pontos após a habilidade for maior que 4000, recompense todas as ações nessa sequência com 1. Se os pontos forem menores que 3500, as ações recebem uma recompensa de -1. Usando esse método, oferecemos recompensas para todo o lote de ações, em vez de apenas uma ação.
Cálculo de recompensa para toda a sequência
Manipulando o modelo
Como mencionei anteriormente, temos um problema no qual treinamos nosso modelo em uma sequência, mas durante a previsão temos apenas 1 imagem para fornecer e esperar uma saída. Bem, nós lidamos com isso criando uma matriz dummy numérica de zeros com forma (30, 256, 256, 3). Quando desejamos prever uma ação, substituímos o último elemento da sequência numpy pela imagem, ou seja, zeros [timesteps-1] = imagem. Na sequência de saída, vamos escolher o último conjunto de ações, ou seja, ações [timesteps-1] e escolher duas ações com os valores mais altos. Eu entendo que isso não é uma solução perfeita. Eu mesmo não tinha certeza de usá-lo. No entanto, parece funcionar até certo ponto.
Vamos combinar tudo isso junto e começar a treinar nosso modelo. A seguir estão alguns dos parâmetros importantes que estou usando.
Começamos em nosso arquivo main.py, onde inicializamos nosso modelo e começamos o treinamento. O arquivo train.py contém o código principal de treinamento. Nosso modelo começa a tomar ações aleatórias no começo para aprender sobre o meio ambiente. Horas extras, o modelo aprende as ações necessárias para obter mais recompensas e começa a jogar sozinho. Todas as ações realizadas são armazenadas junto com suas capturas de tela e recompensas no arquivo ExperienceReplay.py . Quando for necessário treinar, um lote é solicitado a partir do ExperienceReplay.py e o modelo é treinado.
Todo o propósito do arquivo de repetição de experiência é armazenar todos os dados gravados e atribuir recompensas às ações. Quando solicitado para um lote, o módulo cria um par de entradas (imagens) e um conjunto de recompensas para as ações. O método get_batch seleciona 3 sequências aleatórias para treinar e acrescenta a recompensa a todas as ações nessa sequência.
O último módulo é o módulo da FIFA, que é a interface entre o modelo e o jogo. Ele nos ajuda a detectar a pontuação, verificar se a broca acabou, reiniciar a broca, obter o estado atual e, o mais importante, executar ações por meio do método ato. A função get_reward retorna 1 se a pontuação final estiver acima de 4000, 0 se acima de 3500 e -1 se for menor que 3500. O código é bastante autoexplicativo.
Para começar a treinar, inicie o FIFA em um modo de janela com resolução de 1280×720. Começará no canto superior esquerdo da tela. Não o mova de lá. Escolha jogos de habilidades -> tiro -> tiro de bronze. No train.py, alterne o modo train para 1 e execute-o dentro do python. Clique na janela do FIFA depois de terminar. o programa reconhecerá automaticamente a tela e começará a tocar. Treine até 100 épocas para ver alguns resultados. Seu desempenho aumentará de mais difícil para excelente.
Resultados durante épocas iniciaisResultados após 100 épocas
O código inteiro está disponível no Github . Por favor, forneça comentários ou sugestões de melhoria. Obrigado.
Curso de Qrash: aprendizagem de reforço 101 e redes Q profundas em 10 minutos
Shaked Zychlinski Blocked Desbloquear Seguir Seguindo 9 de janeiro Este artigo não assume nenhum conhecimento prévio em Aprendizado por Reforço,…
Tipos de ML e seus Equivalentes da Teoria da Aprendizagem Humana The Curious Learner Blocked Desbloquear Seguir Seguindo 22 de…
Pol Ferrando Blocked Desbloquear Seguir Seguindo 26 de dezembro Apesar de seu alto desempenho preditivo, muitas técnicas de aprendizado de…