Recebendo Logs de Treinamento de Um Modelo Keras Diretamente no Gmail

Source: Deep Learning on Medium

Imagine que você acabou de terminar o preprocessamento dos seus dados e o resultado foi 20 milhões de instâncias do problema e cada uma com mais de 150 mil features. Já se pode imaginar que o processo de treino do modelo não vai ser rápido, e enquanto o nosso modelo está treinando podemos utilizar este tempo para dar prosseguimento a outras tarefas ou até mesmo testar outras hipóteses.

Me deparei com este problema ao participar do Meli Data Chalenge 2019, cada época de treino demorou 17 horas para treinar e eu não queria ficar checando o treino a todo momento tendo que acessar o google colab, eu queria passar o final de semana sem pegar no computador, mas ainda assim poder acompanhar os logs do treinamento, como o loss e o accuracy ao final de cada época.

Buscando uma solução para este problema na documentação do Keras me deparei com a possibilidade de personalizar funções de Callbacks. Decidi então personalizar uma função para enviar os logs de treinamento ao final de cada época para meu email do Gmail, assim poderia acompanhar do celular o progresso e diagnóstico do treino.

Funções de Callbacks

Trata-se de funções que são acionadas de forma intermitente podendo ser ao final ou inicio de cada época, ou batch. Esta função recebe alguns parâmetros de log dentre eles estão o loss e o accuracy atual, uma vez que a função receba esses parâmetros ela pode fazer o que quiser com eles, inclusive enviar para o seu endereço de e-mail. Neste artigo levaremos em consideração que você seja usuário do Gmail.

Mão na Massa

Vamos nos concentrar apenas na definição de um modelo Keras juntamente com a definição do Callback personalizado.

Neste primeiro momento definiremos e compilaremos um modelo Keras para exemplificar a aplicação da nossa ideia:

Agora podemos compilar o modelo:

Antes de definimos a função para o envio de e-mail precisamos habilitar o acesso através de aplicativos não seguros a nossa conta do Gmail. Para habilitar este acesso, clique no link https://myaccount.google.com/lesssecureapps e ative a permissão para aplicativos menos seguros.

Só agora podemos definir a função de envio do e-mail:

Como é permitido enviar um e-mail para o mesmo endereço remetente, então defini ambos o destinatário e o remetente como sendo os mesmos.

Agora vamos à personalização do Callback criando uma classe filha que herde de tf.keras.callbacks.Callback e sobrescrevendo alguns dos seus métodos.

O método on_epoch_end é acionado toda vez que uma época é finalizada recebendo como parâmetro epoch (número da época finalizada) e um objeto dicionário logs com os valores de loss e accuracy obtidos ao final da época. Estes parâmetros são repassados para a função de envio de e-mail definida anteriormente:

Agora podemos iniciar o treino do nosso modelo passando como parâmetro o Callback personalizado través do argumento calbacks que recebe uma lista de instâncias dos calbacks personalizados:

Isso é tudo, agora podemos ficar com a consciência livre para outras tarefas enquanto podemos nos manter informados do processo de treinamento de uma maneira mais prática.

Exemplo de mensagem gerada.

Além disso, gostaria de deixar claro que você é livre para consultar a documentação (https://www.tensorflow.org/guide/keras/custom_callback) e criar suas próprias personalizações, imagine receber este relatório via Telegram, se dá pra fazer em Python então é possível.

Na documentação você também encontrar como receber os relatórios com uma frequência maior, caso deseje, utilizando o método on_batch_end mas eu não recomendaria uma vez que dependendo do seu batch_size isso pode aumentar consideravelmente a carga de processamento do seu treino.

Referências