¿Cómo manejar imágenes de gran tamaño en CNN?

15

Supongamos que hay 10K imágenes de 2400 x 2400 para usar en CNN. Según mi punto de vista, las computadoras convencionales que la gente use serán de utilidad. Ahora la pregunta es cómo manejar tamaños de imagen tan grandes donde no hay privilegios de disminución de resolución.

Aquí están los requisitos del sistema: -

Ubuntu 16.04 64-bit RAM 16 GB GPU 8 GB HDD 500 GB

1) ¿Hay alguna técnica para manejar imágenes tan grandes que se deben entrenar?
2) ¿Qué tamaño de lote es razonable de usar?
3) ¿Puedo tomar alguna precaución o aumentar o disminuir los recursos de hardware?

WaterRocket8236
fuente

Respuestas:

14

Ahora la pregunta es cómo manejar tamaños de imagen tan grandes donde no hay privilegios de disminución de resolución

Supongo que por disminución de resolución te refieres a reducir la entrada antes de pasarla a CNN. La capa convolucional permite disminuir la muestra de la imagen dentro de una red, al elegir un gran paso, lo que ahorrará recursos para las siguientes capas. De hecho, eso es lo que tiene que hacer, de lo contrario su modelo no encajará en la GPU.

1) ¿Hay alguna técnica para manejar imágenes tan grandes que se deben entrenar?

Comúnmente, las investigaciones escalan las imágenes a un tamaño razonable. Pero si esa no es una opción para usted, deberá restringir su CNN. Además de reducir el muestreo en las primeras capas, le recomendaría que elimine la capa FC (que normalmente toma la mayoría de los parámetros) a favor de la capa convolucional . También tendrá que transmitir sus datos en cada época, ya que no caben en su GPU.

Tenga en cuenta que nada de esto evitará una gran carga computacional en las primeras capas, exactamente porque la entrada es muy grande: la convolución es una operación costosa y las primeras capas realizarán muchas de ellas en cada paso hacia adelante y hacia atrás. En resumen, el entrenamiento será lento.

2) ¿Qué tamaño de lote es razonable de usar?

Aquí hay otro problema. Una sola imagen toma 2400x2400x3x4(3 canales y 4 bytes por píxel) que es ~ 70Mb, por lo que difícilmente puede permitirse ni siquiera un tamaño de lote 10. Más realista sería 5. Tenga en cuenta que la mayoría de la memoria se tomará por parámetros CNN. Creo que en este caso tiene sentido reducir el tamaño mediante el uso de valores de 16 bits en lugar de 32 bits, de esta manera podrá duplicar los lotes.

3) ¿Puedo tomar alguna precaución o aumentar o disminuir los recursos de hardware?

Su cuello de botella es la memoria de la GPU. Si puede pagar otra GPU, consígala y divida la red entre ellas. Todo lo demás es insignificante en comparación con la memoria de la GPU.

Máxima
fuente
1
Gracias. Ya seguí algunas de las sugerencias que proporcionó en esta respuesta. Buena respuesta.
WaterRocket8236
5

Por lo general, para las imágenes, el conjunto de características son los valores de densidad de píxeles y, en este caso, dará lugar a un conjunto de características bastante grande; tampoco se recomienda el muestreo descendente de las imágenes, ya que puede perder (en realidad perderá) datos importantes.

[1] Pero existen algunas técnicas que pueden ayudarlo a reducir el tamaño del conjunto de características, enfoques como PCA (Análisis de componentes principales) lo ayuda a seleccionar un subconjunto de características importantes.

Para obtener información detallada, consulte el enlace http://spark.apache.org/docs/latest/ml-features.html#pca .

[2] Aparte de eso para reducir el gasto computacional durante el entrenamiento de su red neuronal, puede usar el Descenso de gradiente estocástico, en lugar del uso convencional del enfoque de Descenso de gradiente, que reduciría el tamaño del conjunto de datos requerido para el entrenamiento en cada iteración. Por lo tanto, el tamaño de su conjunto de datos que se utilizará en una iteración se reduciría, lo que reduciría el tiempo requerido para capacitar a la red.

El tamaño de lote exacto que se utilizará depende de su distribución para el conjunto de datos de entrenamiento y el conjunto de datos de prueba, un uso más general es 70-30. Donde también puede utilizar el enfoque estocástico mencionado anteriormente para reducir el tiempo requerido.

Detalle de Descenso de gradiente estocástico http://scikit-learn.org/stable/modules/sgd.html

[3] El hardware parece apto para la actualización sería necesario, pero si es necesario, busque soluciones en la nube como AWS, donde puede obtener una suscripción gratuita a la cuenta hasta un límite de uso.

Karan Chopra
fuente
Gracias por la respuesta. Actualice la respuesta si obtiene más información.
WaterRocket8236
¡Gracias por ese enlace en Stochastic Gradient Descent, y bienvenidos a AI!
DukeZhou
2

Tales datos grandes no se pueden cargar en su memoria. Vamos a dividir lo que puedes hacer en dos:

  1. Cambie el tamaño de todas sus imágenes a dimensiones más pequeñas. Puede reescalarlos a 112x112 píxeles. En su caso, debido a que tiene una imagen cuadrada, no habrá necesidad de recortar. Aún no podrá cargar todas estas imágenes en su RAM con un objetivo.

  2. La mejor opción es usar una función de generador que alimente los datos en lotes. Consulte el uso de fit_generator como se usa en Keras. Si los parámetros de su modelo se vuelven demasiado grandes para caber en la memoria de la GPU, considere usar la normalización por lotes o usar un modelo residual para reducir su número de parámetros.

Rocksyne
fuente
3
¿Por qué elegirías un tamaño de 112x112 píxeles? No es una potencia de 2 y no un divisor de 2400.
Andi R
@AndiR. Aquí está la cosa. Cuando se trata de la dimensión de entrada, uno es libre de elegir cualquier tamaño. Esto se debe a que, si hay incompatibilidades de dimensión en la red, esto se puede resolver fácilmente con cero relleno. Por lo tanto, no existe una metodología fija para el tamaño de la entrada. De lo que hay que tener cuidado es de asegurarse de que demasiado muestreo no afecta la calidad de entrada. Eche un vistazo a este documento que utiliza la dimensión 112x112. ( cv-foundation.org/openaccess/content_iccv_2015/papers/… )
rocksyne