Estou brincando um pouco com convnets. Especificamente, estou usando o conjunto de dados kaggle gatos contra cães, que consiste em 25000 imagens rotuladas como gato ou cachorro (12500 cada).
Consegui atingir cerca de 85% de precisão de classificação no meu conjunto de testes, no entanto, estabeleci uma meta de atingir 90% de precisão.
Meu principal problema é o excesso de ajustes. De alguma forma, sempre acaba acontecendo (normalmente após a época 8-10). A arquitetura da minha rede é pouco inspirada no VGG-16, mais especificamente, minhas imagens são redimensionadas para e, em seguida, corro:
Convolution 1 128x128x32 (kernel size is 3, strides is 1)
Convolution 2 128x128x32 (kernel size is 3, strides is 1)
Max pool 1 64x64x32 (kernel size is 2, strides is 2)
Convolution 3 64x64x64 (kernel size is 3, strides is 1)
Convolution 4 64x64x64 (kernel size is 3, strides is 1)
Max pool 2 32x32x64 (kernel size is 2, strides is 2)
Convolution 5 16x16x128 (kernel size is 3, strides is 1)
Convolution 6 16x16x128 (kernel size is 3, strides is 1)
Max pool 3 8x8x128 (kernel size is 2, strides is 2)
Convolution 7 8x8x256 (kernel size is 3, strides is 1)
Max pool 4 4x4x256 (kernel size is 2, strides is 2)
Convolution 8 4x4x512 (kernel size is 3, strides is 1)
Fully connected layer 1024 (dropout 0.5)
Fully connected layer 1024 (dropout 0.5)
Todas as camadas, exceto a última, têm relus como funções de ativação.
Observe que eu tentei combinações diferentes de convoluções (comecei com convoluções mais simples).
Além disso, aumentei o conjunto de dados espelhando as imagens, para que, no total, eu tivesse 50000 imagens.
Além disso, estou normalizando as imagens usando a normalização min max, onde X é a imagem
O código é escrito em tensorflow e os tamanhos de lote são 128.
Os mini-lotes de dados de treinamento acabam se ajustando demais e com precisão de 100%, enquanto os dados de validação parecem parar de aprender em torno de 84 a 85%.
Eu também tentei aumentar / diminuir a taxa de desistência.
O otimizador usado é o AdamOptimizer com uma taxa de aprendizado de 0,0001
No momento, estou jogando com esse problema nas últimas 3 semanas e 85% parecem ter colocado uma barreira na minha frente.
Para que conste, sei que poderia usar o aprendizado por transferência para obter resultados muito mais altos, mas sou interessante em construir essa rede como uma experiência de auto-aprendizado.
Atualizar:
Estou executando a mesma rede com um tamanho de lote diferente; nesse caso, estou usando um tamanho de lote muito menor (16 em vez de 128) até agora, estou atingindo uma precisão de 87,5% (em vez de 85%). Dito isto, a rede acaba se ajustando de qualquer maneira. Ainda não entendo como um abandono de 50% das unidades não está ajudando ... obviamente estou fazendo algo errado aqui. Alguma ideia?
Atualização 2:
Parece que o problema tinha a ver com o tamanho do lote, como com um tamanho menor (16 em vez de 128), agora estou alcançando uma precisão de 92,8% no meu conjunto de testes, com o tamanho menor do lote em que a rede ainda se adapta (os mini lotes acabam com uma precisão de 100%), no entanto, a perda (erro) continua diminuindo e, em geral, é mais estável. Os contras são um tempo de execução MUITO mais lento, mas vale totalmente a pena a espera.