problemas de memoria al transformar np.array utilizando to_categorical

Tengo una matriz numpy como esta:

[[0. 1. 1. ... 0. 0. 1.] [0. 0. 0. ... 0. 0. 1.] [0. 0. 1. ... 0. 0. 0.] ... [0. 0. 0. ... 0. 0. 1.] [0. 0. 0. ... 0. 0. 1.] [0. 0. 0. ... 1. 0. 1.]] 

Lo transformo así para reducir la demanda de memoria:

 x_val = x_val.astype(np.int) 

resultando en esto:

 [[0 1 1 ... 0 0 1] [0 0 0 ... 0 0 1] [0 0 1 ... 0 0 0] ... [0 0 0 ... 0 0 1] [0 0 0 ... 0 0 1] [0 0 0 ... 1 0 1]] 

Sin embargo, cuando hago esto:

 x_val = to_categorical(x_val) 

Yo obtengo:

 in to_categorical categorical = np.zeros((n, num_classes), dtype=np.float32) MemoryError 

¿Alguna idea de por qué? En última instancia, la matriz numpy contiene las tags para un problema de clasificación binaria. Hasta ahora, lo he usado como float32 como en un Keras ANN y funcionó bien y logré un rendimiento bastante bueno. Entonces, ¿es realmente necesario ejecutar to_categorical ?

No necesita usar to_categorical ya que supongo que está haciendo una clasificación de tags múltiples. Para evitar cualquier confusión de una vez por todas (!), Déjame explicarte esto.

Si está haciendo una clasificación binaria , lo que significa que cada muestra puede pertenecer a solo una de dos clases, por ejemplo, gato contra perro o feliz frente a triste o positivo, frente a negativo, entonces:

  • Las tags deben ser como [0 1 0 0 1 ... 0] con forma de (n_samples,) es decir, cada muestra tiene una etiqueta de uno (por ejemplo, cat) o cero (por ejemplo, dog).
  • La función de activación utilizada para la última capa suele ser sigmoid (o cualquier otra función que genere un valor en el rango [0,1]).
  • La función de pérdida que se usa habitualmente es binary_crossentropy .

Si está haciendo una clasificación de clases múltiples , lo que significa que cada muestra puede pertenecer a solo una de las muchas clases, por ejemplo, gato contra perro o león o feliz contra neutral frente a triste o positivo, revisión neutral frente a negativa, entonces:

  • Las tags deben estar codificadas con una sola encoding, es decir, [1, 0, 0] corresponde a cat, [0, 1, 0] corresponde a dog y [0, 0, 1] corresponde a lion, que en este caso las tags tiene una forma de (n_samples, n_classes) ; O pueden ser enteros (es decir, tags dispersas), es decir, 1 para cat, 2 para dog y 3 para lion, que en este caso tienen una forma de (n_samples,) . La función to_categorical se utiliza para convertir tags dispersas en tags codificadas de una sola vez, por supuesto, si así lo desea.
  • La función de activación utilizada suele ser softmax .
  • La función de pérdida utilizada depende del formato de las tags: si están codificadas de forma sparse_categorical_crossentropy se usa categorical_crossentropy y, si son dispersas, se usa sparse_categorical_crossentropy .

Si está realizando una clasificación de múltiples tags , lo que significa que cada muestra puede pertenecer a cero, una o más de una clase, por ejemplo, una imagen puede contener tanto perros como gatos, entonces:

  • Las tags deben ser como [[1 0 0 1 ... 0], ..., [0 0 1 0 ... 1]] con forma de (n_samples, n_classes) . Por ejemplo, una etiqueta [1 1] significa que la muestra correspondiente pertenece a ambas clases (por ejemplo, gato y perro).
  • La función de activación utilizada es sigmoid ya que, presumiblemente, cada clase es independiente de otra clase.
  • La función de pérdida utilizada es binary_crossentropy .

Ignorar el hecho de que la aplicación de to_categorical no tiene sentido en mi escenario. Lo siguiente resuelve el problema de la memoria:

 x_val = x_val.astype(np.uint8)