Como lidar com imagens de tamanhos grandes na CNN?

15

Suponha que existam 10.000 imagens de tamanhos 2400 x 2400 para serem usadas na CNN. De acordo com a minha visão, os computadores convencionais que as pessoas usam serão úteis. Agora, a questão é como lidar com tamanhos de imagem tão grandes, onde não há privilégios de reduzir a amostragem.

Aqui estão os requisitos do sistema: -

Ubuntu 16.04 RAM de 64 bits 16 GB GPU 8 GB HDD 500 GB

1) Existem técnicas para lidar com imagens tão grandes que devem ser treinadas?
2) Qual tamanho de lote é razoável de usar?
3) Existem precauções a serem tomadas ou qualquer aumento e diminuição nos recursos de hardware que eu possa fazer?

WaterRocket8236
fonte

Respostas:

14

Agora, a questão é como lidar com tamanhos de imagem tão grandes, onde não há privilégios de reduzir a amostragem

Suponho que, ao reduzir a amostragem, você queira reduzir a entrada antes de passá-la para a CNN. A camada convolucional permite reduzir a amostra da imagem em uma rede, escolhendo um passo amplo, o que economiza recursos para as próximas camadas. De fato, é isso que tem que fazer, caso contrário, seu modelo não se encaixará na GPU.

1) Existem técnicas para lidar com imagens tão grandes que devem ser treinadas?

Geralmente, as pesquisas dimensionam as imagens para um tamanho razoável. Mas se isso não for uma opção para você, você precisará restringir sua CNN. Além de reduzir a amostragem nas camadas iniciais, eu recomendaria que você se livrasse da camada FC (que normalmente usa a maioria dos parâmetros) em favor da camada convolucional . Além disso, você precisará transmitir seus dados em cada época, porque eles não se encaixam na sua GPU.

Observe que nada disso impedirá uma carga computacional pesada nas camadas iniciais, exatamente porque a entrada é muito grande: a convolução é uma operação cara e as primeiras camadas executam muitas delas em cada passagem para frente e para trás. Em resumo, o treinamento será lento.

2) Qual tamanho de lote é razoável de usar?

Aqui está outro problema. Uma única imagem leva 2400x2400x3x4(3 canais e 4 bytes por pixel) que é ~ 70Mb, então você dificilmente pode comprar um tamanho de lote 10. Mais realista seria 5. 5. Observe que a maior parte da memória será obtida pelos parâmetros da CNN. Acho que, nesse caso, faz sentido reduzir o tamanho usando valores de 16 bits em vez de 32 bits - dessa forma, você poderá dobrar os lotes.

3) Existem precauções a serem tomadas ou qualquer aumento e diminuição nos recursos de hardware que eu possa fazer?

Seu gargalo é a memória da GPU. Se você puder comprar outra GPU, obtenha-a e divida a rede entre elas. Tudo o resto é insignificante em comparação com a memória da GPU.

Máxima
fonte
1
Obrigado. Eu já segui algumas das sugestões que você forneceu nesta resposta. Boa resposta.
WaterRocket8236
5

Geralmente, para imagens, o conjunto de recursos são os valores de densidade de pixels e, nesse caso, levará a um conjunto de recursos bastante grande; Além disso, a amostragem das imagens também não é recomendada, pois você pode perder (na verdade) perderá dados importantes.

[1] Mas existem algumas técnicas que podem ajudá-lo a reduzir o tamanho do conjunto de recursos, abordagens como PCA (Principle Component Analysis) ajudam na seleção de subconjuntos de recursos importantes.

Para informações detalhadas, consulte o link http://spark.apache.org/docs/latest/ml-features.html#pca .

[2] Além disso, para reduzir as despesas computacionais durante o treinamento de sua rede neural, você pode usar a descida estocástica de gradiente, em vez do uso convencional da abordagem de descida de gradiente, que reduziria o tamanho do conjunto de dados necessário para o treinamento em cada iteração. Assim, o tamanho do seu conjunto de dados a ser usado em uma iteração reduziria, reduzindo o tempo necessário para treinar a rede.

O tamanho exato do lote a ser usado depende da sua distribuição para o conjunto de dados de treinamento e teste do conjunto de dados; um uso mais geral é 70-30. Onde você também pode usar a abordagem estocástica acima mencionada para reduzir o tempo necessário.

Detalhe para descida estocástica de gradiente http://scikit-learn.org/stable/modules/sgd.html

[3] O hardware parece adequado para a atualização seria necessária; ainda assim, se necessário, procure soluções em nuvem como a AWS, onde você pode obter uma conta gratuita até um limite de uso.

Karan Chopra
fonte
Obrigado pela resposta. Atualize a resposta se tiver mais informações.
precisa saber é o seguinte
Obrigado por esse link na descida estocástica de gradiente e bem-vindo à IA!
DukeZhou
2

Dados tão grandes não podem ser carregados na sua memória. Vamos dividir o que você pode fazer em dois:

  1. Redimensione todas as suas imagens para dimensões menores. Você pode redimensioná-los para 112x112 pixels. No seu caso, como você tem uma imagem quadrada, não haverá necessidade de cortar. Você ainda não poderá carregar todas essas imagens na sua RAM com um objetivo.

  2. A melhor opção é usar uma função de gerador que irá alimentar os dados em lotes. Por favor, consulte o uso de fit_generator como usado no Keras. Se os parâmetros do seu modelo ficarem muito grandes para caber na memória da GPU, considere usar a normalização em lote ou usar um modelo Residual para reduzir o número de parâmetros.

rocksyne
fonte
3
Por que você escolheria um tamanho de 112x112 pixels? Não é potence de 2 e não um divisor de 2400.
Andi R
@AndiR. É o seguinte. Quando se trata da dimensão de entrada, é possível escolher qualquer tamanho. Isso ocorre porque, se houver alguma incompatibilidade de dimensão na rede, isso poderá ser facilmente resolvido usando o preenchimento zero. Portanto, não existe uma metodologia fixa para o tamanho da entrada. O que é preciso ter cuidado é garantir que a amostragem em excesso não afete a qualidade da entrada. Veja este documento que utiliza a dimensão 112x112. ( cv-foundation.org/openaccess/content_iccv_2015/papers/… )
rocksyne