¿Cuál es la forma correcta de cambiar el orden de los canales de imagen entre los canales primero y los últimos?

No puedo, por mi vida, descubrir cómo cambiar el orden de las imágenes. Las imágenes se leen en formato (x, x, 3), theano requiere que esté en formato (3, x, x). Intenté cambiar el orden con numpy.array([img[:,:,i] for i in range(3)])

que supongo que hace el trabajo, pero es feo y no puedo descubrir cómo revertirlo para recuperar la imagen original.

Para reordenar datos

Puede usar numpy.rollaxis para desplazar el eje 3 a la posición 1 (considerando que tiene el tamaño del lote como dimensión 0).

 np.rollaxis(imagesArray, 3, 1) 

Pero, si está utilizando keras, es posible que desee cambiar su configuración o definirla por capa. Theano no requiere nada de ti si estás usando Keras.

Keras se puede configurar con los canales primero o con los últimos, además de permitirle definirlo en cada capa individual, para que no tenga que cambiar sus datos.

Configurar keras

Busque el archivo keras.json y cámbielo. El archivo generalmente se instala en C:\Users\yourusername\.keras o ~/.keras dependiendo de su sistema operativo.

Cambie "image_data_format": "channels_last" a "channels_first" o viceversa, como desee.

Generalmente, trabajar con “channel_last” es menos problemático debido a una gran cantidad de otras funciones (no convolucionales) que funcionan solo en el último eje.

Definición del orden del canal en capas.

La documentación de Keras tiene toda la información sobre los parámetros para las capas, incluido el parámetro data_format .

Estoy de acuerdo con el comentario de @Qualia , np.moveaxis (a, source, destination) es más fácil de entender. Esto hace el trabajo:

 x = np.zeros((12, 12, 3)) x.shape #yields: (12, 12, 3) x = np.moveaxis(x, -1, 0) x.shape #yields: (3, 12, 12) 
 x = np.zeros((12, 12, 3)) y = np.rollaxis(x, 2, 0) y.shape (3, 12, 12)