AI, curso prático. Configurando o modelo e os hiperparâmetros para reconhecer emoções nas imagens



Nos artigos anteriores desta série de treinamentos, foram descritas possíveis opções para a preparação dos dados: pré-processamento e adição de dados com imagens ; nesses artigos, também foi construído o modelo Base para reconhecimento de emoções com base em imagens de uma rede neural convolucional.
Neste artigo, construiremos um modelo de rede neural convolucional aprimorado para reconhecer emoções em imagens usando uma técnica chamada aprendizado indutivo .

Primeiro, você precisa se familiarizar com o artigo sobre o Modelo básico para reconhecer emoções em imagens , também pode consultá-lo durante a leitura, pois algumas seções, incluindo o estudo dos dados de origem e a descrição dos indicadores de rede, não serão fornecidas aqui em detalhes.

Dados


O conjunto de dados contém 1630 imagens com emoções de duas classes: Negativo (classe 0) e Positivo (classe 1). Alguns exemplos dessas imagens são apresentados abaixo.

Negativo






Positivo






Alguns dos exemplos contêm emoções positivas ou negativas óbvias, enquanto outros podem não ser categorizados - mesmo com o envolvimento humano. Com base em uma inspeção visual desses casos, estimamos que a precisão máxima possível seja de cerca de 80%. Observe que um classificador aleatório fornece aproximadamente 53% de precisão devido a um pequeno desequilíbrio nas classes.

Para treinar o modelo, usamos a técnica de reter parte das amostras e dividir o conjunto de dados inicial em duas partes, uma das quais (20% do conjunto inicial) será usada por nós para verificação. O particionamento é realizado usando estratificação : isso significa que o equilíbrio entre as classes é mantido nos conjuntos de treinamento e teste.

Resolvendo Insuficiência de Dados


O modelo básico apresentou resultados apenas ligeiramente melhores que as previsões aleatórias da classe de imagens. Pode haver muitos motivos possíveis para esse comportamento. Acreditamos que o principal motivo é que a quantidade de dados disponível é decididamente insuficiente para esse treinamento da parte convolucional da rede que permitiria obter características características baseadas na imagem de entrada.
Existem muitas maneiras diferentes de resolver o problema da insuficiência de dados. Aqui estão alguns deles:

  • Buscar novamente . A idéia do método é avaliar a distribuição de dados e selecionar novos exemplos dessa distribuição.
  • Aprendendo sem professor . Todos podem encontrar grandes quantidades de dados da mesma natureza que exemplos marcados em um determinado conjunto de dados. Por exemplo, podem ser filmes para reconhecimento de vídeo ou audiolivros para reconhecimento de fala. O próximo passo é usar esses dados para pré-treinar o modelo (por exemplo, usando codificadores automáticos).
  • Aumento de dados . Durante esse processo, os dados de amostra são modificados aleatoriamente usando um determinado conjunto de transformações.
  • Aprendizagem indutiva . Este tópico é de grande interesse para nós, então vamos nos familiarizar com ele em mais detalhes.

Aprendizagem indutiva


O termo treinamento indutivo refere-se a um conjunto de técnicas usando modelos (geralmente muito grandes) treinados em diferentes conjuntos de dados de aproximadamente a mesma natureza.





Comparação de métodos tradicionais de aprendizado de máquina e aprendizado indutivo. Imagem retirada da entrada de blog de S. Ruder "O que é aprendizado indutivo?" .
Existem três cenários principais para o uso da aprendizagem indutiva:

  • Modelos pré-treinados . Qualquer usuário pode simplesmente pegar um modelo treinado por outra pessoa e usá-lo para suas tarefas. Esse cenário é possível se as tarefas forem muito semelhantes.
  • Bloqueie a seleção de sinais . Nesse ponto, sabemos que a arquitetura do modelo pode ser dividida em duas partes principais: a unidade de extração de Recursos , responsável por extrair recursos dos dados de entrada, e o módulo de classificação , que classifica exemplos com base nos recursos recebidos. Normalmente, o bloco de extração de recursos é a parte principal do modelo. A idéia do método é usar um bloco para distinguir recursos de um modelo treinado em outro problema, fixar seus coeficientes de peso (torná-los destreinados) e, então, criar novos módulos de classificação para o problema em consideração. O módulo de classificação geralmente não é muito profundo e consiste em várias camadas totalmente conectadas, portanto esse modelo é muito mais fácil de treinar.
  • Ajuste preciso e profundo . Este método é como um cenário usando um bloco de extração de recurso. As mesmas ações são executadas, com exceção do "congelamento" do bloco de extração do recurso. Por exemplo, você pode considerar a rede VGG como um bloco de extração de recursos e "congelar" nela apenas os três primeiros (em quatro) blocos convolucionais. Nesse caso, a unidade de extração de recursos pode se adaptar melhor à tarefa atual. Para obter mais informações, consulte a postagem no blog de F. Chollet.Crie modelos poderosos de classificação de imagens usando uma quantidade muito pequena de dados .

Uma descrição detalhada dos cenários para o uso da aprendizagem indutiva pode ser encontrada nas redes neurais convolucionais do curso CS231n da Universidade de Stanford para reconhecimento visual por Fei-Fei Li e nas entradas do blog de S. Ruder A aprendizagem indutiva é a próxima fronteira em desenvolvimento aprendizado de máquina (tópicos discutidos de forma mais abrangente).

Você pode ter perguntas: por que todos esses métodos são necessários e por que eles podem funcionar? Vamos tentar responder a eles.

  • Benefícios do uso de grandes conjuntos de dados. Por exemplo, podemos usar o bloco de extração de recursos de um modelo treinado em 14 milhões de imagens contidas no conjunto de dados do concurso ImageNet . Esses modelos são complexos o suficiente para permitir a extração de recursos de alta qualidade dos dados de entrada.
  • Considerações relacionadas ao tempo. O treinamento de modelos grandes pode levar semanas ou até meses. Nesse caso, todos podem economizar uma quantidade enorme de tempo e recursos de computação .
  • Uma suposição importante subjacente à razão pela qual tudo isso pode funcionar é a seguinte: Os atributos obtidos com o treinamento em uma tarefa podem ser úteis e adequados para outra tarefa. Em outras palavras, os recursos têm a propriedade de invariância em relação ao problema. Observe que o domínio da nova tarefa deve ser semelhante ao domínio da tarefa original. Caso contrário, a unidade de extração de recursos pode até piorar os resultados.

Arquitetura de modelo aprimorada


Agora estamos familiarizados com o conceito de aprendizado indutivo. Também sabemos que o ImageNet é um evento importante, no qual quase todas as arquiteturas modernas de redes neurais convolucionais avançadas foram testadas. Vamos tentar tirar o bloco de extração de recursos de uma dessas redes.

Felizmente, a biblioteca Keras fornece vários modelos pré-treinados (através do ImageNet) que foram criados dentro desta plataforma. Importamos e usamos um desses modelos.



Nesse caso, usaremos uma rede com arquitetura VGG. Para selecionar apenas a unidade de extração do recurso, excluímos o módulo de classificação (as três principais camadas totalmente conectadas) da rede, definindo o parâmetro include_top como False . Também queremos inicializar nossa rede usando os pesos da rede treinada no ImageNet. O parâmetro final é o tamanho da entrada.

Observe que o tamanho das imagens originais no concurso ImageNet é (224, 224, 3), enquanto nossas imagens são (400, 500, 3). No entanto, usamos camadas convolucionais - isso significa que os pesos da rede são os pesos dos núcleos em movimento na operação de convolução. Juntamente com a propriedade da separação de parâmetros (uma discussão sobre isso é encontrada em nosso artigo teórico Visão geral das redes neurais convolucionais para classificar imagens ), isso leva ao fato de que o tamanho dos dados de entrada pode ser quase arbitrário, uma vez que a convolução é realizada por meio de uma janela deslizante, e essa janela pode deslizar ao longo imagem de qualquer tamanho. A única limitação é que o tamanho dos dados de entrada deve ser grande o suficiente para não colapsar em um ponto (medições espaciais) em alguma camada intermediária, porque, caso contrário, será impossível fazer cálculos adicionais.

Outro truque que usamos é o cache . VGG é uma rede muito grande. Uma passagem direta para todas as imagens (1630 exemplos) pela unidade de extração de recursos leva aproximadamente 50 segundos. No entanto, deve-se lembrar que os pesos da unidade de extração de recursos são fixos e uma passagem direta sempre fornece o mesmo resultado para a mesma imagem. Podemos usar esse fato para executar uma passagem direta pela unidade de extração de recursos apenas uma vez e depois armazenar em cache os resultados em uma matriz intermediária. Para implementar esse cenário, primeiro criamos uma instância da classe ImageDataGenerator para carregar arquivos diretamente do disco rígido (para obter mais informações, consulte o artigo base Modelo básico para reconhecer emoções nas imagens ).



No próximo estágio, usamos no modo de previsão o bloco de extração de recurso criado anteriormente como parte do modelo para obter recursos de imagem.



Demora cerca de 50 segundos. Agora, podemos usar os resultados para um treinamento muito rápido da parte de classificação superior do modelo - uma era dura cerca de 1 segundo para nós. Imagine agora que cada época dura 50 segundos a mais. Assim, essa técnica simples de cache nos permitiu acelerar o processo de treinamento em rede em 50 vezes! Nesse cenário, salvamos todos os sinais para todos os exemplos na RAM, pois seu volume é suficiente para isso. Ao usar um conjunto de dados maior, você pode calcular as propriedades, gravá-las no disco rígido e lê-las usando a mesma abordagem associada à classe do gerador.

Por fim, considere a arquitetura da parte de classificação do modelo:





Lembre-se de que, na saída do bloco de extração de recursos da rede neural convolucional, é emitido um tensor quadridimensional (exemplos, altura, largura e canais) e uma camada totalmente conectada para classificação utiliza um tensor bidimensional (exemplos, recursos). Uma maneira de transformar um tensor quadridimensional com recursos é simplesmente alinhá-lo nos três últimos eixos (usamos uma técnica semelhante no modelo base). Nesse cenário, usamos uma abordagem diferente, denominada subamostragem de valor médio global (GAP). Em vez de alinhar os vetores quadridimensionais, usaremos o valor médio com base em duas dimensões espaciais. De fato, pegamos um mapa de atributos e simplesmente medimos todos os valores nele. O método GAP foi introduzido pela primeira vez no excelente trabalho da Rede Min Lin na Internet (vale a pena conhecê-lo, pois ele discute alguns conceitos importantes - por exemplo, convoluções 1 × 1). Uma vantagem óbvia da abordagem GAP é uma redução significativa no número de parâmetros. Usando o GAP, obtemos apenas 512 recursos para cada exemplo. Ao alinhar os dados brutos, o número de recursos será 15 × 12 × 512 = 92 160. Isso pode levar a uma sobrecarga séria, pois nesse caso a parte de classificação do modelo terá cerca de 50 milhão de parâmetros! Outros elementos da parte de classificação do modelo, como camadas totalmente conectadas e camadas que implementam o método de exclusão, são discutidos em detalhes no artigo Modelo básico para reconhecer emoções em imagens .

Configurações e opções de treinamento


Depois de prepararmos a arquitetura do nosso modelo usando o Keras, você precisará configurar o modelo inteiro para treinamento usando o método de compilação.



Nesse caso, usamos configurações quase semelhantes às do modelo base, com exceção da escolha do otimizador. Para otimizar o aprendizado, a entropia cruzada binária será usada como uma função de perda e uma métrica de precisão será rastreada adicionalmente. Usamos o método Adam como um otimizador. Adam é um tipo de algoritmo estocástico de descida de gradiente com um momento e velocidade de aprendizado adaptável (para obter mais informações, consulte a entrada de blog de S. Ruder. Visão geral dos algoritmos de otimização de descida de gradiente ).

A velocidade de aprendizado é um hiperparâmetro otimizador que deve ser configurado para garantir que o modelo esteja operacional. Lembre-se de que a fórmula para a descida do gradiente "baunilha" não contém funcionalidade adicional:



Θ é o vetor de parâmetros do modelo (no nosso caso, esses são os coeficientes de ponderação da rede neural), - é a função objetivo, ∇ é o operador de gradiente (calculado usando o algoritmo de propagação de erro), α é a velocidade de aprendizado. Assim, o gradiente da função objetivo representa a direção da etapa de otimização no espaço de parâmetros e a velocidade de aprendizado é o seu tamanho. Ao usar uma velocidade de aprendizado excessivamente alta, existe a possibilidade de um escorregamento constante do ponto ideal devido ao tamanho da etapa muito grande. Por outro lado, se a velocidade de aprendizado for muito baixa, a otimização levará muito tempo e poderá garantir a convergência apenas para mínimos locais de baixa qualidade, em vez de um extremo global. Portanto, em cada situação específica, é necessário buscar um compromisso adequado. Usar as configurações padrão do algoritmo Adam é um bom ponto de partida para começar.

No entanto, nesta tarefa, as configurações padrão do Adam mostram resultados ruins. Precisamos reduzir a taxa de aprendizado inicial para 0,0001. Caso contrário, o treinamento não será capaz de garantir a convergência.

Por fim, podemos começar a aprender mais de 100 épocas e depois salvar o modelo em si e a história do aprendizado. O comando % time é um comando mágico Ipython * que permite medir o tempo de execução do código.



Classificação





Vamos avaliar a eficácia do modelo durante o treinamento. No nosso caso, a precisão da verificação é de 73% (em comparação com 55% usando o modelo base). Este resultado é muito melhor que o resultado do modelo base.

Vejamos também a distribuição de erros usando a matriz de imprecisões. Os erros são distribuídos quase uniformemente entre as classes com um leve viés em direção a exemplos negativos classificados incorretamente (célula superior esquerda da matriz de imprecisões). Isso pode ser explicado por um pequeno desequilíbrio no conjunto de dados em relação à classe positiva.

Outra métrica que rastreamos é a curva de desempenho do receptor (curva ROC) e a área sob essa curva (AUC). Para uma descrição detalhada dessas métricas, consulte o artigo Modelo básico para reconhecer emoções nas imagens .



Quanto mais próxima a curva ROC estiver do ponto superior esquerdo do gráfico e maior a área abaixo dela (métrica da AUC), melhor o classificador funcionará. Esta figura mostra claramente que um modelo aprimorado e pré-treinado mostra melhores resultados em comparação com o modelo básico criado a partir do zero. O valor da AUC para o modelo pré-treinado é 0,82, o que é um bom resultado.



Conclusão


Neste artigo, encontramos uma técnica poderosa - aprendizado indutivo. Também construímos um classificador de rede neural convolucional usando uma unidade de extração de recursos pré-treinada, baseada na arquitetura VGG. Esse classificador superou em suas características de desempenho o modelo convolucional básico, treinado a partir do zero. O aumento na precisão foi de 18% e o aumento na métrica da AUC foi de 0,25, o que demonstra um aumento muito significativo na qualidade do sistema.

Source: https://habr.com/ru/post/pt421367/


All Articles