Como treinar dados por lote do disco?

8

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.fitchamada 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?

Aprender é uma bagunça
fonte
Você pode me mostrar como salvar esses recursos do trem e os respectivos rótulos de trem em disco, para que da próxima vez eu não precise calcular o mesmo?
Supreeth Ys 01/07/19

Respostas:

8

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:

  1. crie a classe do gerador: data_gen = ImageDataGenerator()

  2. 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, ...)

  3. 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). Esse fitmétodo simplesmente pré-calcula coisas como a média e o desvio padrão, que são posteriormente usados ​​para normalização.

  4. o gerador entra no fit_generatormétodo do modelo e chamamos o flow_from_directorymé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!

n1k31t4
fonte
Eu não entendi o terceiro passo. Você pode me dizer, na terceira etapa, training_data deve o conjunto de dados inteiro ou alguns dados do conjunto de dados?
Junaid
@ Junaid - Pode ser uma pequena parte dos dados. No entanto, é necessário calcular um valor razoável, por exemplo, a média, que é usada para todo o conjunto de dados durante o treinamento. flow_from_directory
Adicionei