Sou bastante novo em redes neurais, mas entendo a álgebra linear e a matemática da convolução de maneira bastante decente.
Estou tentando entender o código de exemplo que encontro em vários locais da rede para treinar um NN convolucional Keras com dados MNIST para reconhecer dígitos. Minha expectativa seria que, ao criar uma camada convolucional, eu tivesse que especificar um filtro ou conjunto de filtros para aplicar à entrada. Mas as três amostras que encontrei criam uma camada convolucional como esta:
model.add(Convolution2D(nb_filter = 32, nb_row = 3, nb_col = 3,
border_mode='valid',
input_shape=input_shape))
Parece estar aplicando um total de 32 filtros 3x3 às imagens processadas pela CNN. Mas o que são esses filtros? Como eu os descreveria matematicamente? A documentação do keras não ajuda.
Desde já, obrigado,
Respostas:
Por padrão, os filtros são inicializados aleatoriamente usando o método, que extrai valores de uma distribuição uniforme com limites positivos e negativos descritos da seguinte forma:W W∼ U( 6neu n+ no u t, - 6neu n+ nou t) ,
glorot_uniform
onde é o número de unidades que alimentam esta unidade e é o número de unidades às quais esse resultado é alimentado.neu n no u t
Quando você está usando a rede para fazer uma previsão, esses filtros são aplicados em cada camada da rede. Ou seja, é realizada uma convolução discreta para cada filtro em cada imagem de entrada, e os resultados dessas convoluções são alimentados para a próxima camada de convoluções (ou camada totalmente conectada ou qualquer outra coisa que você possa ter).
Durante o treinamento, os valores nos filtros são otimizados com retropropagação em relação a uma função de perda. Para tarefas de classificação, como reconhecimento de dígitos, geralmente é usada a perda de entropia cruzada. Aqui está uma visualização de alguns filtros aprendidos na primeira camada (superior) e dos filtros aprendidos na segunda camada (inferior) de uma rede convolucional:
Como você pode ver, os filtros da primeira camada basicamente atuam como simples detectores de borda, enquanto os filtros da segunda camada são mais complexos. À medida que você avança em uma rede, os filtros são capazes de detectar formas mais complexas. No entanto, fica um pouco difícil de visualizar, pois esses filtros atuam em imagens que já foram convolvidas muitas vezes e provavelmente não se parecem muito com a imagem natural original.
fonte
glorot_uniform
não usa a distribuição normal. Eu acho que você está descrevendoglorot_normal
. Eu não acho que isso importe muito para a resposta - os pontos principais são a inicialização aleatória seguida pelos efeitos do treinamento. Pode valer a pena explicar como os filtros treinados acabam parecendo filtros de borda / canto etc. (talvez com uma das imagens clássicas de filtros de primeira camada antes / depois do treinamento de criação de imagens).glorot_normal
eglorot_uniform
atualizei a resposta para refletir isso. Também adicionei algumas informações extras sobre como os filtros acabam, como você sugeriu.O modelo traned treinará os kernels de acordo com a sua função de custo e, no final, esses kernels são os filtros do seu modelo.
fonte