Estou trabalhando em uma rede neural convolucional para classificação de imagens. O conjunto de dados de treinamento é muito grande para ser carregado na memória do meu computador (4 gb), além disso, também preciso tentar algum aprimoramento para equilibrar as classes.
Eu estou usando keras
. Eu olhei em muitos exemplos, mas não encontrei uma solução para o meu problema. Estou pensando em substituir os parâmetros da model.fit
chamada passando uma função ou gerador fazendo o 'lote'. Esta função será projetada para importar do disco e aplicar o aumento.
Não tenho ideia de como implementar isso. Alguma sugestão?
python
keras
training
convolution
Aprender é uma bagunça
fonte
fonte
Respostas:
Como você está trabalhando na classificação de imagens e também gostaria de implementar algum aumento de dados, você pode combinar os dois E carregar os lotes diretamente de uma pasta usando a poderosa classe 'ImageDataGenerator`.
Veja a excelente documentação!
Não copio e colo o exemplo desse link, mas posso descrever as etapas pelas quais você segue:
crie a classe do gerador:
data_gen = ImageDataGenerator()
Se você deseja que ele execute aprimoramentos dinâmicos para você, isso pode ser especificado ao criar a classe:
data_gen = ImageDataGenerator(samplewise_center=True, ...)
Se você usar processos de aumento que exigem algumas estatísticas sobre o conjunto de dados, por exemplo feature_wise normalização (não amostra-wise), você deve preparar o gerador, mostrando que alguns dos seus dados:
data_gen.fit(training_data)
. Essefit
método simplesmente pré-calcula coisas como a média e o desvio padrão, que são posteriormente usados para normalização.o gerador entra no
fit_generator
método do modelo e chamamos oflow_from_directory
método do gerador:model.fit_generator(training_data=data_gen.flow_from_directory('/path/to/folder/'), ...)
Você também pode criar um gerador separado usando o ImageDataGenerator para seus dados de validação, onde não deve aplicar o aumento, para que os testes de validação sejam feitos com dados reais, fornecendo uma imagem precisa do desempenho do modelo.
De qualquer forma, esses geradores teoricamente serão executados para sempre, gerando lotes a partir da sua pasta. Portanto, recomendo usar uma função de retorno de chamada da Keras para parar quando um determinado critério for atendido. Consulte a documentação para a classe EarlyStopping . Você também pode fazer isso manualmente, mas o Keras torna muito simples!
Se você quiser um controle refinado, poderá fazer tudo isso manualmente, carregando amostras suficientes do disco para um único lote, realizando algum aumento e executando o
model.train_on_batch()
método. Se você quiser entrar em detalhes, talvez seja melhor aprender primeiro o caminho Keras, depois progredir para seus próprios modelos detalhados, combinando o Tensorflow conforme necessário. Os dois podem ser usados muito melhor!fonte
flow_from_directory