Existem algumas variações de como normalizar as imagens, mas a maioria parece usar esses dois métodos:
- Subtraia a média por canal calculada em todas as imagens (por exemplo, VGG_ILSVRC_16_layers )
- Subtrair por pixel / canal calculado sobre todas as imagens (por exemplo , CNN_S , consulte também a rede de referência da Caffe )
Na minha opinião, a abordagem natural normalizaria cada imagem. Uma imagem tirada em plena luz do dia fará com que mais neurônios disparem do que uma imagem noturna e, embora possa nos informar sobre o tempo em que geralmente nos preocupamos com recursos mais interessantes presentes nas bordas, etc.
Pierre Sermanet refere em 3.3.3 que a normalização de contraste local que seria baseada em imagem, mas não encontrei isso em nenhum dos exemplos / tutoriais que vi. Também vi uma pergunta interessante do Quora e o post de Xiu-Shen Wei, mas eles não parecem apoiar as duas abordagens acima.
O que exatamente estou perdendo? Esse é um problema de normalização de cores ou existe um artigo que realmente explica por que tantos usam essa abordagem?
fonte
Respostas:
Subtrair a média do conjunto de dados serve para "centralizar" os dados. Além disso, você idealmente gostaria de dividir pelo sttdev desse recurso ou pixel também se quiser normalizar cada valor de recurso para um z-score.
A razão pela qual fazemos essas duas coisas é que, no processo de treinamento de nossa rede, multiplicaremos (pesos) e adicionamos (preconceitos) essas entradas iniciais, a fim de causar ativações que retropropagamos com os gradientes para treinar o modelo.
Neste processo, gostaríamos que cada recurso tivesse um intervalo semelhante, para que nossos gradientes não saíssem de controle (e que apenas precisamos de um multiplicador de taxa de aprendizado global).
Outra maneira de pensar é nas redes de aprendizado profundo que tradicionalmente compartilham muitos parâmetros - se você não dimensionasse suas entradas de uma maneira que resultasse em valores de recursos de alcance semelhante (por exemplo: em todo o conjunto de dados subtraindo a média), o compartilhamento não seria isso acontece com muita facilidade, porque uma parte do peso da imagem
w
é muito e para outra é muito pequena.Você verá em alguns modelos da CNN que o clareamento por imagem é usado, o que é mais parecido com o seu pensamento.
fonte
Antes da normalização do lote, a subtração média por canal foi usada para centralizar os dados em torno da média zero para cada canal (R, G, B). Isso normalmente ajuda a rede a aprender mais rapidamente, pois os gradientes agem de maneira uniforme para cada canal. Eu suspeito que, se você usar a normalização em lote, a etapa média de pré-processamento da subtração por canal não é realmente necessária, pois você está normalizando por mini-lote de qualquer maneira.
fonte
A normalização por imagem é comum e é até a única função incorporada atualmente no Tensorflow (principalmente devido à sua facilidade de implementação). É usado pelo motivo exato que você mencionou (dia versus noite para a mesma imagem). No entanto, se você imaginar um cenário mais ideal onde a iluminação fosse controlada, as diferenças relativas entre cada imagem seriam de grande valor no algoritmo, e não desejaríamos acabar com isso com a normalização por imagem (e desejaríamos normalize no contexto de todo o conjunto de dados de treinamento).
fonte
Isso é chamado de pré-processamento de dados antes de usá-lo. Você pode processar de várias maneiras, mas há uma condição em que você deve processar cada dado com a mesma função X_preproc = f (X) e esse f (.) Não deve depender dos próprios dados; portanto, se você usar a imagem atual, significa processar isso imagem atual, então seu f (X) será realmente f (X, imagem) e você não deseja isso.
A normalização do contraste da imagem de que você estava falando é para um propósito diferente. A normalização do contraste da imagem ajudará no recurso.
Mas f (.) Acima ajudará na otimização, mantendo todos os recursos numericamente iguais entre si (é claro, aproximadamente)
fonte